PLCGenerator.py
changeset 201 d5b778dab4b0
parent 194 1b3f8b4f8e04
child 207 b1144bb36605
equal deleted inserted replaced
200:8a1ed1959c69 201:d5b778dab4b0
   473         body_type = body_content["name"]
   473         body_type = body_content["name"]
   474         if body_type in ["IL","ST"]:
   474         if body_type in ["IL","ST"]:
   475             self.Program = ReIndentText(body_content["value"].gettext(), 2)
   475             self.Program = ReIndentText(body_content["value"].gettext(), 2)
   476         elif body_type == "FBD":
   476         elif body_type == "FBD":
   477             orderedInstances = []
   477             orderedInstances = []
   478             otherInstances = []
   478             otherInstances = {"outVariables" : [], "block" : [], "connector" : []}
   479             for instance in body.getcontentInstances():
   479             for instance in body.getcontentInstances():
   480                 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)):
   480                 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)):
   481                     executionOrderId = instance.getexecutionOrderId()
   481                     executionOrderId = instance.getexecutionOrderId()
   482                     if executionOrderId > 0:
   482                     if executionOrderId > 0:
   483                         orderedInstances.append((executionOrderId, instance))
   483                         orderedInstances.append((executionOrderId, instance))
   484                     else:
   484                     elif isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   485                         otherInstances.append(instance)
   485                         otherInstances["outVariables"].append(instance)
       
   486                     elif isinstance(instance, plcopen.fbdObjects_block):
       
   487                         otherInstances["block"].append(instance)
   486                 elif isinstance(instance, plcopen.commonObjects_connector):
   488                 elif isinstance(instance, plcopen.commonObjects_connector):
   487                     otherInstances.append(instance)
   489                     otherInstances["connector"].append(instance)
   488             orderedInstances.sort()
   490             orderedInstances.sort()
   489             instances = [instance for (executionOrderId, instance) in orderedInstances] + otherInstances
   491             instances = [instance for (executionOrderId, instance) in orderedInstances]
       
   492             instances.extend(otherInstances["connector"] + otherInstances["outVariables"] + otherInstances["block"])
   490             for instance in instances:
   493             for instance in instances:
   491                 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   494                 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   492                     var = instance.getexpression()
   495                     var = instance.getexpression()
   493                     connections = instance.connectionPointIn.getconnections()
   496                     connections = instance.connectionPointIn.getconnections()
   494                     if connections and len(connections) == 1:
   497                     if connections and len(connections) == 1:
   608     
   611     
   609     def ExtractDivergenceInput(self, divergence, pou):
   612     def ExtractDivergenceInput(self, divergence, pou):
   610         connectionPointIn = divergence.getconnectionPointIn()
   613         connectionPointIn = divergence.getconnectionPointIn()
   611         if connectionPointIn:
   614         if connectionPointIn:
   612             connections = connectionPointIn.getconnections()
   615             connections = connectionPointIn.getconnections()
   613             if len(connections) == 1:
   616             if connections is not None and len(connections) == 1:
   614                 instanceLocalId = connections[0].getrefLocalId()
   617                 instanceLocalId = connections[0].getrefLocalId()
   615                 return pou.body.getcontentInstance(instanceLocalId)
   618                 return pou.body.getcontentInstance(instanceLocalId)
   616         return None
   619         return None
   617 
   620 
   618     def ExtractConvergenceInputs(self, convergence, pou):
   621     def ExtractConvergenceInputs(self, convergence, pou):
   677                 if instance in self.SFCNetworks["Transitions"].keys():
   680                 if instance in self.SFCNetworks["Transitions"].keys():
   678                     self.SFCNetworks["Transitions"][instance]["to"].append(jump_target)
   681                     self.SFCNetworks["Transitions"][instance]["to"].append(jump_target)
   679     
   682     
   680     def GenerateSFCStepActions(self, actionBlock, pou):
   683     def GenerateSFCStepActions(self, actionBlock, pou):
   681         connections = actionBlock.connectionPointIn.getconnections()
   684         connections = actionBlock.connectionPointIn.getconnections()
   682         if len(connections) == 1:
   685         if connections is not None and len(connections) == 1:
   683             stepLocalId = connections[0].getrefLocalId()
   686             stepLocalId = connections[0].getrefLocalId()
   684             step = pou.body.getcontentInstance(stepLocalId)
   687             step = pou.body.getcontentInstance(stepLocalId)
   685             self.GenerateSFCStep(step, pou)
   688             self.GenerateSFCStep(step, pou)
   686             step_name = step.getname()
   689             step_name = step.getname()
   687             if step_name in self.SFCNetworks["Steps"].keys():
   690             if step_name in self.SFCNetworks["Steps"].keys():
   730     
   733     
   731     def GenerateSFCTransition(self, transition, pou):
   734     def GenerateSFCTransition(self, transition, pou):
   732         if transition not in self.SFCNetworks["Transitions"].keys():
   735         if transition not in self.SFCNetworks["Transitions"].keys():
   733             steps = []
   736             steps = []
   734             connections = transition.connectionPointIn.getconnections()
   737             connections = transition.connectionPointIn.getconnections()
   735             if len(connections) == 1:
   738             if connections is not None and len(connections) == 1:
   736                 instanceLocalId = connections[0].getrefLocalId()
   739                 instanceLocalId = connections[0].getrefLocalId()
   737                 instance = pou.body.getcontentInstance(instanceLocalId)
   740                 instance = pou.body.getcontentInstance(instanceLocalId)
   738                 if isinstance(instance, plcopen.sfcObjects_step):
   741                 if isinstance(instance, plcopen.sfcObjects_step):
   739                     steps.append(instance)
   742                     steps.append(instance)
   740                 elif isinstance(instance, plcopen.sfcObjects_selectionDivergence):
   743                 elif isinstance(instance, plcopen.sfcObjects_selectionDivergence):
   834             if transition_infos["priority"] != None:
   837             if transition_infos["priority"] != None:
   835                 self.Program += " (PRIORITY := %d)"%transition_infos["priority"]
   838                 self.Program += " (PRIORITY := %d)"%transition_infos["priority"]
   836             self.Program += " FROM "
   839             self.Program += " FROM "
   837             if len(transition_infos["from"]) > 1:
   840             if len(transition_infos["from"]) > 1:
   838                 self.Program += "(%s)"%", ".join(transition_infos["from"])
   841                 self.Program += "(%s)"%", ".join(transition_infos["from"])
   839             else:
   842             elif len(transition_infos["from"]) == 1:
   840                 self.Program += "%s"%transition_infos["from"][0]
   843                 self.Program += "%s"%transition_infos["from"][0]
       
   844             else:
       
   845                 raise PLCGenException, "Not connected transition"
   841             self.Program += " TO "
   846             self.Program += " TO "
   842             if len(transition_infos["to"]) > 1:
   847             if len(transition_infos["to"]) > 1:
   843                 self.Program += "(%s)"%", ".join(transition_infos["to"])
   848                 self.Program += "(%s)"%", ".join(transition_infos["to"])
   844             else:
   849             elif len(transition_infos["to"]) == 1:
   845                 self.Program += "%s"%transition_infos["to"][0]
   850                 self.Program += "%s"%transition_infos["to"][0]
       
   851             else:
       
   852                 raise PLCGenException, "Not connected transition"
   846             self.Program += transition_infos["content"]
   853             self.Program += transition_infos["content"]
   847             self.Program += "  END_TRANSITION\n\n"
   854             self.Program += "  END_TRANSITION\n\n"
   848             for step_name in transition_infos["to"]:
   855             for step_name in transition_infos["to"]:
   849                 self.ComputeSFCStep(step_name)
   856                 self.ComputeSFCStep(step_name)
   850         
   857