etisserant@0: #!/usr/bin/env python etisserant@0: # -*- coding: utf-8 -*- etisserant@0: etisserant@0: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor etisserant@0: #based on the plcopen standard. etisserant@0: # lbessard@58: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD etisserant@0: # etisserant@0: #See COPYING file for copyrights details. etisserant@0: # etisserant@0: #This library is free software; you can redistribute it and/or etisserant@5: #modify it under the terms of the GNU General Public etisserant@0: #License as published by the Free Software Foundation; either etisserant@0: #version 2.1 of the License, or (at your option) any later version. etisserant@0: # etisserant@0: #This library is distributed in the hope that it will be useful, etisserant@0: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU lbessard@58: #General Public License for more details. etisserant@0: # etisserant@5: #You should have received a copy of the GNU General Public etisserant@0: #License along with this library; if not, write to the Free Software etisserant@0: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: etisserant@0: from minixsv import pyxsval lbessard@27: from xml.dom import minidom lbessard@67: from types import StringType, UnicodeType etisserant@0: import cPickle etisserant@0: import os,sys,re lbessard@24: from datetime import * etisserant@0: etisserant@0: from plcopen import plcopen etisserant@0: from plcopen.structures import * etisserant@0: from graphics.GraphicCommons import * etisserant@0: from PLCGenerator import * etisserant@0: lbessard@42: duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:.[0-9]*)?)ms)?") lbessard@24: etisserant@0: [ITEM_UNEDITABLE, ITEM_PROJECT, ITEM_POU, ITEM_CLASS, ITEM_VARIABLE, lbessard@125: ITEM_TRANSITION, ITEM_ACTION, ITEM_CONFIGURATION, ITEM_RESOURCE, lbessard@125: ITEM_DATATYPE] = range(10) lbessard@125: lbessard@125: ScriptDirectory = os.path.split(os.path.realpath(__file__))[0] etisserant@0: lbessard@2: """ lbessard@2: pyxsval is not complete and the parts that are not supported print some error lbessard@2: reports. This class is used for not displaying them lbessard@2: """ lbessard@2: class HolePseudoFile: lbessard@2: """ Base class for file like objects to facilitate StdOut for the Shell.""" lbessard@2: def __init__(self, output = None): lbessard@2: if output is None: output = [] lbessard@2: self.output = output lbessard@2: lbessard@2: def writelines(self, l): lbessard@2: map(self.write, l) lbessard@2: lbessard@2: def write(self, s): lbessard@2: pass lbessard@2: lbessard@2: def flush(self): lbessard@2: pass lbessard@2: lbessard@2: def isatty(self): lbessard@2: return false lbessard@2: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Undo Buffer for PLCOpenEditor etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: # Length of the buffer etisserant@0: UNDO_BUFFER_LENGTH = 20 etisserant@0: etisserant@0: """ etisserant@0: Class implementing a buffer of changes made on the current editing Object Dictionary etisserant@0: """ etisserant@0: class UndoBuffer: etisserant@0: etisserant@0: # Constructor initialising buffer etisserant@0: def __init__(self, currentstate, issaved = False): etisserant@0: self.Buffer = [] etisserant@0: self.CurrentIndex = -1 etisserant@0: self.MinIndex = -1 etisserant@0: self.MaxIndex = -1 etisserant@0: # if current state is defined etisserant@0: if currentstate: etisserant@0: self.CurrentIndex = 0 etisserant@0: self.MinIndex = 0 etisserant@0: self.MaxIndex = 0 etisserant@0: # Initialising buffer with currentstate at the first place etisserant@0: for i in xrange(UNDO_BUFFER_LENGTH): etisserant@0: if i == 0: etisserant@0: self.Buffer.append(currentstate) etisserant@0: else: etisserant@0: self.Buffer.append(None) etisserant@0: # Initialising index of state saved etisserant@0: if issaved: etisserant@0: self.LastSave = 0 etisserant@0: else: etisserant@0: self.LastSave = -1 etisserant@0: etisserant@0: # Add a new state in buffer etisserant@0: def Buffering(self, currentstate): etisserant@0: self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH etisserant@0: self.Buffer[self.CurrentIndex] = currentstate etisserant@0: # Actualising buffer limits etisserant@0: self.MaxIndex = self.CurrentIndex etisserant@0: if self.MinIndex == self.CurrentIndex: etisserant@0: # If the removed state was the state saved, there is no state saved in the buffer etisserant@0: if self.LastSave == self.MinIndex: etisserant@0: self.LastSave = -1 etisserant@0: self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH etisserant@0: self.MinIndex = max(self.MinIndex, 0) etisserant@0: etisserant@0: # Return current state of buffer etisserant@0: def Current(self): etisserant@0: return self.Buffer[self.CurrentIndex] etisserant@0: etisserant@0: # Change current state to previous in buffer and return new current state etisserant@0: def Previous(self): etisserant@0: if self.CurrentIndex != self.MinIndex: etisserant@0: self.CurrentIndex = (self.CurrentIndex - 1) % UNDO_BUFFER_LENGTH etisserant@0: return self.Buffer[self.CurrentIndex] etisserant@0: return None etisserant@0: etisserant@0: # Change current state to next in buffer and return new current state etisserant@0: def Next(self): etisserant@0: if self.CurrentIndex != self.MaxIndex: etisserant@0: self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH etisserant@0: return self.Buffer[self.CurrentIndex] etisserant@0: return None etisserant@0: etisserant@0: # Return True if current state is the first in buffer etisserant@0: def IsFirst(self): etisserant@0: return self.CurrentIndex == self.MinIndex etisserant@0: etisserant@0: # Return True if current state is the last in buffer etisserant@0: def IsLast(self): etisserant@0: return self.CurrentIndex == self.MaxIndex etisserant@0: etisserant@0: # Note that current state is saved etisserant@0: def CurrentSaved(self): etisserant@0: self.LastSave = self.CurrentIndex etisserant@0: etisserant@0: # Return True if current state is saved etisserant@0: def IsCurrentSaved(self): etisserant@0: return self.LastSave == self.CurrentIndex etisserant@0: etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Controler for PLCOpenEditor etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: """ etisserant@0: Class which controls the operations made on the plcopen model and answers to view requests etisserant@0: """ etisserant@0: class PLCControler: etisserant@0: etisserant@0: # Create a new PLCControler etisserant@0: def __init__(self): etisserant@0: self.LastNewIndex = 0 etisserant@0: self.Reset() etisserant@0: etisserant@0: # Reset PLCControler internal variables etisserant@0: def Reset(self): lbessard@27: self.VerifyXML = False etisserant@0: self.Project = None etisserant@0: self.ProjectBuffer = None lbessard@56: self.Buffering = False etisserant@0: self.FilePath = "" etisserant@0: self.FileName = "" lbessard@42: self.ProgramFilePath = "" lbessard@125: self.RefreshDataTypeUsingTree() lbessard@125: self.RefreshDataTypes() etisserant@0: self.RefreshPouUsingTree() etisserant@0: self.RefreshBlockTypes() etisserant@0: etisserant@0: def GetQualifierTypes(self): etisserant@0: return plcopen.QualifierList etisserant@0: etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Project management functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: # Return if a project is opened etisserant@0: def HasOpenedProject(self): etisserant@0: return self.Project != None etisserant@0: etisserant@0: # Create a new project by replacing the current one etisserant@0: def CreateNewProject(self, name): etisserant@0: # Create the project etisserant@0: self.Project = plcopen.project() etisserant@0: self.Project.setName(name) lbessard@56: self.SetFilePath("") etisserant@0: # Initialize the project buffer lbessard@56: self.ProjectBuffer = UndoBuffer(self.Copy(self.Project), False) lbessard@56: self.Buffering = False etisserant@0: lbessard@125: # Return project data type names lbessard@125: def GetProjectDataTypeNames(self): lbessard@125: if self.Project: lbessard@125: return [datatype.getName() for datatype in self.Project.getDataTypes()] lbessard@125: return [] lbessard@125: etisserant@0: # Return project pou names etisserant@0: def GetProjectPouNames(self): lbessard@80: if self.Project: lbessard@80: return [pou.getName() for pou in self.Project.getPous()] lbessard@80: return [] etisserant@0: etisserant@0: # Return project pou names etisserant@0: def GetProjectConfigNames(self): lbessard@80: if self.Project: lbessard@80: return [config.getName() for config in self.Project.getConfigurations()] lbessard@80: return [] etisserant@0: lbessard@6: # Return project pou variables lbessard@6: def GetProjectPouVariables(self, pou_name=None): lbessard@6: variables = [] lbessard@6: for pou in self.Project.getPous(): lbessard@6: if not pou_name or pou_name == pou.getName(): lbessard@6: variables.extend([var["Name"] for var in self.GetPouInterfaceVars(pou)]) lbessard@70: for transition in pou.getTransitionList(): lbessard@70: variables.append(transition.getName()) lbessard@70: for action in pou.getActionList(): lbessard@70: variables.append(action.getName()) lbessard@6: return variables lbessard@6: lbessard@56: # Return if project is saved lbessard@56: def ProjectIsSaved(self): lbessard@56: return self.ProjectBuffer.IsCurrentSaved() lbessard@56: etisserant@0: # Return file path if project is an open file etisserant@0: def GetFilePath(self): etisserant@0: return self.FilePath etisserant@0: lbessard@42: # Return file path if project is an open file lbessard@42: def GetProgramFilePath(self): lbessard@42: return self.ProgramFilePath lbessard@42: etisserant@0: # Return file name and point out if file is up to date etisserant@0: def GetFilename(self): etisserant@0: if self.ProjectBuffer.IsCurrentSaved(): etisserant@0: return self.FileName etisserant@0: else: etisserant@0: return "~%s~"%self.FileName etisserant@0: etisserant@0: # Change file path and save file name or create a default one if file path not defined etisserant@0: def SetFilePath(self, filepath): etisserant@0: self.FilePath = filepath etisserant@0: if filepath == "": etisserant@0: self.LastNewIndex += 1 etisserant@0: self.FileName = "Unnamed%d"%self.LastNewIndex etisserant@0: else: etisserant@0: self.FileName = os.path.splitext(os.path.basename(filepath))[0] etisserant@0: etisserant@0: # Change project properties lbessard@56: def SetProjectProperties(self, name = None, properties = None): lbessard@56: if name != None: lbessard@56: self.Project.setName(name) lbessard@56: if properties != None: lbessard@56: self.Project.setFileHeader(properties) lbessard@56: if name != None or properties != None: lbessard@56: self.BufferProject() lbessard@56: etisserant@0: # Return project properties etisserant@0: def GetProjectProperties(self): lbessard@56: properties = self.Project.getFileHeader() lbessard@56: properties["projectName"] = self.Project.getName() lbessard@56: return properties etisserant@0: etisserant@0: # Return project informations etisserant@0: def GetProjectInfos(self): etisserant@0: if self.Project: etisserant@0: infos = {"name": self.Project.getName(), "type": ITEM_PROJECT} lbessard@125: datatypes = {"name": "Data Types", "type": ITEM_UNEDITABLE, "values":[]} lbessard@125: for datatype in self.Project.getDataTypes(): lbessard@125: datatypes["values"].append({"name": datatype.getName(), "type": ITEM_DATATYPE, "values": []}) etisserant@0: pou_types = {"function": {"name": "Functions", "type": ITEM_UNEDITABLE, "values":[]}, etisserant@0: "functionBlock": {"name": "Function Blocks", "type": ITEM_UNEDITABLE, "values":[]}, etisserant@0: "program": {"name": "Programs", "type": ITEM_UNEDITABLE, "values":[]}} etisserant@0: for pou in self.Project.getPous(): etisserant@0: pou_type = pou.getPouType().getValue() etisserant@0: pou_infos = {"name": pou.getName(), "type": ITEM_POU} etisserant@0: pou_values = [] etisserant@0: if pou.getBodyType() == "SFC": etisserant@0: transitions = [] etisserant@0: for transition in pou.getTransitionList(): etisserant@0: transitions.append({"name": transition.getName(), "type": ITEM_TRANSITION, "values": []}) etisserant@0: pou_values.append({"name": "Transitions", "type": ITEM_UNEDITABLE, "values": transitions}) etisserant@0: actions = [] etisserant@0: for action in pou.getActionList(): etisserant@0: actions.append({"name": action.getName(), "type": ITEM_ACTION, "values": []}) etisserant@0: pou_values.append({"name": "Actions", "type": ITEM_UNEDITABLE, "values": actions}) etisserant@0: if pou_type in pou_types: etisserant@0: pou_infos["values"] = pou_values etisserant@0: pou_types[pou_type]["values"].append(pou_infos) etisserant@0: configurations = {"name": "Configurations", "type": ITEM_UNEDITABLE, "values": []} etisserant@0: for config in self.Project.getConfigurations(): etisserant@0: config_name = config.getName() etisserant@0: config_infos = {"name": config_name, "type": ITEM_CONFIGURATION, "values": []} etisserant@0: resources = {"name": "Resources", "type": ITEM_UNEDITABLE, "values": []} etisserant@0: for resource in config.getResource(): etisserant@0: resource_name = resource.getName() etisserant@0: resource_infos = {"name": resource_name, "type": ITEM_RESOURCE, "values": []} etisserant@0: resources["values"].append(resource_infos) lbessard@47: config_infos["values"] = [resources] etisserant@0: configurations["values"].append(config_infos) etisserant@0: infos["values"] = [{"name": "Properties", "type": ITEM_UNEDITABLE, "values": []}, lbessard@125: datatypes, pou_types["function"], pou_types["functionBlock"], etisserant@0: pou_types["program"], configurations] etisserant@0: return infos etisserant@0: return None etisserant@0: lbessard@125: # Refresh the tree of user-defined data type cross-use lbessard@125: def RefreshDataTypeUsingTree(self): lbessard@125: # Reset the tree of user-defined pou cross-use lbessard@125: self.DataTypeUsingTree = {} lbessard@125: if self.Project: lbessard@125: datatypes = self.Project.getDataTypes() lbessard@125: # Reference all the user-defined data type names and initialize the tree of lbessard@125: # user-defined data type cross-use lbessard@125: datatypenames = [datatype.getName() for datatype in datatypes] lbessard@125: for name in datatypenames: lbessard@125: self.DataTypeUsingTree[name] = [] lbessard@125: # Analyze each data type lbessard@125: for datatype in datatypes: lbessard@125: name = datatype.getName() lbessard@125: basetype_content = datatype.getBaseType().getContent() lbessard@125: if basetype_content["value"] is not None: lbessard@125: if basetype_content["name"] == "derived": lbessard@125: basetype_name = basetype_content["value"].getName() lbessard@125: if basetype_name in datatypenames and name not in self.DataTypeUsingTree[basetype_name]: lbessard@125: self.DataTypeUsingTree[basetype_name].append(name) lbessard@125: elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned", "array"]: lbessard@125: base_type = basetype_content["value"].baseType.getContent() lbessard@125: if base_type["value"] is not None: lbessard@125: basetype_name = base_type["value"].getName() lbessard@125: if basetype_name in datatypenames and name not in self.DataTypeUsingTree[basetype_name]: lbessard@125: self.DataTypeUsingTree[basetype_name].append(name) lbessard@125: etisserant@0: # Refresh the tree of user-defined pou cross-use etisserant@0: def RefreshPouUsingTree(self): etisserant@0: # Reset the tree of user-defined pou cross-use etisserant@0: self.PouUsingTree = {} etisserant@0: if self.Project: etisserant@0: pous = self.Project.getPous() etisserant@0: # Reference all the user-defined pou names and initialize the tree of etisserant@0: # user-defined pou cross-use etisserant@0: pounames = [pou.getName() for pou in pous] etisserant@0: for name in pounames: etisserant@0: self.PouUsingTree[name] = [] etisserant@0: # Analyze each pou etisserant@0: for pou in pous: etisserant@0: name = pou.getName() lbessard@71: if pou.interface: lbessard@71: # Extract variables from every varLists lbessard@71: for type, varlist in pou.getVars(): lbessard@71: for var in varlist.getVariable(): lbessard@125: vartype_content = var.getType().getContent() lbessard@125: if vartype_content["value"] is not None: lbessard@125: typename = vartype_content["value"].getName() lbessard@71: if typename in pounames and name not in self.PouUsingTree[typename]: lbessard@71: self.PouUsingTree[typename].append(name) etisserant@0: bodytype = pou.getBodyType() etisserant@0: # If pou is written in a graphical language etisserant@0: if bodytype in ["FBD","LD","SFC"]: etisserant@0: # Analyze each instance of the pou etisserant@0: for instance in pou.getInstances(): etisserant@0: if isinstance(instance, plcopen.block): etisserant@0: typename = instance.getTypeName() etisserant@0: # Update tree if there is a cross-use etisserant@0: if typename in pounames and name not in self.PouUsingTree[typename]: etisserant@0: self.PouUsingTree[typename].append(name) etisserant@0: # If pou is written in a textual language etisserant@0: elif bodytype in ["IL", "ST"]: etisserant@0: text = pou.getText() etisserant@0: # Search if each pou is mentioned in the pou text etisserant@0: for typename in pounames: etisserant@0: typename_model = re.compile("[ \t\n]%s[ \t\n]"%typename) etisserant@0: # Update tree if there is a cross-use etisserant@0: if typename != name and typename_model.search(text): etisserant@0: self.PouUsingTree[typename].append(name) etisserant@0: lbessard@125: # Return if data type given by name is used by another data type or pou lbessard@125: def DataTypeIsUsed(self, name): lbessard@125: if name in self.DataTypeUsingTree: lbessard@125: return len(self.DataTypeUsingTree[name]) > 0 lbessard@125: return False lbessard@125: etisserant@0: # Return if pou given by name is used by another pou etisserant@0: def PouIsUsed(self, name): etisserant@0: if name in self.PouUsingTree: etisserant@0: return len(self.PouUsingTree[name]) > 0 etisserant@0: return False etisserant@0: lbessard@125: # Return if data type given by name is directly or undirectly used by the reference data type lbessard@125: def DataTypeIsUsedBy(self, name, reference): lbessard@125: if name in self.DataTypeUsingTree: lbessard@125: list = self.DataTypeUsingTree[name] lbessard@125: # Test if data type is directly used by reference lbessard@125: if reference in list: lbessard@125: return True lbessard@125: else: lbessard@125: # Test if data type is undirectly used by reference, by testing if data types lbessard@125: # that directly use data type is directly or undirectly used by reference lbessard@125: used = False lbessard@125: for element in list: lbessard@125: used |= self.DataTypeIsUsedBy(element, reference) lbessard@125: return used lbessard@125: return False lbessard@125: etisserant@0: # Return if pou given by name is directly or undirectly used by the reference pou etisserant@0: def PouIsUsedBy(self, name, reference): etisserant@0: if name in self.PouUsingTree: etisserant@0: list = self.PouUsingTree[name] etisserant@0: # Test if pou is directly used by reference etisserant@0: if reference in list: etisserant@0: return True etisserant@0: else: etisserant@0: # Test if pou is undirectly used by reference, by testing if pous etisserant@0: # that directly use pou is directly or undirectly used by reference etisserant@0: used = False etisserant@0: for element in list: etisserant@0: used |= self.PouIsUsedBy(element, reference) etisserant@0: return used etisserant@0: return False etisserant@0: lbessard@4: def GenerateProgram(self, filepath): etisserant@0: if self.Project: lbessard@97: try: lbessard@97: program = GenerateCurrentProgram(self.Project) lbessard@97: programfile = open(filepath, "w") lbessard@97: programfile.write(program) lbessard@97: programfile.close() lbessard@97: self.ProgramFilePath = filepath lbessard@97: return True lbessard@97: except: lbessard@97: pass lbessard@4: return False etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Project Pous management functions etisserant@0: #------------------------------------------------------------------------------- lbessard@125: lbessard@125: # Add a Data Type to Project lbessard@125: def ProjectAddDataType(self, datatype_name): lbessard@125: # Add the pou to project lbessard@125: self.Project.appendDataType(datatype_name) lbessard@125: self.RefreshDataTypeUsingTree() lbessard@125: self.RefreshDataTypes() lbessard@125: self.BufferProject() lbessard@125: lbessard@125: # Remove a Data Type from project lbessard@125: def ProjectRemoveDataType(self, datatype_name): lbessard@125: self.Project.removeDataType(datatype_name) lbessard@125: self.RefreshDataTypeUsingTree() lbessard@125: self.RefreshDataTypes() lbessard@125: self.BufferProject() lbessard@125: etisserant@0: # Add a Pou to Project lbessard@107: def ProjectAddPou(self, pou_name, pou_type, body_type): etisserant@0: # Add the pou to project lbessard@107: self.Project.appendPou(pou_name, pou_type, body_type) lbessard@107: if pou_type == "function": lbessard@107: self.SetPouInterfaceReturnType(pou_name, "BOOL") etisserant@0: self.RefreshPouUsingTree() etisserant@0: self.RefreshBlockTypes() lbessard@56: self.BufferProject() etisserant@0: lbessard@125: # Remove a Pou from project lbessard@107: def ProjectRemovePou(self, pou_name): lbessard@107: self.Project.removePou(pou_name) etisserant@0: self.RefreshPouUsingTree() etisserant@0: self.RefreshBlockTypes() lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Add a configuration to Project lbessard@107: def ProjectAddConfiguration(self, config_name): lbessard@107: self.Project.addConfiguration(config_name) lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Remove a configuration from project lbessard@107: def ProjectRemoveConfiguration(self, config_name): lbessard@107: self.Project.removeConfiguration(config_name) lbessard@107: self.BufferProject() lbessard@107: lbessard@107: # Add a resource to a configuration of the Project lbessard@107: def ProjectAddConfigurationResource(self, config_name, resource_name): lbessard@107: self.Project.addConfigurationResource(config_name, resource_name) lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Remove a resource from a configuration of the project lbessard@107: def ProjectRemoveConfigurationResource(self, config_name, resource_name): lbessard@107: self.Project.removeConfigurationResource(config_name, resource_name) lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Add a Transition to a Project Pou etisserant@0: def ProjectAddPouTransition(self, pou_name, transition_name, transition_type): etisserant@0: pou = self.Project.getPou(pou_name) etisserant@0: pou.addTransition(transition_name, transition_type) lbessard@56: self.BufferProject() etisserant@0: lbessard@107: # Remove a Transition from a Project Pou lbessard@107: def ProjectRemovePouTransition(self, pou_name, transition_name): lbessard@107: pou = self.Project.getPou(pou_name) lbessard@107: pou.removeTransition(transition_name) lbessard@107: self.BufferProject() lbessard@107: lbessard@107: # Add an Action to a Project Pou etisserant@0: def ProjectAddPouAction(self, pou_name, action_name, action_type): etisserant@0: pou = self.Project.getPou(pou_name) etisserant@0: pou.addAction(action_name, action_type) lbessard@56: self.BufferProject() lbessard@107: lbessard@107: # Remove an Action from a Project Pou lbessard@107: def ProjectRemovePouAction(self, pou_name, action_name): lbessard@107: # Search if the pou removed is currently opened lbessard@107: for i, element in enumerate(self.ElementsOpened): lbessard@107: words = element.split("::") lbessard@107: if words[0] == "A" and words[1] == pou_name and words[2] == action_name: lbessard@107: self.RemoveElementEditing(i) lbessard@107: pou = self.Project.getPou(pou_name) lbessard@107: pou.removeAction(action_name) lbessard@107: self.BufferProject() lbessard@125: lbessard@125: # Change the name of a pou lbessard@125: def ChangeDataTypeName(self, old_name, new_name): lbessard@125: # Found the pou corresponding to old name and change its name to new name lbessard@125: datatype = self.Project.getDataType(old_name) lbessard@125: datatype.setName(new_name) lbessard@125: self.Project.updateElementName(old_name, new_name) lbessard@125: self.BufferProject() lbessard@125: etisserant@0: # Change the name of a pou etisserant@0: def ChangePouName(self, old_name, new_name): etisserant@0: # Found the pou corresponding to old name and change its name to new name etisserant@0: pou = self.Project.getPou(old_name) etisserant@0: pou.setName(new_name) lbessard@58: self.Project.updateElementName(old_name, new_name) etisserant@0: self.RefreshPouUsingTree() etisserant@0: self.RefreshBlockTypes() lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Change the name of a pou transition etisserant@0: def ChangePouTransitionName(self, pou_name, old_name, new_name): etisserant@0: # Found the pou transition corresponding to old name and change its name to new name etisserant@0: pou = self.Project.getPou(pou_name) etisserant@0: transition = pou.getTransition(old_name) etisserant@0: transition.setName(new_name) lbessard@108: pou.updateElementName(old_name, new_name) lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Change the name of a pou action etisserant@0: def ChangePouActionName(self, pou_name, old_name, new_name): etisserant@0: # Found the pou action corresponding to old name and change its name to new name etisserant@0: pou = self.Project.getPou(pou_name) etisserant@0: action = pou.getAction(old_name) etisserant@0: action.setName(new_name) lbessard@108: pou.updateElementName(old_name, new_name) lbessard@56: self.BufferProject() lbessard@56: lbessard@80: # Change the name of a pou variable lbessard@6: def ChangePouVariableName(self, pou_name, old_name, new_name): lbessard@6: # Found the pou action corresponding to old name and change its name to new name lbessard@6: pou = self.Project.getPou(pou_name) lbessard@6: for type, varlist in pou.getVars(): lbessard@6: for var in varlist.getVariable(): lbessard@6: if var.getName() == old_name: lbessard@6: var.setName(new_name) lbessard@6: self.RefreshBlockTypes() lbessard@56: self.BufferProject() lbessard@6: etisserant@0: # Change the name of a configuration etisserant@0: def ChangeConfigurationName(self, old_name, new_name): etisserant@0: # Found the configuration corresponding to old name and change its name to new name etisserant@0: configuration = self.Project.getConfiguration(old_name) etisserant@0: configuration.setName(new_name) lbessard@56: self.BufferProject() lbessard@56: etisserant@0: # Change the name of a configuration resource etisserant@0: def ChangeConfigurationResourceName(self, config_name, old_name, new_name): etisserant@0: # Found the resource corresponding to old name and change its name to new name etisserant@0: resource = self.Project.getConfigurationResource(config_name) etisserant@0: resource.setName(new_name) lbessard@56: self.BufferProject() etisserant@0: etisserant@0: # Return the type of the pou given by its name etisserant@0: def GetPouType(self, name): etisserant@0: # Found the pou correponding to name and return its type etisserant@0: pou = self.Project.getPou(name) etisserant@0: return pou.pouType.getValue() etisserant@0: etisserant@0: # Return pous with SFC language etisserant@0: def GetSFCPous(self): etisserant@0: list = [] etisserant@0: if self.Project: etisserant@0: for pou in self.Project.getPous(): etisserant@0: if pou.getBodyType() == "SFC": etisserant@0: list.append(pou.getName()) etisserant@0: return list etisserant@0: etisserant@0: # Return the body language of the pou given by its name etisserant@0: def GetPouBodyType(self, name): etisserant@0: # Found the pou correponding to name and return its body language etisserant@0: pou = self.Project.getPou(name) etisserant@0: return pou.getBodyType() etisserant@0: lbessard@46: # Return the actions of a pou lbessard@46: def GetPouTransitions(self, pou_name): lbessard@46: transitions = [] lbessard@46: pou = self.Project.getPou(pou_name) lbessard@46: if pou.getBodyType() == "SFC": lbessard@46: for transition in pou.getTransitionList(): lbessard@46: transitions.append(transition.getName()) lbessard@46: return transitions lbessard@46: etisserant@0: # Return the body language of the transition given by its name etisserant@0: def GetTransitionBodyType(self, pou_name, pou_transition): etisserant@0: # Found the pou correponding to name and return its body language etisserant@0: pou = self.Project.getPou(pou_name) etisserant@0: transition = pou.getTransition(pou_transition) etisserant@0: return transition.getBodyType() etisserant@0: lbessard@46: # Return the actions of a pou lbessard@46: def GetPouActions(self, pou_name): lbessard@46: actions = [] lbessard@46: pou = self.Project.getPou(pou_name) lbessard@46: if pou.getBodyType() == "SFC": lbessard@46: for action in pou.getActionList(): lbessard@46: actions.append(action.getName()) lbessard@46: return actions lbessard@46: etisserant@0: # Return the body language of the pou given by its name etisserant@0: def GetActionBodyType(self, pou_name, pou_action): etisserant@0: # Found the pou correponding to name and return its body language etisserant@0: pou = self.Project.getPou(pou_name) etisserant@0: action = pou.getAction(pou_action) etisserant@0: return action.getBodyType() etisserant@0: etisserant@0: # Extract varlists from a list of vars etisserant@0: def ExtractVarLists(self, vars): etisserant@0: varlist_list = [] etisserant@0: current_varlist = None etisserant@0: current_type = None etisserant@0: for var in vars: lbessard@34: if current_type != (var["Class"], var["Retain"], var["Constant"], var["Location"] in ["", None]): lbessard@34: current_type = (var["Class"], var["Retain"], var["Constant"], var["Location"] in ["", None]) etisserant@0: current_varlist = plcopen.varList() etisserant@0: varlist_list.append((var["Class"], current_varlist)) etisserant@0: if var["Retain"] == "Yes": etisserant@0: varlist.setRetain(True) etisserant@0: if var["Constant"] == "Yes": etisserant@0: varlist.setConstant(True) etisserant@0: # Create variable and change its properties etisserant@0: tempvar = plcopen.varListPlain_variable() etisserant@0: tempvar.setName(var["Name"]) etisserant@0: var_type = plcopen.dataType() lbessard@125: if var["Type"] not in var_type.getChoices(): lbessard@67: derived_type = plcopen.derived() lbessard@67: derived_type.setName(var["Type"]) lbessard@125: var_type.setContent("derived", derived_type) lbessard@67: else: lbessard@125: var_type.setContent(var["Type"], None) etisserant@0: tempvar.setType(var_type) etisserant@0: if var["Initial Value"] != "": etisserant@0: value = plcopen.value() etisserant@0: value.setValue(var["Initial Value"]) etisserant@0: tempvar.setInitialValue(value) etisserant@0: if var["Location"] != "": etisserant@0: tempvar.setAddress(var["Location"]) lbessard@53: else: lbessard@53: tempvar.setAddress(None) etisserant@0: # Add variable to varList etisserant@0: current_varlist.appendVariable(tempvar) etisserant@0: return varlist_list etisserant@0: etisserant@0: # Replace the configuration globalvars by those given etisserant@0: def SetConfigurationGlobalVars(self, name, vars): etisserant@0: # Found the configuration corresponding to name etisserant@0: configuration = self.Project.getConfiguration(name) etisserant@0: if configuration: etisserant@0: # Set configuration global vars etisserant@0: configuration.setGlobalVars([]) etisserant@0: for vartype, varlist in self.ExtractVarLists(vars): etisserant@0: configuration.globalVars.append(varlist) etisserant@0: self.RefreshBlockTypes() lbessard@56: etisserant@0: # Return the configuration globalvars etisserant@0: def GetConfigurationGlobalVars(self, name): etisserant@0: vars = [] etisserant@0: # Found the configuration corresponding to name etisserant@0: configuration = self.Project.getConfiguration(name) etisserant@0: if configuration: etisserant@0: # Extract variables from every varLists etisserant@0: for varlist in configuration.getGlobalVars(): etisserant@0: for var in varlist.getVariable(): lbessard@67: tempvar = {"Name":var.getName(),"Class":"Global"} lbessard@125: vartype_content = var.getType().getContent() lbessard@125: if vartype_content["value"] is None: lbessard@125: tempvar["Type"] = vartype_content["name"] lbessard@67: else: lbessard@125: tempvar["Type"] = vartype_content["value"].getName() lbessard@68: tempvar["Edit"] = True etisserant@0: initial = var.getInitialValue() etisserant@0: if initial: etisserant@0: tempvar["Initial Value"] = initial.getValue() etisserant@0: else: etisserant@0: tempvar["Initial Value"] = "" lbessard@53: address = var.getAddress() lbessard@53: if address: lbessard@53: tempvar["Location"] = address lbessard@53: else: lbessard@53: tempvar["Location"] = "" etisserant@0: if varlist.getRetain(): etisserant@0: tempvar["Retain"] = "Yes" etisserant@0: else: etisserant@0: tempvar["Retain"] = "No" etisserant@0: if varlist.getConstant(): etisserant@0: tempvar["Constant"] = "Yes" etisserant@0: else: etisserant@0: tempvar["Constant"] = "No" etisserant@0: vars.append(tempvar) etisserant@0: return vars etisserant@0: etisserant@0: # Replace the resource globalvars by those given etisserant@0: def SetConfigurationResourceGlobalVars(self, config_name, name, vars): etisserant@0: # Found the resource corresponding to name etisserant@0: resource = self.Project.getConfigurationResource(config_name, name) etisserant@0: # Set resource global vars etisserant@0: if resource: etisserant@0: resource.setGlobalVars([]) etisserant@0: for vartype, varlist in self.ExtractVarLists(vars): etisserant@0: resource.globalVars.append(varlist) etisserant@0: self.RefreshBlockTypes() lbessard@56: etisserant@0: # Return the resource globalvars etisserant@0: def GetConfigurationResourceGlobalVars(self, config_name, name): etisserant@0: vars = [] etisserant@0: # Found the resource corresponding to name etisserant@0: resource = self.Project.getConfigurationResource(config_name, name) etisserant@0: if resource: etisserant@0: # Extract variables from every varLists etisserant@0: for varlist in resource.getGlobalVars(): etisserant@0: for var in varlist.getVariable(): lbessard@67: tempvar = {"Name":var.getName(),"Class":"Global"} lbessard@125: vartype_content = var.getType().getContent() lbessard@125: if vartype_content["value"] is None: lbessard@125: tempvar["Type"] = vartype_content["name"] lbessard@67: else: lbessard@125: tempvar["Type"] = vartype_content["value"].getName() lbessard@68: tempvar["Edit"] = True etisserant@0: initial = var.getInitialValue() etisserant@0: if initial: etisserant@0: tempvar["Initial Value"] = initial.getValue() etisserant@0: else: etisserant@0: tempvar["Initial Value"] = "" lbessard@53: address = var.getAddress() lbessard@53: if address: lbessard@53: tempvar["Location"] = address lbessard@53: else: lbessard@53: tempvar["Location"] = "" etisserant@0: if varlist.getRetain(): etisserant@0: tempvar["Retain"] = "Yes" etisserant@0: else: etisserant@0: tempvar["Retain"] = "No" etisserant@0: if varlist.getConstant(): etisserant@0: tempvar["Constant"] = "Yes" etisserant@0: else: etisserant@0: tempvar["Constant"] = "No" etisserant@0: vars.append(tempvar) etisserant@0: return vars etisserant@0: etisserant@0: # Return the interface of the pou given by its name etisserant@0: def GetPouInterfaceVarsByName(self, name): etisserant@0: # Found the pou correponding to name and return the interface etisserant@0: return self.GetPouInterfaceVars(self.Project.getPou(name)) etisserant@0: etisserant@0: # Return the interface for the given pou etisserant@0: def GetPouInterfaceVars(self, pou): etisserant@0: vars = [] etisserant@0: # Verify that the pou has an interface etisserant@0: if pou.interface: etisserant@0: # Extract variables from every varLists etisserant@0: for type, varlist in pou.getVars(): etisserant@0: for var in varlist.getVariable(): lbessard@67: tempvar = {"Name":var.getName(),"Class":type} lbessard@125: vartype_content = var.getType().getContent() lbessard@125: if vartype_content["value"] is None: lbessard@125: tempvar["Type"] = vartype_content["name"] lbessard@68: tempvar["Edit"] = True lbessard@67: else: lbessard@125: tempvar["Type"] = vartype_content["value"].getName() lbessard@68: tempvar["Edit"] = not pou.hasBlock(tempvar["Name"]) etisserant@0: initial = var.getInitialValue() etisserant@0: if initial: etisserant@0: tempvar["Initial Value"] = initial.getValue() etisserant@0: else: etisserant@0: tempvar["Initial Value"] = "" lbessard@53: address = var.getAddress() lbessard@53: if address: lbessard@53: tempvar["Location"] = address lbessard@53: else: lbessard@53: tempvar["Location"] = "" etisserant@0: if varlist.getRetain(): etisserant@0: tempvar["Retain"] = "Yes" etisserant@0: else: etisserant@0: tempvar["Retain"] = "No" etisserant@0: if varlist.getConstant(): etisserant@0: tempvar["Constant"] = "Yes" etisserant@0: else: etisserant@0: tempvar["Constant"] = "No" etisserant@0: vars.append(tempvar) etisserant@0: return vars etisserant@0: etisserant@0: # Replace the Pou interface by the one given etisserant@0: def SetPouInterfaceVars(self, name, vars): etisserant@0: # Found the pou corresponding to name and add interface if there isn't one yet etisserant@0: pou = self.Project.getPou(name) etisserant@0: if not pou.interface: etisserant@0: pou.interface = plcopen.pou_interface() etisserant@0: # Set Pou interface etisserant@0: pou.setVars(self.ExtractVarLists(vars)) lbessard@71: self.RefreshPouUsingTree() etisserant@0: self.RefreshBlockTypes() lbessard@56: etisserant@0: # Replace the return type of the pou given by its name (only for functions) etisserant@0: def SetPouInterfaceReturnType(self, name, type): etisserant@0: pou = self.Project.getPou(name) etisserant@0: if not pou.interface: etisserant@0: pou.interface = plcopen.pou_interface() etisserant@0: # If there isn't any return type yet, add it etisserant@0: return_type = pou.interface.getReturnType() etisserant@0: if not return_type: etisserant@0: return_type = plcopen.dataType() etisserant@0: pou.interface.setReturnType(return_type) etisserant@0: # Change return type lbessard@125: if type in self.GetBaseTypes(): lbessard@125: return_type.setContent(type, None) lbessard@125: else: lbessard@125: derived_type = plcopen.derived() lbessard@125: derived_type.setName(type) lbessard@125: return_type.setContent("derived", derived_type) etisserant@0: self.RefreshBlockTypes() lbessard@58: lbessard@58: def UpdateProjectUsedPous(self, old_name, new_name): lbessard@58: if self.Project: lbessard@58: self.Project.updateElementName(old_name, new_name) lbessard@58: lbessard@121: def UpdateEditedElementUsedVariable(self, tagname, old_name, new_name): lbessard@121: pou = self.GetEditedElement(tagname) lbessard@58: if pou: lbessard@58: pou.updateElementName(old_name, new_name) etisserant@0: etisserant@0: # Return the return type of the pou given by its name etisserant@0: def GetPouInterfaceReturnTypeByName(self, name): etisserant@0: # Found the pou correponding to name and return the return type etisserant@0: return self.GetPouInterfaceReturnType(self.Project.getPou(name)) etisserant@0: etisserant@0: # Return the return type of the given pou etisserant@0: def GetPouInterfaceReturnType(self, pou): etisserant@0: # Verify that the pou has an interface etisserant@0: if pou.interface: etisserant@0: # Return the return type if there is one etisserant@0: return_type = pou.interface.getReturnType() etisserant@0: if return_type: lbessard@125: returntype_content = return_type.getContent() lbessard@125: if returntype_content["value"] is None: lbessard@125: return returntype_content["name"] lbessard@125: else: lbessard@125: return returntype_content["value"].getName() etisserant@0: return None lbessard@125: lbessard@125: # Update data types with user-defined data types added lbessard@125: def RefreshDataTypes(self): lbessard@125: ResetTypeHierarchy() lbessard@125: ResetEnumeratedDataValues() lbessard@125: if self.Project: lbessard@125: for datatype in self.Project.getDataTypes(): lbessard@125: name = datatype.getName() lbessard@125: basetype_content = datatype.getBaseType().getContent() lbessard@125: if basetype_content["value"] is None: lbessard@125: AddDataTypeHierarchy(name, basetype_content["name"]) lbessard@125: elif basetype_content["name"] == "derived": lbessard@125: AddDataTypeHierarchy(name, basetype_content["value"].getName()) lbessard@125: elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned"]: lbessard@125: base_type = basetype_content["value"].baseType.getContent() lbessard@125: if base_type["value"] is None: lbessard@125: AddDataTypeHierarchy(name, base_type["name"]) lbessard@125: else: lbessard@125: AddDataTypeHierarchy(name, base_type["value"].getName()) lbessard@125: else: lbessard@125: if basetype_content["name"] == "enum": lbessard@125: values = [] lbessard@125: for value in basetype_content["value"].values.getValue(): lbessard@125: values.append(value.getName()) lbessard@125: AddEnumeratedDataValues(values) lbessard@125: AddDataTypeHierarchy(name, "ANY_DERIVED") lbessard@125: etisserant@0: # Update Block types with user-defined pou added etisserant@0: def RefreshBlockTypes(self): etisserant@0: if BlockTypes[-1]["name"] == "User-defined POUs": etisserant@0: BlockTypes[-1]["list"] = [] etisserant@0: else: etisserant@0: BlockTypes.append({"name" : "User-defined POUs", "list": []}) etisserant@0: if self.Project: etisserant@0: for pou in self.Project.getPous(): etisserant@0: pou_name = pou.getName() etisserant@0: pou_type = pou.pouType.getValue() etisserant@0: if pou_type != "program": etisserant@0: block_infos = {"name" : pou_name, "type" : pou_type, "extensible" : False, etisserant@81: "inputs" : [], "outputs" : [], "comment" : "", etisserant@100: "generate" : generate_block, "initialise" : initialise_block } etisserant@0: if pou.getInterface(): etisserant@0: for type, varlist in pou.getVars(): etisserant@0: if type == "InOut": etisserant@0: for var in varlist.getVariable(): lbessard@125: var_type = var.type.getContent() lbessard@125: if var_type["value"] is None: lbessard@125: block_infos["inputs"].append((var.getName(),var_type["name"],"none")) lbessard@125: block_infos["outputs"].append((var.getName(),var_type["name"],"none")) lbessard@125: else: lbessard@125: block_infos["inputs"].append((var.getName(),var_type["value"].getName(),"none")) lbessard@125: block_infos["outputs"].append((var.getName(),var_type["value"].getName(),"none")) etisserant@0: elif type == "Input": etisserant@0: for var in varlist.getVariable(): lbessard@125: var_type = var.type.getContent() lbessard@125: if var_type["value"] is None: lbessard@125: block_infos["inputs"].append((var.getName(),var_type["name"],"none")) lbessard@125: else: lbessard@125: block_infos["inputs"].append((var.getName(),var_type["value"].getName(),"none")) etisserant@0: elif type == "Output": etisserant@0: for var in varlist.getVariable(): lbessard@125: var_type = var.type.getContent() lbessard@125: if var_type["value"] is None: lbessard@125: block_infos["outputs"].append((var.getName(),var_type["name"],"none")) lbessard@125: else: lbessard@125: block_infos["outputs"].append((var.getName(),var_type["value"].getName(),"none")) etisserant@0: return_type = pou.interface.getReturnType() etisserant@0: if return_type: lbessard@125: var_type = return_type.getContent() lbessard@125: if var_type["value"] is None: lbessard@125: block_infos["outputs"].append(("",var_type["name"],"none")) lbessard@125: else: lbessard@125: block_infos["outputs"].append(("",var_type["value"].getName(),"none")) etisserant@0: if pou.getBodyType() in ["FBD","LD","SFC"]: etisserant@0: for instance in pou.getInstances(): etisserant@0: if isinstance(instance, plcopen.comment): etisserant@0: block_infos["comment"] = instance.getContentText() etisserant@0: BlockTypes[-1]["list"].append(block_infos) lbessard@92: etisserant@0: # Return Block types checking for recursion lbessard@121: def GetBlockTypes(self, tagname = ""): lbessard@125: name = "" lbessard@125: type = None lbessard@121: if self.Project: lbessard@121: words = tagname.split("::") lbessard@125: if words[0] in ["P","T","A"]: lbessard@121: name = words[1] lbessard@125: type = self.GetPouType(name) lbessard@121: if type == "function": lbessard@121: blocktypes = [] lbessard@121: for category in BlockTypes[:-1] + PluginTypes: lbessard@121: cat = {"name" : category["name"], "list" : []} lbessard@121: for block in category["list"]: lbessard@121: if block["type"] == "function": lbessard@121: cat["list"].append(block) lbessard@121: if len(cat["list"]) > 0: lbessard@121: blocktypes.append(cat) lbessard@121: else: lbessard@121: blocktypes = [category for category in BlockTypes[:-1] + PluginTypes] lbessard@121: if self.Project: lbessard@121: blocktypes.append({"name" : "User-defined POUs", "list": []}) lbessard@121: for blocktype in BlockTypes[-1]["list"]: lbessard@121: if blocktype["name"] != name and not self.PouIsUsedBy(name, blocktype["name"]) and not (type == "function" and blocktype["type"] != "function"): lbessard@121: blocktypes[-1]["list"].append(blocktype) lbessard@121: return blocktypes lbessard@121: lbessard@121: # Return Function Block types checking for recursion lbessard@121: def GetFunctionBlockTypes(self, tagname = ""): lbessard@121: name = "" lbessard@121: type = None lbessard@121: if self.Project: lbessard@121: words = tagname.split("::") lbessard@121: if words[0] in ["P","T","A"]: lbessard@125: name = words[1] lbessard@13: type = self.GetPouType(name) lbessard@121: blocktypes = [] lbessard@121: for category in BlockTypes[:-1]: lbessard@121: for block in category["list"]: lbessard@121: if block["type"] != "function": lbessard@121: blocktypes.append(block["name"]) lbessard@121: if self.Project: lbessard@121: for blocktype in BlockTypes[-1]["list"]: lbessard@121: if blocktype["name"] != name and not self.PouIsUsedBy(name, blocktype["name"]) and not (type == "function" and blocktype["type"] != "function"): lbessard@121: blocktypes.append(blocktype["name"]) lbessard@121: return blocktypes lbessard@68: etisserant@0: # Return Block types checking for recursion etisserant@0: def GetBlockResource(self): etisserant@0: blocktypes = [] etisserant@0: for category in BlockTypes[:-1]: etisserant@0: for blocktype in category["list"]: lbessard@29: if blocktype["type"] == "program": etisserant@0: blocktypes.append(blocktype["name"]) etisserant@0: if self.Project: etisserant@0: for pou in self.Project.getPous(): lbessard@29: if pou.pouType.getValue() == "program": etisserant@0: blocktypes.append(pou.getName()) etisserant@0: return blocktypes etisserant@0: lbessard@125: # Return Data Types checking for recursion lbessard@125: def GetDataTypes(self, tagname = "", basetypes = True): lbessard@125: if basetypes: lbessard@125: datatypes = self.GetBaseTypes() lbessard@125: else: lbessard@125: datatypes = [] lbessard@125: if self.Project: lbessard@125: words = tagname.split("::") lbessard@125: if words[0] in ["D"]: lbessard@125: name = words[1] lbessard@125: else: lbessard@125: name = "" lbessard@125: for datatype in self.Project.getDataTypes(): lbessard@125: datatype_name = datatype.getName() lbessard@125: if datatype_name != name and not self.DataTypeIsUsedBy(name, datatype_name): lbessard@125: datatypes.append(datatype_name) lbessard@125: return datatypes lbessard@125: lbessard@125: # Return Base Types lbessard@125: def GetBaseTypes(self): lbessard@125: return [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")] lbessard@125: lbessard@125: # Return Subrange types lbessard@125: def GetSubrangeTypes(self): lbessard@125: return [value for value, range in DataTypeRange_list] lbessard@125: lbessard@125: # Return Enumerated Values lbessard@125: def GetEnumeratedDataValues(self): lbessard@125: return EnumeratedDataValues lbessard@125: etisserant@0: #------------------------------------------------------------------------------- lbessard@121: # Project Element tag name computation functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: lbessard@125: # Compute a data type name lbessard@125: def ComputeDataTypeName(self, datatype): lbessard@125: return "D::%s" % datatype lbessard@125: lbessard@125: # Compute a pou name lbessard@80: def ComputePouName(self, pou): lbessard@80: return "P::%s" % pou lbessard@80: lbessard@80: # Compute a pou transition name etisserant@0: def ComputePouTransitionName(self, pou, transition): etisserant@0: return "T::%s::%s" % (pou, transition) etisserant@0: etisserant@0: # Compute a pou action name etisserant@0: def ComputePouActionName(self, pou, action): etisserant@0: return "A::%s::%s" % (pou, action) etisserant@0: etisserant@0: # Compute a pou name lbessard@47: def ComputeConfigurationName(self, config): lbessard@47: return "C::%s" % config lbessard@47: lbessard@47: # Compute a pou name etisserant@0: def ComputeConfigurationResourceName(self, config, resource): etisserant@0: return "R::%s::%s" % (config, resource) lbessard@125: lbessard@125: #------------------------------------------------------------------------------- lbessard@125: # Project opened Data types management functions lbessard@125: #------------------------------------------------------------------------------- lbessard@125: lbessard@125: # Return the data type informations lbessard@125: def GetDataTypeInfos(self, tagname): lbessard@125: words = tagname.split("::") lbessard@125: if words[0] == "D": lbessard@125: infos = {} lbessard@125: datatype = self.Project.getDataType(words[1]) lbessard@125: basetype_content = datatype.baseType.getContent() lbessard@125: if basetype_content["value"] is None: lbessard@125: infos["type"] = "Directly" lbessard@125: infos["base_type"] = basetype_content["name"] lbessard@125: elif basetype_content["name"] == "derived": lbessard@125: infos["type"] = "Directly" lbessard@125: infos["base_type"] = basetype_content["value"].getName() lbessard@125: elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned"]: lbessard@125: infos["type"] = "Subrange" lbessard@125: infos["min"] = basetype_content["value"].range.getLower() lbessard@125: infos["max"] = basetype_content["value"].range.getUpper() lbessard@125: base_type = basetype_content["value"].baseType.getContent() lbessard@125: if base_type["value"] is None: lbessard@125: infos["base_type"] = base_type["name"] lbessard@125: else: lbessard@125: infos["base_type"] = base_type["value"].getName() lbessard@125: elif basetype_content["name"] == "enum": lbessard@125: infos["type"] = "Enumerated" lbessard@125: infos["values"] = [] lbessard@125: for value in basetype_content["value"].values.getValue(): lbessard@125: infos["values"].append(value.getName()) lbessard@125: elif basetype_content["name"] == "array": lbessard@125: infos["type"] = "Array" lbessard@125: infos["dimensions"] = [] lbessard@125: for dimension in basetype_content["value"].getDimension(): lbessard@125: infos["dimensions"].append(str(dimension.getUpper())) lbessard@125: base_type = basetype_content["value"].baseType.getContent() lbessard@125: if base_type["value"] is None: lbessard@125: infos["base_type"] = base_type["name"] lbessard@125: else: lbessard@125: infos["base_type"] = base_type["value"].getName() lbessard@125: if datatype.initialValue is not None: lbessard@125: infos["initial"] = str(datatype.initialValue.getValue()) lbessard@125: else: lbessard@125: infos["initial"] = "" lbessard@125: return infos lbessard@125: return None lbessard@125: lbessard@125: # Change the data type informations lbessard@125: def SetDataTypeInfos(self, tagname, infos): lbessard@125: words = tagname.split("::") lbessard@125: if words[0] == "D": lbessard@125: datatype = self.Project.getDataType(words[1]) lbessard@125: if infos["type"] == "Directly": lbessard@125: if infos["base_type"] in self.GetBaseTypes(): lbessard@125: datatype.baseType.setContent(infos["base_type"], None) lbessard@125: else: lbessard@125: derived_datatype = plcopen.derived() lbessard@125: derived_datatype.setName(infos["base_type"]) lbessard@125: datatype.baseType.setContent("derived", derived_datatype) lbessard@125: elif infos["type"] == "Subrange": lbessard@125: if infos["base_type"] in GetSubTypes("ANY_UINT"): lbessard@125: subrange = plcopen.subrangeUnsigned() lbessard@125: datatype.baseType.setContent("subrangeUnsigned", subrange) lbessard@125: else: lbessard@125: subrange = plcopen.subrangeSigned() lbessard@125: datatype.baseType.setContent("subrangeSigned", subrange) lbessard@125: subrange.range.setLower(infos["min"]) lbessard@125: subrange.range.setUpper(infos["max"]) lbessard@125: if infos["base_type"] in self.GetBaseTypes(): lbessard@125: subrange.baseType.setContent(infos["base_type"], None) lbessard@125: else: lbessard@125: derived_datatype = plcopen.derived() lbessard@125: derived_datatype.setName(infos["base_type"]) lbessard@125: subrange.baseType.setContent("derived", derived_datatype) lbessard@125: elif infos["type"] == "Enumerated": lbessard@125: enumerated = plcopen.enum() lbessard@125: for enum_value in infos["values"]: lbessard@125: value = plcopen.values_value() lbessard@125: value.setName(enum_value) lbessard@125: enumerated.values.appendValue(value) lbessard@125: datatype.baseType.setContent("enum", enumerated) lbessard@125: elif infos["type"] == "Array": lbessard@125: array = plcopen.array() lbessard@125: for dimension in infos["dimensions"]: lbessard@125: dimension_range = plcopen.rangeSigned() lbessard@125: dimension_range.setLower(1) lbessard@125: dimension_range.setUpper(int(dimension)) lbessard@125: array.appendDimension(dimension_range) lbessard@125: if infos["base_type"] in self.GetBaseTypes(): lbessard@125: array.baseType.setContent(infos["base_type"], None) lbessard@125: else: lbessard@125: derived_datatype = plcopen.derived() lbessard@125: derived_datatype.setName(infos["base_type"]) lbessard@125: array.baseType.setContent("derived", derived_datatype) lbessard@125: datatype.baseType.setContent("array", array) lbessard@125: if infos["initial"] != "": lbessard@125: if datatype.initialValue is None: lbessard@125: datatype.initialValue = plcopen.value() lbessard@125: datatype.initialValue.setValue(infos["initial"]) lbessard@125: else: lbessard@125: datatype.initialValue = None lbessard@125: self.RefreshDataTypeUsingTree() lbessard@125: self.RefreshDataTypes() lbessard@125: self.BufferProject() etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Project opened Pous management functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: lbessard@121: # Return edited element lbessard@121: def GetEditedElement(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] == "P": lbessard@121: return self.Project.getPou(words[1]) lbessard@121: if words[0] in ['T', 'A']: lbessard@121: pou = self.Project.getPou(words[1]) lbessard@121: if words[0] == 'T': lbessard@121: return pou.getTransition(words[2]) lbessard@121: elif words[0] == 'A': lbessard@121: return pou.getAction(words[2]) lbessard@121: elif words[0] == 'C': lbessard@121: return self.Project.getConfiguration(words[1]) lbessard@121: elif words[0] == 'R': lbessard@121: return self.Project.getConfigurationResource(words[1], words[2]) etisserant@0: return None etisserant@0: lbessard@121: # Return edited element name lbessard@121: def GetEditedElementName(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] in ["P","C"]: lbessard@121: return words[1] lbessard@121: else: lbessard@121: return words[2] lbessard@121: return None lbessard@121: lbessard@121: # Return edited element name and type lbessard@121: def GetEditedElementType(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] in ["P","T","A"]: lbessard@121: return words[1], self.GetPouType(words[1]) lbessard@121: return None, None lbessard@121: lbessard@121: # Return language in which edited element is written lbessard@121: def GetEditedElementBodyType(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] == "P": lbessard@121: return self.GetPouBodyType(words[1]) lbessard@121: elif words[0] == 'T': lbessard@121: return self.GetTransitionBodyType(words[1], words[2]) lbessard@121: elif words[0] == 'A': lbessard@121: return self.GetActionBodyType(words[1], words[2]) lbessard@121: return None lbessard@121: lbessard@121: # Return the edited element variables lbessard@121: def GetEditedElementInterfaceVars(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] in ["P","T","A"]: lbessard@121: pou = self.Project.getPou(words[1]) lbessard@121: return self.GetPouInterfaceVars(pou) lbessard@121: return [] lbessard@121: lbessard@121: # Return the edited element return type lbessard@121: def GetEditedElementInterfaceReturnType(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] == "P": lbessard@121: pou = self.Project.getPou(words[1]) lbessard@121: return self.GetPouInterfaceReturnType(pou) lbessard@121: elif words[0] == 'T': lbessard@121: return "BOOL" lbessard@121: return None lbessard@121: lbessard@125: # Change the edited element text lbessard@121: def SetEditedElementText(self, tagname, text): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element != None: lbessard@121: element.setText(text) lbessard@121: self.RefreshPouUsingTree() lbessard@121: lbessard@121: # Return the edited element text lbessard@121: def GetEditedElementText(self, tagname): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element != None: lbessard@121: return element.getText() lbessard@121: return "" lbessard@121: lbessard@121: # Return the edited element transitions lbessard@121: def GetEditedElementTransitions(self, tagname): lbessard@121: pou = self.GetEditedElement(tagname) lbessard@121: if pou != None and pou.getBodyType() == "SFC": lbessard@121: transitions = [] lbessard@121: for transition in pou.getTransitionList(): lbessard@121: transitions.append(transition.getName()) lbessard@121: return transitions lbessard@121: return [] lbessard@121: lbessard@121: # Return edited element transitions lbessard@121: def GetEditedElementActions(self, tagname): lbessard@121: pou = self.GetEditedElement(tagname) lbessard@121: if pou != None and pou.getBodyType() == "SFC": lbessard@121: actions = [] lbessard@121: for action in pou.getActionList(): lbessard@121: actions.append(action.getName()) lbessard@121: return actions lbessard@121: return [] lbessard@121: lbessard@121: # Return the names of the pou elements lbessard@121: def GetEditedElementVariables(self, tagname): lbessard@121: words = tagname.split("::") lbessard@121: if words[0] in ["P","T","A"]: lbessard@121: return self.GetProjectPouVariables(words[1]) lbessard@121: return [] lbessard@121: lbessard@121: # Return the current pou editing informations lbessard@121: def GetEditedElementInstanceInfos(self, tagname, id = None, exclude = []): lbessard@121: infos = {} lbessard@121: instance = None lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: # if id is defined lbessard@121: if id is not None: lbessard@121: instance = element.getInstance(id) etisserant@0: else: lbessard@121: instance = element.getRandomInstance(exclude) lbessard@121: if instance is not None: lbessard@121: if id is not None: etisserant@0: infos["id"] = id etisserant@0: else: etisserant@0: infos["id"] = instance.getLocalId() etisserant@0: infos["x"] = instance.getX() etisserant@0: infos["y"] = instance.getY() etisserant@0: infos["height"] = instance.getHeight() etisserant@0: infos["width"] = instance.getWidth() etisserant@0: if isinstance(instance, plcopen.block): etisserant@0: infos["name"] = instance.getInstanceName() etisserant@0: infos["type"] = instance.getTypeName() lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["connectors"] = {"inputs":[],"outputs":[]} etisserant@0: for variable in instance.inputVariables.getVariable(): etisserant@0: connector = {} lbessard@90: connector["name"] = variable.getFormalParameter() etisserant@0: connector["position"] = variable.connectionPointIn.getRelPosition() etisserant@0: connector["negated"] = variable.getNegated() etisserant@0: connector["edge"] = variable.getConnectorEdge() etisserant@0: connector["links"] = [] etisserant@0: connections = variable.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: connector["links"].append(dic) etisserant@0: infos["connectors"]["inputs"].append(connector) etisserant@0: for variable in instance.outputVariables.getVariable(): etisserant@0: connector = {} lbessard@90: connector["name"] = variable.getFormalParameter() etisserant@0: connector["position"] = variable.connectionPointOut.getRelPosition() etisserant@0: connector["negated"] = variable.getNegated() etisserant@0: connector["edge"] = variable.getConnectorEdge() etisserant@0: infos["connectors"]["outputs"].append(connector) etisserant@0: elif isinstance(instance, plcopen.inVariable): etisserant@0: infos["name"] = instance.getExpression() lbessard@121: infos["value_type"] = self.GetEditedElementVarValueType(tagname, infos["name"]) etisserant@0: infos["type"] = "input" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["connector"] = {} etisserant@0: infos["connector"]["position"] = instance.connectionPointOut.getRelPosition() etisserant@0: infos["connector"]["negated"] = instance.getNegated() etisserant@0: infos["connector"]["edge"] = instance.getConnectorEdge() etisserant@0: elif isinstance(instance, plcopen.outVariable): etisserant@0: infos["name"] = instance.getExpression() lbessard@121: infos["value_type"] = self.GetEditedElementVarValueType(tagname, infos["name"]) etisserant@0: infos["type"] = "output" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["connector"] = {} etisserant@0: infos["connector"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connector"]["negated"] = instance.getNegated() etisserant@0: infos["connector"]["edge"] = instance.getConnectorEdge() etisserant@0: infos["connector"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connector"]["links"].append(dic) etisserant@0: elif isinstance(instance, plcopen.inOutVariable): etisserant@0: infos["name"] = instance.getExpression() lbessard@121: infos["value_type"] = self.GetEditedElementVarValueType(tagname, infos["name"]) etisserant@0: infos["type"] = "inout" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["connectors"] = {"input":{},"output":{}} etisserant@0: infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() etisserant@0: infos["connectors"]["output"]["negated"] = instance.getNegatedOut() etisserant@0: infos["connectors"]["output"]["edge"] = instance.getOutputEdge() etisserant@0: infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connectors"]["input"]["negated"] = instance.getNegatedIn() etisserant@0: infos["connectors"]["input"]["edge"] = instance.getInputEdge() etisserant@0: infos["connectors"]["input"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connectors"]["input"]["links"].append(dic) etisserant@0: elif isinstance(instance, plcopen.continuation): etisserant@0: infos["name"] = instance.getName() lbessard@45: infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) etisserant@0: infos["type"] = "continuation" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["connector"] = {} etisserant@0: infos["connector"]["position"] = instance.connectionPointOut.getRelPosition() etisserant@0: elif isinstance(instance, plcopen.connector): etisserant@0: infos["name"] = instance.getName() lbessard@45: infos["value_type"] = self.GetCurrentPouVarValueType(infos["name"]) etisserant@0: infos["type"] = "connection" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["connector"] = {} etisserant@0: infos["connector"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connector"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connector"]["links"].append(dic) etisserant@0: elif isinstance(instance, plcopen.comment): etisserant@0: infos["type"] = "comment" etisserant@0: infos["content"] = instance.getContentText() etisserant@0: elif isinstance(instance, plcopen.leftPowerRail): etisserant@0: infos["type"] = "leftPowerRail" etisserant@0: infos["connectors"] = [] etisserant@0: for connection in instance.getConnectionPointOut(): etisserant@0: connector = {} etisserant@0: connector["position"] = connection.getRelPosition() etisserant@0: infos["connectors"].append(connector) etisserant@0: elif isinstance(instance, plcopen.rightPowerRail): etisserant@0: infos["type"] = "rightPowerRail" etisserant@0: infos["connectors"] = [] etisserant@0: for connection in instance.getConnectionPointIn(): etisserant@0: connector = {} etisserant@0: connector["position"] = connection.getRelPosition() etisserant@0: connector["links"] = [] etisserant@0: for link in connection.getConnections(): lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: connector["links"].append(dic) etisserant@0: infos["connectors"].append(connector) etisserant@0: elif isinstance(instance, plcopen.contact): lbessard@118: infos["name"] = instance.getVariable() etisserant@0: infos["type"] = "contact" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["negated"] = instance.getNegated() etisserant@0: infos["edge"] = instance.getContactEdge() etisserant@0: infos["connectors"] = {"input":{},"output":{}} etisserant@0: infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connectors"]["input"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connectors"]["input"]["links"].append(dic) etisserant@0: infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() etisserant@0: elif isinstance(instance, plcopen.coil): lbessard@118: infos["name"] = instance.getVariable() etisserant@0: infos["type"] = "coil" lbessard@118: executionOrder = instance.getExecutionOrderId() lbessard@118: if executionOrder is not None: lbessard@118: infos["executionOrder"] = executionOrder lbessard@118: else: lbessard@118: infos["executionOrder"] = 0 etisserant@0: infos["negated"] = instance.getNegated() etisserant@0: infos["storage"] = instance.getCoilStorage() etisserant@0: infos["connectors"] = {"input":{},"output":{}} etisserant@0: infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connectors"]["input"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connectors"]["input"]["links"].append(dic) etisserant@0: infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() etisserant@0: elif isinstance(instance, plcopen.step): lbessard@118: infos["name"] = instance.getName() etisserant@0: infos["type"] = "step" etisserant@0: infos["initial"] = instance.getInitialStep() etisserant@0: infos["connectors"] = {} etisserant@0: if instance.connectionPointIn: etisserant@0: infos["connectors"]["input"] = {} etisserant@0: infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connectors"]["input"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connectors"]["input"]["links"].append(dic) etisserant@0: if instance.connectionPointOut: etisserant@0: infos["connectors"]["output"] = {"position" : instance.connectionPointOut.getRelPosition()} etisserant@0: if instance.connectionPointOutAction: etisserant@0: infos["connectors"]["action"] = {"position" : instance.connectionPointOutAction.getRelPosition()} etisserant@0: elif isinstance(instance, plcopen.transition): etisserant@0: infos["type"] = "transition" etisserant@0: condition = instance.getConditionContent() lbessard@80: priority = instance.getPriority() lbessard@80: if priority == None: lbessard@80: infos["priority"] = 0 lbessard@80: else: lbessard@80: infos["priority"] = priority etisserant@0: infos["condition_type"] = condition["type"] etisserant@0: infos["connectors"] = {"input":{},"output":{}} etisserant@0: infos["connectors"]["input"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connectors"]["input"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connectors"]["input"]["links"].append(dic) etisserant@0: infos["connectors"]["output"]["position"] = instance.connectionPointOut.getRelPosition() lbessard@63: if infos["condition_type"] == "connection": lbessard@63: infos["connectors"]["connection"] = {} lbessard@63: infos["connectors"]["connection"]["links"] = [] lbessard@63: connections = instance.getConnections() lbessard@63: if connections: lbessard@63: for link in connections: lbessard@63: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} lbessard@63: infos["connectors"]["connection"]["links"].append(dic) lbessard@63: infos["condition"] = None lbessard@63: else: lbessard@63: infos["condition"] = condition["value"] etisserant@0: elif isinstance(instance, (plcopen.selectionDivergence, plcopen.simultaneousDivergence)): etisserant@0: if isinstance(instance, plcopen.selectionDivergence): etisserant@0: infos["type"] = "selectionDivergence" etisserant@0: else: etisserant@0: infos["type"] = "simultaneousDivergence" etisserant@0: infos["connectors"] = {"inputs":[],"outputs":[]} etisserant@0: connector = {} etisserant@0: connector["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: connector["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: connector["links"].append(dic) etisserant@0: infos["connectors"]["inputs"].append(connector) etisserant@0: for sequence in instance.getConnectionPointOut(): etisserant@0: connector = {} etisserant@0: connector["position"] = sequence.getRelPosition() etisserant@0: infos["connectors"]["outputs"].append(connector) etisserant@0: elif isinstance(instance, (plcopen.selectionConvergence, plcopen.simultaneousConvergence)): etisserant@0: if isinstance(instance, plcopen.selectionConvergence): etisserant@0: infos["type"] = "selectionConvergence" etisserant@0: else: etisserant@0: infos["type"] = "simultaneousConvergence" etisserant@0: infos["connectors"] = {"inputs":[],"outputs":[]} etisserant@0: for sequence in instance.getConnectionPointIn(): etisserant@0: connector = {} etisserant@0: connector["position"] = sequence.getRelPosition() etisserant@0: connector["links"] = [] etisserant@0: connections = sequence.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: connector["links"].append(dic) etisserant@0: infos["connectors"]["inputs"].append(connector) etisserant@0: connector = {} etisserant@0: connector["position"] = instance.connectionPointOut.getRelPosition() etisserant@0: infos["connectors"]["outputs"].append(connector) etisserant@0: elif isinstance(instance, plcopen.jumpStep): etisserant@0: infos["type"] = "jump" etisserant@0: infos["target"] = instance.getTargetName() etisserant@0: infos["connector"] = {} etisserant@0: infos["connector"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connector"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connector"]["links"].append(dic) etisserant@0: elif isinstance(instance, plcopen.actionBlock): etisserant@0: infos["type"] = "actionBlock" etisserant@0: infos["actions"] = instance.getActions() etisserant@0: infos["connector"] = {} etisserant@0: infos["connector"]["position"] = instance.connectionPointIn.getRelPosition() etisserant@0: infos["connector"]["links"] = [] etisserant@0: connections = instance.connectionPointIn.getConnections() etisserant@0: if connections: etisserant@0: for link in connections: lbessard@27: dic = {"refLocalId":link.getRefLocalId(),"points":link.getPoints(),"formalParameter":link.getFormalParameter()} etisserant@0: infos["connector"]["links"].append(dic) etisserant@0: return infos etisserant@0: return False etisserant@0: lbessard@121: def ClearEditedElementExecutionOrder(self, tagname): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: element.resetExecutionOrder() lbessard@121: lbessard@121: def ResetEditedElementExecutionOrder(self, tagname): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: element.compileExecutionOrder() lbessard@118: etisserant@0: # Return the variable type of the given pou lbessard@121: def GetEditedElementVarValueType(self, tagname, varname): lbessard@121: words = tagname.split("::") lbessard@80: if words[0] in ["P","T","A"]: lbessard@45: pou = self.Project.getPou(words[1]) lbessard@80: for type, varlist in pou.getVars(): lbessard@80: for var in varlist.getVariable(): lbessard@80: if var.getName() == varname: lbessard@125: vartype_content = var.getType().getContent() lbessard@125: if vartype_content["value"] is None: lbessard@125: return vartype_content["name"] lbessard@125: else: lbessard@125: return vartype_content["value"].getName() etisserant@101: return None etisserant@0: etisserant@0: def SetConnectionWires(self, connection, connector): etisserant@0: wires = connector.GetWires() etisserant@0: idx = 0 etisserant@0: for wire, handle in wires: etisserant@0: points = wire.GetPoints(handle != 0) etisserant@0: if handle == 0: lbessard@27: result = wire.GetConnectedInfos(-1) etisserant@0: else: lbessard@27: result = wire.GetConnectedInfos(0) lbessard@27: if result != None: lbessard@27: refLocalId, formalParameter = result etisserant@0: connection.addConnection() etisserant@0: connection.setConnectionId(idx, refLocalId) etisserant@0: connection.setConnectionPoints(idx, points) lbessard@27: if formalParameter != "": lbessard@27: connection.setConnectionParameter(idx, formalParameter) lbessard@27: else: lbessard@27: connection.setConnectionParameter(idx, None) etisserant@0: idx += 1 etisserant@0: lbessard@121: def AddEditedElementBlock(self, tagname, id, blocktype, blockname = None): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: block = plcopen.block() lbessard@121: block.setLocalId(id) lbessard@121: block.setTypeName(blocktype) lbessard@121: blocktype_infos = GetBlockType(blocktype) lbessard@121: if blocktype_infos["type"] != "function" and blockname is not None: lbessard@121: block.setInstanceName(blockname) lbessard@121: element.addPouVar(blocktype, blockname) lbessard@121: element.addInstance("block", block) lbessard@121: self.RefreshPouUsingTree() lbessard@121: lbessard@121: def SetEditedElementBlockInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: block = element.getInstance(id) lbessard@121: if "name" in infos or "type" in infos: lbessard@121: old_name = block.getInstanceName() lbessard@121: old_type = block.getTypeName() lbessard@121: new_name = infos.get("name", old_name) lbessard@121: new_type = infos.get("type", old_type) lbessard@121: self.GetEditedElement(tagname).changePouVar(old_type, old_name, new_type, new_name) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "name": lbessard@121: block.setInstanceName(value) lbessard@121: elif param == "type": lbessard@121: block.setTypeName(value) lbessard@121: elif param == "executionOrder" and block.getExecutionOrderId() != value: lbessard@121: self.GetEditedElement(tagname).setElementExecutionOrder(block, value) lbessard@121: elif param == "height": lbessard@121: block.setHeight(value) lbessard@121: elif param == "width": lbessard@121: block.setWidth(value) lbessard@121: elif param == "x": lbessard@121: block.setX(value) lbessard@121: elif param == "y": lbessard@121: block.setY(value) lbessard@121: elif param == "connectors": lbessard@121: block.inputVariables.setVariable([]) lbessard@121: block.outputVariables.setVariable([]) lbessard@121: for connector in value["inputs"]: lbessard@121: variable = plcopen.inputVariables_variable() lbessard@121: variable.setFormalParameter(connector.GetName()) lbessard@121: if connector.IsNegated(): lbessard@121: variable.setNegated(True) lbessard@121: if connector.GetEdge() != "none": lbessard@121: variable.setConnectorEdge(connector.GetEdge()) lbessard@121: position = connector.GetRelPosition() lbessard@121: variable.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(variable.connectionPointIn, connector) lbessard@121: block.inputVariables.appendVariable(variable) lbessard@121: for connector in value["outputs"]: lbessard@121: variable = plcopen.outputVariables_variable() lbessard@121: variable.setFormalParameter(connector.GetName()) lbessard@121: if connector.IsNegated(): lbessard@121: variable.setNegated(True) lbessard@121: if connector.GetEdge() != "none": lbessard@121: variable.setConnectorEdge(connector.GetEdge()) lbessard@121: position = connector.GetRelPosition() lbessard@121: variable.addConnectionPointOut() lbessard@121: variable.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: block.outputVariables.appendVariable(variable) lbessard@121: self.RefreshPouUsingTree() etisserant@0: lbessard@121: def AddEditedElementVariable(self, tagname, id, type): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: if type == INPUT: lbessard@121: name = "inVariable" lbessard@121: variable = plcopen.inVariable() lbessard@121: elif type == OUTPUT: lbessard@121: name = "outVariable" lbessard@121: variable = plcopen.outVariable() lbessard@121: elif type == INOUT: lbessard@121: name = "inOutVariable" lbessard@121: variable = plcopen.inOutVariable() lbessard@121: variable.setLocalId(id) lbessard@121: element.addInstance(name, variable) etisserant@0: lbessard@121: def SetEditedElementVariableInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: variable = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "name": lbessard@121: variable.setExpression(value) lbessard@121: elif param == "executionOrder" and variable.getExecutionOrderId() != value: lbessard@121: self.GetEditedElement(tagname).setElementExecutionOrder(variable, value) lbessard@121: elif param == "height": lbessard@121: variable.setHeight(value) lbessard@121: elif param == "width": lbessard@121: variable.setWidth(value) lbessard@121: elif param == "x": lbessard@121: variable.setX(value) lbessard@121: elif param == "y": lbessard@121: variable.setY(value) lbessard@121: elif param == "connectors": lbessard@121: if isinstance(variable, plcopen.inVariable): lbessard@121: if value["output"].IsNegated(): lbessard@121: variable.setNegated(True) lbessard@121: if value["output"].GetEdge() != "none": lbessard@121: variable.setConnectorEdge(value["output"].GetEdge()) lbessard@121: position = value["output"].GetRelPosition() lbessard@121: variable.addConnectionPointOut() lbessard@121: variable.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: elif isinstance(variable, plcopen.outVariable): lbessard@121: if value["input"].IsNegated(): lbessard@121: variable.setNegated(True) lbessard@121: if value["input"].GetEdge() != "none": lbessard@121: variable.setConnectorEdge(value["input"].GetEdge()) lbessard@121: position = value["input"].GetRelPosition() lbessard@121: variable.addConnectionPointIn() lbessard@121: variable.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(variable.connectionPointIn, value["input"]) lbessard@121: elif isinstance(variable, plcopen.inOutVariable): lbessard@121: if value["input"].IsNegated(): lbessard@121: variable.setNegatedIn(True) lbessard@121: if value["input"].GetEdge() != "none": lbessard@121: variable.setInputEdge(value["input"].GetEdge()) lbessard@121: if value["output"].IsNegated(): lbessard@121: variable.setNegatedOut(True) lbessard@121: if value["output"].GetEdge() != "none": lbessard@121: variable.setOutputEdge(value["output"].GetEdge()) lbessard@121: position = value["output"].GetRelPosition() lbessard@121: variable.addConnectionPointOut() lbessard@121: variable.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: position = value["input"].GetRelPosition() lbessard@121: variable.addConnectionPointIn() lbessard@121: variable.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(variable.connectionPointIn, value["input"]) lbessard@121: lbessard@121: def AddEditedElementConnection(self, tagname, id, type): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: if type == CONNECTOR: lbessard@121: name = "connector" lbessard@121: connection = plcopen.connector() lbessard@121: elif type == CONTINUATION: lbessard@121: name = "continuation" lbessard@121: connection = plcopen.continuation() lbessard@121: connection.setLocalId(id) lbessard@121: element.addInstance(name, connection) etisserant@0: lbessard@121: def SetEditedElementConnectionInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: connection = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "name": lbessard@121: connection.setName(value) lbessard@121: elif param == "height": lbessard@121: connection.setHeight(value) lbessard@121: elif param == "width": lbessard@121: connection.setWidth(value) lbessard@121: elif param == "x": lbessard@121: connection.setX(value) lbessard@121: elif param == "y": lbessard@121: connection.setY(value) lbessard@121: elif param == "connector": lbessard@121: position = value.GetRelPosition() lbessard@121: if isinstance(connection, plcopen.continuation): lbessard@121: connection.addConnectionPointOut() lbessard@121: connection.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: elif isinstance(connection, plcopen.connector): lbessard@121: connection.addConnectionPointIn() lbessard@121: connection.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(connection.connectionPointIn, value) lbessard@121: lbessard@121: def AddEditedElementComment(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: comment = plcopen.comment() lbessard@121: comment.setLocalId(id) lbessard@121: element.addInstance("comment", comment) lbessard@121: lbessard@121: def SetEditedElementCommentInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: comment = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "content": lbessard@121: comment.setContentText(value) lbessard@121: elif param == "height": lbessard@121: comment.setHeight(value) lbessard@121: elif param == "width": lbessard@121: comment.setWidth(value) lbessard@121: elif param == "x": lbessard@121: comment.setX(value) lbessard@121: elif param == "y": lbessard@121: comment.setY(value) lbessard@121: lbessard@121: def AddEditedElementPowerRail(self, tagname, id, type): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: if type == LEFTRAIL: lbessard@121: name = "leftPowerRail" lbessard@121: powerrail = plcopen.leftPowerRail() lbessard@121: elif type == RIGHTRAIL: lbessard@121: name = "rightPowerRail" lbessard@121: powerrail = plcopen.rightPowerRail() lbessard@121: powerrail.setLocalId(id) lbessard@121: element.addInstance(name, powerrail) lbessard@121: lbessard@121: def SetEditedElementPowerRailInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: powerrail = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "height": lbessard@121: powerrail.setHeight(value) lbessard@121: elif param == "width": lbessard@121: powerrail.setWidth(value) lbessard@121: elif param == "x": lbessard@121: powerrail.setX(value) lbessard@121: elif param == "y": lbessard@121: powerrail.setY(value) lbessard@121: elif param == "connectors": lbessard@121: if isinstance(powerrail, plcopen.leftPowerRail): lbessard@121: powerrail.setConnectionPointOut([]) lbessard@121: for connector in value: lbessard@121: position = connector.GetRelPosition() lbessard@121: connection = plcopen.leftPowerRail_connectionPointOut() lbessard@121: connection.setRelPosition(position.x, position.y) lbessard@121: powerrail.connectionPointOut.append(connection) lbessard@121: elif isinstance(powerrail, plcopen.rightPowerRail): lbessard@121: powerrail.setConnectionPointIn([]) lbessard@121: for connector in value: lbessard@121: position = connector.GetRelPosition() lbessard@121: connection = plcopen.connectionPointIn() lbessard@121: connection.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(connection, connector) lbessard@121: powerrail.connectionPointIn.append(connection) lbessard@121: lbessard@128: def AddEditedElementContact(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: contact = plcopen.contact() lbessard@121: contact.setLocalId(id) lbessard@121: element.addInstance("contact", contact) lbessard@121: lbessard@121: def SetEditedElementContactInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: contact = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "name": lbessard@121: contact.setVariable(value) lbessard@121: elif param == "type": lbessard@121: if value == CONTACT_NORMAL: lbessard@121: contact.setNegated(False) lbessard@121: contact.setContactEdge("none") lbessard@121: elif value == CONTACT_REVERSE: lbessard@121: contact.setNegated(True) lbessard@121: contact.setContactEdge("none") lbessard@121: elif value == CONTACT_RISING: lbessard@121: contact.setNegated(False) lbessard@121: contact.setContactEdge("rising") lbessard@121: elif value == CONTACT_FALLING: lbessard@121: contact.setNegated(False) lbessard@121: contact.setContactEdge("falling") lbessard@121: elif param == "height": lbessard@121: contact.setHeight(value) lbessard@121: elif param == "width": lbessard@121: contact.setWidth(value) lbessard@121: elif param == "x": lbessard@121: contact.setX(value) lbessard@121: elif param == "y": lbessard@121: contact.setY(value) lbessard@121: elif param == "connectors": lbessard@121: input_connector = value["input"] etisserant@0: position = input_connector.GetRelPosition() lbessard@121: contact.addConnectionPointIn() lbessard@121: contact.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(contact.connectionPointIn, input_connector) lbessard@121: output_connector = value["output"] etisserant@0: position = output_connector.GetRelPosition() lbessard@121: contact.addConnectionPointOut() lbessard@121: contact.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: lbessard@121: def AddEditedElementCoil(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: coil = plcopen.coil() lbessard@121: coil.setLocalId(id) lbessard@121: element.addInstance("coil", coil) lbessard@121: lbessard@121: def SetEditedElementCoilInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: coil = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "name": lbessard@121: coil.setVariable(value) lbessard@121: elif param == "type": lbessard@121: if value == COIL_NORMAL: lbessard@121: coil.setNegated(False) lbessard@121: coil.setCoilStorage("none") lbessard@121: elif value == COIL_REVERSE: lbessard@121: coil.setNegated(True) lbessard@121: coil.setCoilStorage("none") lbessard@121: elif value == COIL_SET: lbessard@121: coil.setNegated(False) lbessard@121: coil.setCoilStorage("set") lbessard@121: elif value == COIL_RESET: lbessard@121: coil.setNegated(False) lbessard@121: coil.setCoilStorage("reset") lbessard@121: elif param == "height": lbessard@121: coil.setHeight(value) lbessard@121: elif param == "width": lbessard@121: coil.setWidth(value) lbessard@121: elif param == "x": lbessard@121: coil.setX(value) lbessard@121: elif param == "y": lbessard@121: coil.setY(value) lbessard@121: elif param == "connectors": lbessard@121: input_connector = value["input"] lbessard@121: position = input_connector.GetRelPosition() lbessard@121: coil.addConnectionPointIn() lbessard@121: coil.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(coil.connectionPointIn, input_connector) lbessard@121: output_connector = value["output"] lbessard@121: position = output_connector.GetRelPosition() lbessard@121: coil.addConnectionPointOut() lbessard@121: coil.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: lbessard@121: def AddEditedElementStep(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: step = plcopen.step() lbessard@121: step.setLocalId(id) lbessard@121: element.addInstance("step", step) lbessard@121: lbessard@121: def SetEditedElementStepInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: step = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "name": lbessard@121: step.setName(value) lbessard@121: elif param == "initial": lbessard@121: step.setInitialStep(value) lbessard@121: elif param == "height": lbessard@121: step.setHeight(value) lbessard@121: elif param == "width": lbessard@121: step.setWidth(value) lbessard@121: elif param == "x": lbessard@121: step.setX(value) lbessard@121: elif param == "y": lbessard@121: step.setY(value) lbessard@121: elif param == "connectors": lbessard@121: input_connector = value["input"] lbessard@121: if input_connector: etisserant@0: position = input_connector.GetRelPosition() lbessard@121: step.addConnectionPointIn() lbessard@121: step.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(step.connectionPointIn, input_connector) lbessard@121: else: lbessard@121: step.deleteConnectionPointIn() lbessard@121: output_connector = value["output"] lbessard@121: if output_connector: etisserant@0: position = output_connector.GetRelPosition() lbessard@121: step.addConnectionPointOut() lbessard@121: step.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: else: lbessard@121: step.deleteConnectionPointOut() lbessard@121: action_connector = value["action"] lbessard@121: if action_connector: lbessard@121: position = action_connector.GetRelPosition() lbessard@121: step.addConnectionPointOutAction() lbessard@121: step.connectionPointOutAction.setRelPosition(position.x, position.y) lbessard@121: else: lbessard@121: step.deleteConnectionPointOutAction() lbessard@121: lbessard@121: def AddEditedElementTransition(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: transition = plcopen.transition() lbessard@121: transition.setLocalId(id) lbessard@121: element.addInstance("transition", transition) lbessard@121: lbessard@121: def SetEditedElementTransitionInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: transition = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "type" and value != "connection": lbessard@121: transition.setConditionContent(value, infos["condition"]) lbessard@121: elif param == "height": lbessard@121: transition.setHeight(value) lbessard@121: elif param == "width": lbessard@121: transition.setWidth(value) lbessard@121: elif param == "x": lbessard@121: transition.setX(value) lbessard@121: elif param == "y": lbessard@121: transition.setY(value) lbessard@121: elif param == "priority": lbessard@121: if value != 0: lbessard@121: transition.setPriority(value) lbessard@121: else: lbessard@121: transition.setPriority(None) lbessard@121: elif param == "connectors": lbessard@121: input_connector = value["input"] lbessard@121: position = input_connector.GetRelPosition() lbessard@121: transition.addConnectionPointIn() lbessard@121: transition.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(transition.connectionPointIn, input_connector) lbessard@121: output_connector = value["output"] lbessard@121: position = output_connector.GetRelPosition() lbessard@121: transition.addConnectionPointOut() lbessard@121: transition.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: if infos.get("type", None) == "connection": lbessard@121: transition.setConditionContent("connection", None) lbessard@121: connection_connector = value["connection"] lbessard@121: self.SetConnectionWires(transition, connection_connector) lbessard@121: lbessard@121: def AddEditedElementDivergence(self, tagname, id, type): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: if type == SELECTION_DIVERGENCE: lbessard@121: name = "selectionDivergence" lbessard@121: divergence = plcopen.selectionDivergence() lbessard@121: elif type == SELECTION_CONVERGENCE: lbessard@121: name = "selectionConvergence" lbessard@121: divergence = plcopen.selectionConvergence() lbessard@121: elif type == SIMULTANEOUS_DIVERGENCE: lbessard@121: name = "simultaneousDivergence" lbessard@121: divergence = plcopen.simultaneousDivergence() lbessard@121: elif type == SIMULTANEOUS_CONVERGENCE: lbessard@121: name = "simultaneousConvergence" lbessard@121: divergence = plcopen.simultaneousConvergence() lbessard@121: divergence.setLocalId(id) lbessard@121: element.addInstance(name, divergence) lbessard@121: lbessard@121: def SetEditedElementDivergenceInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: divergence = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "height": lbessard@121: divergence.setHeight(value) lbessard@121: elif param == "width": lbessard@121: divergence.setWidth(value) lbessard@121: elif param == "x": lbessard@121: divergence.setX(value) lbessard@121: elif param == "y": lbessard@121: divergence.setY(value) lbessard@121: elif param == "connectors": lbessard@121: input_connectors = value["inputs"] lbessard@121: if isinstance(divergence, (plcopen.selectionDivergence, plcopen.simultaneousDivergence)): lbessard@121: position = input_connectors[0].GetRelPosition() lbessard@121: divergence.addConnectionPointIn() lbessard@121: divergence.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(divergence.connectionPointIn, input_connectors[0]) lbessard@121: else: lbessard@121: divergence.setConnectionPointIn([]) lbessard@121: for input_connector in input_connectors: lbessard@121: position = input_connector.GetRelPosition() lbessard@121: if isinstance(divergence, plcopen.selectionConvergence): lbessard@121: connection = plcopen.selectionConvergence_connectionPointIn() lbessard@121: else: lbessard@121: connection = plcopen.connectionPointIn() lbessard@121: connection.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(connection, input_connector) lbessard@121: divergence.appendConnectionPointIn(connection) lbessard@121: output_connectors = value["outputs"] lbessard@121: if isinstance(divergence, (plcopen.selectionConvergence, plcopen.simultaneousConvergence)): lbessard@121: position = output_connectors[0].GetRelPosition() lbessard@121: divergence.addConnectionPointOut() lbessard@121: divergence.connectionPointOut.setRelPosition(position.x, position.y) lbessard@121: else: lbessard@121: divergence.setConnectionPointOut([]) lbessard@121: for output_connector in output_connectors: lbessard@121: position = output_connector.GetRelPosition() lbessard@121: if isinstance(divergence, plcopen.selectionDivergence): lbessard@121: connection = plcopen.selectionDivergence_connectionPointOut() lbessard@121: else: lbessard@121: connection = plcopen.simultaneousDivergence_connectionPointOut() lbessard@121: connection.setRelPosition(position.x, position.y) lbessard@121: divergence.appendConnectionPointOut(connection) lbessard@121: lbessard@121: def AddEditedElementJump(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: jump = plcopen.jumpStep() lbessard@121: jump.setLocalId(id) lbessard@121: element.addInstance("jumpStep", jump) lbessard@121: lbessard@121: def SetEditedElementJumpInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: jump = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "target": lbessard@121: jump.setTargetName(value) lbessard@121: elif param == "height": lbessard@121: jump.setHeight(value) lbessard@121: elif param == "width": lbessard@121: jump.setWidth(value) lbessard@121: elif param == "x": lbessard@121: jump.setX(value) lbessard@121: elif param == "y": lbessard@121: jump.setY(value) lbessard@121: elif param == "connector": lbessard@121: position = value.GetRelPosition() lbessard@121: jump.addConnectionPointIn() lbessard@121: jump.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(jump.connectionPointIn, value) etisserant@0: lbessard@121: def AddEditedElementActionBlock(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: actionBlock = plcopen.actionBlock() lbessard@121: actionBlock.setLocalId(id) lbessard@121: element.addInstance("actionBlock", actionBlock) lbessard@121: lbessard@121: def SetEditedElementActionBlockInfos(self, tagname, id, infos): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: actionBlock = element.getInstance(id) lbessard@121: for param, value in infos.items(): lbessard@121: if param == "actions": lbessard@121: actionBlock.setActions(value) lbessard@121: elif param == "height": lbessard@121: actionBlock.setHeight(value) lbessard@121: elif param == "width": lbessard@121: actionBlock.setWidth(value) lbessard@121: elif param == "x": lbessard@121: actionBlock.setX(value) lbessard@121: elif param == "y": lbessard@121: actionBlock.setY(value) lbessard@121: elif param == "connector": lbessard@121: position = value.GetRelPosition() lbessard@121: actionBlock.addConnectionPointIn() lbessard@121: actionBlock.connectionPointIn.setRelPosition(position.x, position.y) lbessard@121: self.SetConnectionWires(actionBlock.connectionPointIn, value) lbessard@121: lbessard@121: def RemoveEditedElementInstance(self, tagname, id): lbessard@121: element = self.GetEditedElement(tagname) lbessard@121: if element is not None: lbessard@121: instance = element.getInstance(id) lbessard@121: if isinstance(instance, plcopen.block): lbessard@121: blocktype = instance.getTypeName() lbessard@121: element.removePouVar(blocktype, instance.getInstanceName()) lbessard@121: element.removeInstance(id) lbessard@121: self.RefreshPouUsingTree() lbessard@121: lbessard@121: def GetEditedResourceVariables(self, tagname): etisserant@0: varlist = [] lbessard@121: words = tagname.split("::") etisserant@0: for var in self.GetConfigurationGlobalVars(words[1]): etisserant@0: if var["Type"] == "BOOL": etisserant@0: varlist.append(var["Name"]) etisserant@0: for var in self.GetConfigurationResourceGlobalVars(words[1], words[2]): etisserant@0: if var["Type"] == "BOOL": etisserant@0: varlist.append(var["Name"]) etisserant@0: return varlist etisserant@0: lbessard@121: def SetEditedResourceInfos(self, tasks, instances): lbessard@121: resource = self.GetEditedElement(tagname) lbessard@121: if resource is not None: lbessard@121: resource.setTask([]) lbessard@121: resource.setPouInstance([]) lbessard@121: task_list = {} lbessard@121: for task in tasks: lbessard@121: new_task = plcopen.resource_task() lbessard@121: new_task.setName(task["Name"]) lbessard@121: if task["Single"] != "": lbessard@121: new_task.setSingle(task["Single"]) lbessard@121: result = duration_model.match(task["Interval"]).groups() lbessard@121: if reduce(lambda x, y: x or y != None, result): lbessard@121: values = [] lbessard@121: for value in result[:-1]: lbessard@121: if value != None: lbessard@121: values.append(int(value)) lbessard@121: else: lbessard@121: values.append(0) lbessard@121: values.append(int(float(result[-1]) * 1000)) lbessard@121: new_task.setInterval(time(*values)) lbessard@121: new_task.priority.setValue(int(task["Priority"])) lbessard@121: if task["Name"] != "": lbessard@121: task_list[task["Name"]] = new_task lbessard@121: resource.appendTask(new_task) lbessard@121: for instance in instances: lbessard@121: new_instance = plcopen.pouInstance() lbessard@121: new_instance.setName(instance["Name"]) lbessard@121: new_instance.setType(instance["Type"]) lbessard@121: if instance["Task"] != "": lbessard@121: task_list[instance["Task"]].appendPouInstance(new_instance) lbessard@121: else: lbessard@121: resource.appendPouInstance(new_instance) lbessard@121: lbessard@121: def GetEditedResourceInfos(self, tagname): lbessard@121: resource = self.GetEditedElement(tagname) lbessard@121: if resource is not None: lbessard@121: tasks = resource.getTask() lbessard@121: instances = resource.getPouInstance() lbessard@121: tasks_data = [] lbessard@121: instances_data = [] lbessard@121: for task in tasks: lbessard@121: new_task = {} lbessard@121: new_task["Name"] = task.getName() lbessard@121: single = task.getSingle() lbessard@121: if single: lbessard@121: new_task["Single"] = single lbessard@121: else: lbessard@121: new_task["Single"] = "" lbessard@121: interval = task.getInterval() lbessard@121: if interval: lbessard@121: text = "" lbessard@121: if interval.hour != 0: lbessard@121: text += "%dh"%interval.hour lbessard@121: if interval.minute != 0: lbessard@121: text += "%dm"%interval.minute lbessard@121: if interval.second != 0: lbessard@121: text += "%ds"%interval.second lbessard@121: if interval.microsecond != 0: lbessard@121: if interval.microsecond % 1000 != 0: lbessard@121: text += "%.3fms"%(float(interval.microsecond) / 1000) lbessard@121: else: lbessard@121: text += "%dms"%(interval.microsecond / 1000) lbessard@121: new_task["Interval"] = text lbessard@121: else: lbessard@121: new_task["Interval"] = "" lbessard@121: new_task["Priority"] = str(task.priority.getValue()) lbessard@121: tasks_data.append(new_task) lbessard@121: for instance in task.getPouInstance(): lbessard@121: new_instance = {} lbessard@121: new_instance["Name"] = instance.getName() lbessard@121: new_instance["Type"] = instance.getType() lbessard@121: new_instance["Task"] = task.getName() lbessard@121: instances_data.append(new_instance) lbessard@121: for instance in instances: etisserant@0: new_instance = {} etisserant@0: new_instance["Name"] = instance.getName() etisserant@0: new_instance["Type"] = instance.getType() lbessard@121: new_instance["Task"] = "" etisserant@0: instances_data.append(new_instance) lbessard@121: return tasks_data, instances_data etisserant@0: etisserant@0: def OpenXMLFile(self, filepath): lbessard@27: if self.VerifyXML: lbessard@27: if sys: lbessard@27: sys.stdout = HolePseudoFile() lbessard@125: result = pyxsval.parseAndValidate(filepath, os.path.join(ScriptDirectory, "plcopen", "TC6_XML_V10_B.xsd")) lbessard@27: if sys: lbessard@27: sys.stdout = sys.__stdout__ lbessard@27: tree = result.getTree() lbessard@27: else: lbessard@27: xmlfile = open(filepath, 'r') lbessard@27: tree = minidom.parse(xmlfile) lbessard@27: xmlfile.close() etisserant@0: etisserant@0: self.Project = plcopen.project() lbessard@116: for child in tree.childNodes: lbessard@116: if child.nodeType == tree.ELEMENT_NODE and child.nodeName == "project": lbessard@116: self.Project.loadXMLTree(child) lbessard@116: self.SetFilePath(filepath) lbessard@116: self.ProjectBuffer = UndoBuffer(self.Copy(self.Project), True) lbessard@116: self.Buffering = False lbessard@116: self.ElementsOpened = [] lbessard@116: self.CurrentElementEditing = None lbessard@125: self.RefreshDataTypeUsingTree() lbessard@125: self.RefreshDataTypes() lbessard@116: self.RefreshPouUsingTree() lbessard@116: self.RefreshBlockTypes() lbessard@117: return None lbessard@117: return "No PLC project found" etisserant@0: etisserant@0: def SaveXMLFile(self, filepath = None): etisserant@0: if not filepath and self.FilePath == "": etisserant@0: return False etisserant@0: else: etisserant@0: text = "\n" etisserant@0: extras = {"xmlns" : "http://www.plcopen.org/xml/tc6.xsd", etisserant@0: "xmlns:xhtml" : "http://www.w3.org/1999/xhtml", etisserant@0: "xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance", etisserant@0: "xsi:schemaLocation" : "http://www.plcopen.org/xml/tc6.xsd http://www.plcopen.org/xml/tc6.xsd"} etisserant@0: text += self.Project.generateXMLText("project", 0, extras) lbessard@125: lbessard@27: if self.VerifyXML: lbessard@27: if sys: lbessard@27: sys.stdout = HolePseudoFile() lbessard@125: pyxsval.parseAndValidateString(text, open(os.path.join(ScriptDirectory, "plcopen", "TC6_XML_V10_B.xsd"),"r").read()) lbessard@27: if sys: lbessard@27: sys.stdout = sys.__stdout__ etisserant@0: etisserant@0: if filepath: etisserant@0: xmlfile = open(filepath,"w") etisserant@0: else: etisserant@0: xmlfile = open(self.FilePath,"w") etisserant@0: xmlfile.write(text) etisserant@0: xmlfile.close() lbessard@56: self.ProjectBuffer.CurrentSaved() etisserant@0: if filepath: etisserant@0: self.SetFilePath(filepath) etisserant@0: return True etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Current Buffering Management Functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: """ etisserant@0: Return a copy of the project etisserant@0: """ etisserant@0: def Copy(self, model): etisserant@0: return cPickle.loads(cPickle.dumps(model)) etisserant@0: etisserant@0: def BufferProject(self): lbessard@56: self.ProjectBuffer.Buffering(self.Copy(self.Project)) lbessard@56: lbessard@56: def StartBuffering(self): lbessard@56: self.ProjectBuffer.Buffering(self.Project) lbessard@56: self.Buffering = True lbessard@56: lbessard@56: def EndBuffering(self): lbessard@56: if self.Buffering: lbessard@56: self.Project = self.Copy(self.Project) lbessard@56: self.Buffering = False etisserant@0: etisserant@0: def ProjectIsSaved(self): lbessard@58: if self.ProjectBuffer: lbessard@58: return self.ProjectBuffer.IsCurrentSaved() lbessard@58: else: lbessard@62: return True etisserant@0: etisserant@0: def LoadPrevious(self): lbessard@27: self.Project = self.Copy(self.ProjectBuffer.Previous()) etisserant@0: etisserant@0: def LoadNext(self): lbessard@27: self.Project = self.Copy(self.ProjectBuffer.Next()) etisserant@0: etisserant@0: def GetBufferState(self): lbessard@27: first = self.ProjectBuffer.IsFirst() lbessard@27: last = self.ProjectBuffer.IsLast() etisserant@0: return not first, not last