PLCGenerator.py
changeset 1298 f034fb2b1aab
parent 1297 cd639725fba5
child 1310 3d7fa2257b24
equal deleted inserted replaced
1297:cd639725fba5 1298:f034fb2b1aab
   552         return current_type
   552         return current_type
   553     
   553     
   554     # Return connectors linked by a connection to the given connector
   554     # Return connectors linked by a connection to the given connector
   555     def GetConnectedConnector(self, connector, body):
   555     def GetConnectedConnector(self, connector, body):
   556         links = connector.getconnections()
   556         links = connector.getconnections()
   557         if links and len(links) == 1:
   557         if links is not None and len(links) == 1:
   558             return self.GetLinkedConnector(links[0], body)
   558             return self.GetLinkedConnector(links[0], body)
   559         return None        
   559         return None        
   560 
   560 
   561     def GetLinkedConnector(self, link, body):
   561     def GetLinkedConnector(self, link, body):
   562         parameter = link.getformalParameter()
   562         parameter = link.getformalParameter()
   718                             for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   718                             for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   719                                 self.ConnectionTypes[connection] = var_type
   719                                 self.ConnectionTypes[connection] = var_type
   720                         if isinstance(instance, (OutVariableClass, InOutVariableClass)):
   720                         if isinstance(instance, (OutVariableClass, InOutVariableClass)):
   721                             self.ConnectionTypes[instance.connectionPointIn] = var_type
   721                             self.ConnectionTypes[instance.connectionPointIn] = var_type
   722                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   722                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   723                             if connected and not self.ConnectionTypes.has_key(connected):
   723                             if connected is not None and not self.ConnectionTypes.has_key(connected):
   724                                 for connection in self.ExtractRelatedConnections(connected):
   724                                 for related in self.ExtractRelatedConnections(connected):
   725                                     self.ConnectionTypes[connection] = var_type
   725                                     self.ConnectionTypes[related] = var_type
   726                 elif isinstance(instance, (ContactClass, CoilClass)):
   726                 elif isinstance(instance, (ContactClass, CoilClass)):
   727                     for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   727                     for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   728                         self.ConnectionTypes[connection] = "BOOL"
   728                         self.ConnectionTypes[connection] = "BOOL"
   729                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
   729                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
   730                     connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   730                     for link in instance.connectionPointIn.getconnections():
   731                     if connected and not self.ConnectionTypes.has_key(connected):
   731                         connected = self.GetLinkedConnector(link, body)
   732                         for connection in self.ExtractRelatedConnections(connected):
   732                         if connected is not None and not self.ConnectionTypes.has_key(connected):
   733                             self.ConnectionTypes[connection] = "BOOL"
   733                             for related in self.ExtractRelatedConnections(connected):
       
   734                                 self.ConnectionTypes[related] = "BOOL"
   734                 elif isinstance(instance, LeftPowerRailClass):
   735                 elif isinstance(instance, LeftPowerRailClass):
   735                     for connection in instance.getconnectionPointOut():
   736                     for connection in instance.getconnectionPointOut():
   736                         for related in self.ExtractRelatedConnections(connection):
   737                         for related in self.ExtractRelatedConnections(connection):
   737                             self.ConnectionTypes[related] = "BOOL"
   738                             self.ConnectionTypes[related] = "BOOL"
   738                 elif isinstance(instance, RightPowerRailClass):
   739                 elif isinstance(instance, RightPowerRailClass):
   739                     for connection in instance.getconnectionPointIn():
   740                     for connection in instance.getconnectionPointIn():
   740                         self.ConnectionTypes[connection] = "BOOL"
   741                         self.ConnectionTypes[connection] = "BOOL"
   741                         connected = self.GetConnectedConnector(connection, body)
   742                         for link in connection.getconnections():
   742                         if connected and not self.ConnectionTypes.has_key(connected):
   743                             connected = self.GetLinkedConnector(link, body)
   743                             for connection in self.ExtractRelatedConnections(connected):
   744                             if connected is not None and not self.ConnectionTypes.has_key(connected):
   744                                 self.ConnectionTypes[connection] = "BOOL"
   745                                 for related in self.ExtractRelatedConnections(connected):
       
   746                                     self.ConnectionTypes[related] = "BOOL"
   745                 elif isinstance(instance, TransitionClass):
   747                 elif isinstance(instance, TransitionClass):
   746                     content = instance.getconditionContent()
   748                     content = instance.getconditionContent()
   747                     if content["type"] == "connection":
   749                     if content["type"] == "connection":
   748                         connected = self.GetLinkedConnector(content["value"], body)
   750                         self.ConnectionTypes[content["value"]] = "BOOL"
   749                         if connected and not self.ConnectionTypes.has_key(connected):
   751                         for link in content["value"].getconnections():
   750                             for connection in self.ExtractRelatedConnections(connected):
   752                             connected = self.GetLinkedConnector(link, body)
   751                                 self.ConnectionTypes[connection] = "BOOL"
   753                             if connected is not None and not self.ConnectionTypes.has_key(connected):
       
   754                                 for related in self.ExtractRelatedConnections(connected):
       
   755                                     self.ConnectionTypes[related] = "BOOL"
   752                 elif isinstance(instance, ContinuationClass):
   756                 elif isinstance(instance, ContinuationClass):
   753                     name = instance.getname()
   757                     name = instance.getname()
   754                     connector = None
   758                     connector = None
   755                     var_type = "ANY"
   759                     var_type = "ANY"
   756                     for element in body.getcontentInstances():
   760                     for element in body.getcontentInstances():
   759                                 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   763                                 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   760                             connector = element
   764                             connector = element
   761                     if connector is not None:
   765                     if connector is not None:
   762                         undefined = [instance.connectionPointOut, connector.connectionPointIn]
   766                         undefined = [instance.connectionPointOut, connector.connectionPointIn]
   763                         connected = self.GetConnectedConnector(connector.connectionPointIn, body)
   767                         connected = self.GetConnectedConnector(connector.connectionPointIn, body)
   764                         if connected:
   768                         if connected is not None:
   765                             undefined.append(connected)
   769                             undefined.append(connected)
   766                         related = []
   770                         related = []
   767                         for connection in undefined:
   771                         for connection in undefined:
   768                             if self.ConnectionTypes.has_key(connection):
   772                             if self.ConnectionTypes.has_key(connection):
   769                                 var_type = self.ConnectionTypes[connection]
   773                                 var_type = self.ConnectionTypes[connection]
   836                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
   840                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
   837                         if itype.startswith("ANY"):
   841                         if itype.startswith("ANY"):
   838                             if not undefined.has_key(itype):
   842                             if not undefined.has_key(itype):
   839                                 undefined[itype] = []
   843                                 undefined[itype] = []
   840                             undefined[itype].append(variable.connectionPointIn)
   844                             undefined[itype].append(variable.connectionPointIn)
   841                             if connected:
   845                             if connected is not None:
   842                                 undefined[itype].append(connected)
   846                                 undefined[itype].append(connected)
   843                         else:
   847                         else:
   844                             self.ConnectionTypes[variable.connectionPointIn] = itype
   848                             self.ConnectionTypes[variable.connectionPointIn] = itype
   845                             if connected and not self.ConnectionTypes.has_key(connected):
   849                             if connected is not None and not self.ConnectionTypes.has_key(connected):
   846                                 for connection in self.ExtractRelatedConnections(connected):
   850                                 for connection in self.ExtractRelatedConnections(connected):
   847                                     self.ConnectionTypes[connection] = itype
   851                                     self.ConnectionTypes[connection] = itype
   848         for var_type, connections in undefined.items():
   852         for var_type, connections in undefined.items():
   849             related = []
   853             related = []
   850             for connection in connections:
   854             for connection in connections:
   877                     self.GenerateSFCStep(instance, pou)
   881                     self.GenerateSFCStep(instance, pou)
   878                 elif isinstance(instance, ActionBlockClass):
   882                 elif isinstance(instance, ActionBlockClass):
   879                     self.GenerateSFCStepActions(instance, pou)
   883                     self.GenerateSFCStepActions(instance, pou)
   880                 elif isinstance(instance, TransitionClass):
   884                 elif isinstance(instance, TransitionClass):
   881                     self.GenerateSFCTransition(instance, pou)
   885                     self.GenerateSFCTransition(instance, pou)
   882                 elif isinstance(instance, JumpClass):
   886                 elif isinstance(instance, JumpStepClass):
   883                     self.GenerateSFCJump(instance, pou)
   887                     self.GenerateSFCJump(instance, pou)
   884             if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0:
   888             if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0:
   885                 action_name = "COMPUTE_FUNCTION_BLOCKS"
   889                 action_name = "COMPUTE_FUNCTION_BLOCKS"
   886                 action_infos = {"qualifier" : "S", "content" : action_name}
   890                 action_infos = {"qualifier" : "S", "content" : action_name}
   887                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
   891                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
  1106         self.Program += [(");\n", ())]
  1110         self.Program += [(");\n", ())]
  1107         return [("%s.Q"%name, var_info)]
  1111         return [("%s.Q"%name, var_info)]
  1108     
  1112     
  1109     def ExtractDivergenceInput(self, divergence, pou):
  1113     def ExtractDivergenceInput(self, divergence, pou):
  1110         connectionPointIn = divergence.getconnectionPointIn()
  1114         connectionPointIn = divergence.getconnectionPointIn()
  1111         if connectionPointIn:
  1115         if connectionPointIn is not None:
  1112             connections = connectionPointIn.getconnections()
  1116             connections = connectionPointIn.getconnections()
  1113             if connections is not None and len(connections) == 1:
  1117             if connections is not None and len(connections) == 1:
  1114                 instanceLocalId = connections[0].getrefLocalId()
  1118                 instanceLocalId = connections[0].getrefLocalId()
  1115                 body = pou.getbody()
  1119                 body = pou.getbody()
  1116                 if isinstance(body, ListType):
  1120                 if isinstance(body, ListType):
  1138             step_infos = {"id" : step.getlocalId(), 
  1142             step_infos = {"id" : step.getlocalId(), 
  1139                           "initial" : step.getinitialStep(), 
  1143                           "initial" : step.getinitialStep(), 
  1140                           "transitions" : [], 
  1144                           "transitions" : [], 
  1141                           "actions" : []}
  1145                           "actions" : []}
  1142             self.SFCNetworks["Steps"][step_name] = step_infos
  1146             self.SFCNetworks["Steps"][step_name] = step_infos
  1143             if step.connectionPointIn:
  1147             if step.connectionPointIn is not None:
  1144                 instances = []
  1148                 instances = []
  1145                 connections = step.connectionPointIn.getconnections()
  1149                 connections = step.connectionPointIn.getconnections()
  1146                 if connections is not None and len(connections) == 1:
  1150                 if connections is not None and len(connections) == 1:
  1147                     instanceLocalId = connections[0].getrefLocalId()
  1151                     instanceLocalId = connections[0].getrefLocalId()
  1148                     body = pou.getbody()
  1152                     body = pou.getbody()
  1153                         instances.append(instance)
  1157                         instances.append(instance)
  1154                     elif isinstance(instance, SelectionConvergenceClass):
  1158                     elif isinstance(instance, SelectionConvergenceClass):
  1155                         instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1159                         instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1156                     elif isinstance(instance, SimultaneousDivergenceClass):
  1160                     elif isinstance(instance, SimultaneousDivergenceClass):
  1157                         transition = self.ExtractDivergenceInput(instance, pou)
  1161                         transition = self.ExtractDivergenceInput(instance, pou)
  1158                         if transition:
  1162                         if transition is not None:
  1159                             if isinstance(transition, TransitionClass):
  1163                             if isinstance(transition, TransitionClass):
  1160                                 instances.append(transition)
  1164                                 instances.append(transition)
  1161                             elif isinstance(transition, SelectionConvergenceClass):
  1165                             elif isinstance(transition, SelectionConvergenceClass):
  1162                                 instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1166                                 instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1163                 for instance in instances:
  1167                 for instance in instances:
  1166                         target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"])
  1170                         target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"])
  1167                         self.SFCNetworks["Transitions"][instance]["to"].append([(step_name, target_info)])
  1171                         self.SFCNetworks["Transitions"][instance]["to"].append([(step_name, target_info)])
  1168     
  1172     
  1169     def GenerateSFCJump(self, jump, pou):
  1173     def GenerateSFCJump(self, jump, pou):
  1170         jump_target = jump.gettargetName()
  1174         jump_target = jump.gettargetName()
  1171         if jump.connectionPointIn:
  1175         if jump.connectionPointIn is not None:
  1172             instances = []
  1176             instances = []
  1173             connections = jump.connectionPointIn.getconnections()
  1177             connections = jump.connectionPointIn.getconnections()
  1174             if connections is not None and len(connections) == 1:
  1178             if connections is not None and len(connections) == 1:
  1175                 instanceLocalId = connections[0].getrefLocalId()
  1179                 instanceLocalId = connections[0].getrefLocalId()
  1176                 body = pou.getbody()
  1180                 body = pou.getbody()
  1181                     instances.append(instance)
  1185                     instances.append(instance)
  1182                 elif isinstance(instance, SelectionConvergenceClass):
  1186                 elif isinstance(instance, SelectionConvergenceClass):
  1183                     instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1187                     instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1184                 elif isinstance(instance, SimultaneousDivergenceClass):
  1188                 elif isinstance(instance, SimultaneousDivergenceClass):
  1185                     transition = self.ExtractDivergenceInput(instance, pou)
  1189                     transition = self.ExtractDivergenceInput(instance, pou)
  1186                     if transition:
  1190                     if transition is not None:
  1187                         if isinstance(transition, TransitionClass):
  1191                         if isinstance(transition, TransitionClass):
  1188                             instances.append(transition)
  1192                             instances.append(transition)
  1189                         elif isinstance(transition, SelectionConvergenceClass):
  1193                         elif isinstance(transition, SelectionConvergenceClass):
  1190                             instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1194                             instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1191             for instance in instances:
  1195             for instance in instances:
  1226                     self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos)
  1230                     self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos)
  1227     
  1231     
  1228     def GenerateSFCAction(self, action_name, pou):
  1232     def GenerateSFCAction(self, action_name, pou):
  1229         if action_name not in self.SFCNetworks["Actions"].keys():
  1233         if action_name not in self.SFCNetworks["Actions"].keys():
  1230             actionContent = pou.getaction(action_name)
  1234             actionContent = pou.getaction(action_name)
  1231             if actionContent:
  1235             if actionContent is not None:
  1232                 previous_tagname = self.TagName
  1236                 previous_tagname = self.TagName
  1233                 self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action_name)
  1237                 self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action_name)
  1234                 self.ComputeProgram(actionContent)
  1238                 self.ComputeProgram(actionContent)
  1235                 self.SFCNetworks["Actions"][action_name] = (self.Program, (self.TagName, "name"))
  1239                 self.SFCNetworks["Actions"][action_name] = (self.Program, (self.TagName, "name"))
  1236                 self.Program = []
  1240                 self.Program = []
  1248                 instance = body.getcontentInstance(instanceLocalId)
  1252                 instance = body.getcontentInstance(instanceLocalId)
  1249                 if isinstance(instance, StepClass):
  1253                 if isinstance(instance, StepClass):
  1250                     steps.append(instance)
  1254                     steps.append(instance)
  1251                 elif isinstance(instance, SelectionDivergenceClass):
  1255                 elif isinstance(instance, SelectionDivergenceClass):
  1252                     step = self.ExtractDivergenceInput(instance, pou)
  1256                     step = self.ExtractDivergenceInput(instance, pou)
  1253                     if step:
  1257                     if step is not None:
  1254                         if isinstance(step, StepClass):
  1258                         if isinstance(step, StepClass):
  1255                             steps.append(step)
  1259                             steps.append(step)
  1256                         elif isinstance(step, SimultaneousConvergenceClass):
  1260                         elif isinstance(step, SimultaneousConvergenceClass):
  1257                             steps.extend(self.ExtractConvergenceInputs(step, pou))
  1261                             steps.extend(self.ExtractConvergenceInputs(step, pou))
  1258                 elif isinstance(instance, SimultaneousConvergenceClass):
  1262                 elif isinstance(instance, SimultaneousConvergenceClass):
  1259                     steps.extend(self.ExtractConvergenceInputs(instance, pou))
  1263                     steps.extend(self.ExtractConvergenceInputs(instance, pou))
  1260             transition_infos = {"id" : transition.getlocalId(), 
  1264             transition_infos = {"id" : transition.getlocalId(), 
  1261                                 "priority": transition.getpriority(), 
  1265                                 "priority": transition.getpriority(), 
  1262                                 "from": [], 
  1266                                 "from": [], 
  1263                                 "to" : []}
  1267                                 "to" : [],
       
  1268                                 "content": []}
  1264             self.SFCNetworks["Transitions"][transition] = transition_infos
  1269             self.SFCNetworks["Transitions"][transition] = transition_infos
  1265             transitionValues = transition.getconditionContent()
  1270             transitionValues = transition.getconditionContent()
  1266             if transitionValues["type"] == "inline":
  1271             if transitionValues["type"] == "inline":
  1267                 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ()),
  1272                 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ()),
  1268                                                (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")),
  1273                                                (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")),
  1295                 self.TagName = previous_tagname
  1300                 self.TagName = previous_tagname
  1296             elif transitionValues["type"] == "connection":
  1301             elif transitionValues["type"] == "connection":
  1297                 body = pou.getbody()
  1302                 body = pou.getbody()
  1298                 if isinstance(body, ListType):
  1303                 if isinstance(body, ListType):
  1299                     body = body[0]
  1304                     body = body[0]
  1300                 connections = transition.getconnections()
  1305                 connections = transitionValues["value"].getconnections()
  1301                 if connections is not None:
  1306                 if connections is not None:
  1302                     expression = self.ComputeExpression(body, connections)
  1307                     expression = self.ComputeExpression(body, connections)
  1303                     if expression is not None:
  1308                     if expression is not None:
  1304                         transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())]
  1309                         transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())]
  1305                         self.SFCComputedBlocks += self.Program
  1310                         self.SFCComputedBlocks += self.Program
  1349     def ComputeSFCAction(self, action_name):
  1354     def ComputeSFCAction(self, action_name):
  1350         if action_name in self.SFCNetworks["Actions"].keys():
  1355         if action_name in self.SFCNetworks["Actions"].keys():
  1351             action_content, action_info = self.SFCNetworks["Actions"].pop(action_name)
  1356             action_content, action_info = self.SFCNetworks["Actions"].pop(action_name)
  1352             self.Program += [("%sACTION "%self.CurrentIndent, ()),
  1357             self.Program += [("%sACTION "%self.CurrentIndent, ()),
  1353                              (action_name, action_info),
  1358                              (action_name, action_info),
  1354                              (" :\n", ())]
  1359                              (":\n", ())]
  1355             self.Program += action_content
  1360             self.Program += action_content
  1356             self.Program += [("%sEND_ACTION\n\n"%self.CurrentIndent, ())]
  1361             self.Program += [("%sEND_ACTION\n\n"%self.CurrentIndent, ())]
  1357     
  1362     
  1358     def ComputeSFCTransition(self, transition):
  1363     def ComputeSFCTransition(self, transition):
  1359         if transition in self.SFCNetworks["Transitions"].keys():
  1364         if transition in self.SFCNetworks["Transitions"].keys():