PLCGenerator.py
changeset 2 93bc4c2cf376
parent 1 e9d01d824086
child 4 2de7fd952fdd
equal deleted inserted replaced
1:e9d01d824086 2:93bc4c2cf376
    39             spaces += 1
    39             spaces += 1
    40         indent = ""
    40         indent = ""
    41         for i in xrange(spaces, nb_spaces):
    41         for i in xrange(spaces, nb_spaces):
    42             indent += " "
    42             indent += " "
    43         for line in lines:
    43         for line in lines:
    44             compute += "%s%s\n"%(indent, line)
    44             if line != "":
       
    45                 compute += "%s%s\n"%(indent, line)
       
    46             else:
       
    47                 compute += "\n"
    45     return compute
    48     return compute
    46 
    49 
    47 """
    50 """
    48 Module implementing methods for generating PLC programs in ST or IL
    51 Module implementing methods for generating PLC programs in ST or IL
    49 """
    52 """
   173             elif paths[0]:
   176             elif paths[0]:
   174                 return [variable, paths[0]]
   177                 return [variable, paths[0]]
   175             else:
   178             else:
   176                 return variable
   179                 return variable
   177 
   180 
       
   181     def ExtractDivergenceInput(self, divergence, pou):
       
   182         connectionPointIn = divergence.getConnectionPointIn()
       
   183         if connectionPointIn:
       
   184             connections = connectionPointIn.getConnections()
       
   185             if len(connections) == 1:
       
   186                 instanceLocalId = connections[0].getRefLocalId()
       
   187                 return pou.body.getContentInstance(instanceLocalId)
       
   188         return None
       
   189 
       
   190     def ExtractConvergenceInputs(self, convergence, pou):
       
   191         instances = []
       
   192         for connectionPointIn in convergence.getConnectionPointIn():
       
   193             connections = connectionPointIn.getConnections()
       
   194             if len(connections) == 1:
       
   195                 instanceLocalId = connections[0].getRefLocalId()
       
   196                 instances.append(pou.body.getContentInstance(instanceLocalId))
       
   197         return instances
       
   198 
   178     def GenerateSFCStep(self, step, pou):
   199     def GenerateSFCStep(self, step, pou):
   179         step_name = step.getName()
   200         step_name = step.getName()
   180         if step_name not in self.SFCNetworks["Steps"].keys():
   201         if step_name not in self.SFCNetworks["Steps"].keys():
   181             if step.getInitialStep():
   202             if step.getInitialStep():
   182                 self.InitialSteps.append(step_name)
   203                 self.InitialSteps.append(step_name)
   186                 connections = step.connectionPointIn.getConnections()
   207                 connections = step.connectionPointIn.getConnections()
   187                 if len(connections) == 1:
   208                 if len(connections) == 1:
   188                     instanceLocalId = connections[0].getRefLocalId()
   209                     instanceLocalId = connections[0].getRefLocalId()
   189                     instance = pou.body.getContentInstance(instanceLocalId)
   210                     instance = pou.body.getContentInstance(instanceLocalId)
   190                     if isinstance(instance, plcopen.transition):
   211                     if isinstance(instance, plcopen.transition):
   191                         self.GenerateSFCTransition(instance, pou)
       
   192                         instances.append(instance)
   212                         instances.append(instance)
   193                     elif isinstance(instance, plcopen.selectionConvergence):
   213                     elif isinstance(instance, plcopen.selectionConvergence):
   194                         for connectionPointIn in instance.getConnectionPointIn():
   214                         instances.extend(self.ExtractConvergenceInputs(instance, pou))
   195                             divergence_connections = connectionPointIn.getConnections()
   215                     elif isinstance(instance, plcopen.simultaneousDivergence):
   196                             if len(divergence_connections) == 1:
   216                         transition = self.ExtractDivergenceInput(instance, pou)
   197                                 transitionLocalId = connections[0].getRefLocalId()
   217                         if transition:
   198                                 transition = pou.body.getContentInstance(transitionLocalId)
   218                             if isinstance(transition, plcopen.transition):
   199                                 self.GenerateSFCTransition(transition, pou)
       
   200                                 instances.append(transition)
   219                                 instances.append(transition)
   201                     elif isinstance(instance, plcopen.simultaneousDivergence):
   220                             elif isinstance(transition, plcopen.selectionConvergence):
   202                         connectionPointIn = instance.getConnectionPointIn()
   221                                 instances.extend(self.ExtractConvergenceInputs(transition, pou))
   203                         if connectionPointIn:
       
   204                             divergence_connections = connectionPointIn.getConnections()
       
   205                             if len(divergence_connections) == 1:
       
   206                                 transitionLocalId = connections[0].getRefLocalId()
       
   207                                 transition = pou.body.getContentInstance(transitionLocalId)
       
   208                                 self.GenerateSFCTransition(transition, pou)
       
   209                                 instances.append(transition)
       
   210                 for instance in instances:
   222                 for instance in instances:
       
   223                     self.GenerateSFCTransition(instance, pou)
   211                     if instance in self.SFCNetworks["Transitions"].keys():
   224                     if instance in self.SFCNetworks["Transitions"].keys():
   212                         self.SFCNetworks["Transitions"][instance]["to"].append(step_name)
   225                         self.SFCNetworks["Transitions"][instance]["to"].append(step_name)
   213             self.SFCNetworks["Steps"][step_name] = step_infos
   226             self.SFCNetworks["Steps"][step_name] = step_infos
   214     
   227     
   215     def GenerateSFCJump(self, jump, pou):
   228     def GenerateSFCJump(self, jump, pou):
   219             connections = jump.connectionPointIn.getConnections()
   232             connections = jump.connectionPointIn.getConnections()
   220             if len(connections) == 1:
   233             if len(connections) == 1:
   221                 instanceLocalId = connections[0].getRefLocalId()
   234                 instanceLocalId = connections[0].getRefLocalId()
   222                 instance = pou.body.getContentInstance(instanceLocalId)
   235                 instance = pou.body.getContentInstance(instanceLocalId)
   223                 if isinstance(instance, plcopen.transition):
   236                 if isinstance(instance, plcopen.transition):
   224                     self.GenerateSFCTransition(instance, pou)
       
   225                     instances.append(instance)
   237                     instances.append(instance)
   226                 elif isinstance(instance, plcopen.selectionConvergence):
   238                 elif isinstance(instance, plcopen.selectionConvergence):
   227                     for connectionPointIn in instance.getConnectionPointIn():
   239                     instances.extend(self.ExtractConvergenceInputs(instance, pou))
   228                         divergence_connections = connectionPointIn.getConnections()
   240                 elif isinstance(instance, plcopen.simultaneousDivergence):
   229                         if len(divergence_connections) == 1:
   241                     transition = self.ExtractDivergenceInput(instance, pou)
   230                             transitionLocalId = divergence_connections[0].getRefLocalId()
   242                     if transition:
   231                             transition = pou.body.getContentInstance(transitionLocalId)
   243                         if isinstance(transition, plcopen.transition):
   232                             self.GenerateSFCTransition(transition, pou)
       
   233                             instances.append(transition)
   244                             instances.append(transition)
   234                 elif isinstance(instance, plcopen.simultaneousDivergence):
   245                         elif isinstance(transition, plcopen.selectionConvergence):
   235                     connectionPointIn = instance.getConnectionPointIn()
   246                             instances.extend(self.ExtractConvergenceInputs(transition, pou))
   236                     if connectionPointIn:
       
   237                         divergence_connections = connectionPointIn.getConnections()
       
   238                         if len(divergence_connections) == 1:
       
   239                             transitionLocalId = connections[0].getRefLocalId()
       
   240                             transition = pou.body.getContentInstance(transitionLocalId)
       
   241                             self.GenerateSFCTransition(transition, pou)
       
   242                             instances.append(transition)
       
   243             for instance in instances:
   247             for instance in instances:
       
   248                 self.GenerateSFCTransition(instance, pou)
   244                 if instance in self.SFCNetworks["Transitions"].keys():
   249                 if instance in self.SFCNetworks["Transitions"].keys():
   245                     self.SFCNetworks["Transitions"][instance]["to"].append(jump_target)
   250                     self.SFCNetworks["Transitions"][instance]["to"].append(jump_target)
   246     
   251     
   247     def GenerateSFCStepActions(self, actionBlock, pou):
   252     def GenerateSFCStepActions(self, actionBlock, pou):
   248         connections = actionBlock.connectionPointIn.getConnections()
   253         connections = actionBlock.connectionPointIn.getConnections()
   295             connections = transition.connectionPointIn.getConnections()
   300             connections = transition.connectionPointIn.getConnections()
   296             if len(connections) == 1:
   301             if len(connections) == 1:
   297                 instanceLocalId = connections[0].getRefLocalId()
   302                 instanceLocalId = connections[0].getRefLocalId()
   298                 instance = pou.body.getContentInstance(instanceLocalId)
   303                 instance = pou.body.getContentInstance(instanceLocalId)
   299                 if isinstance(instance, plcopen.step):
   304                 if isinstance(instance, plcopen.step):
   300                     self.GenerateSFCStep(instance, pou)
   305                     steps.append(instance)
   301                     steps.append(instance.getName())
       
   302                 elif isinstance(instance, plcopen.selectionDivergence):
   306                 elif isinstance(instance, plcopen.selectionDivergence):
   303                     divergence_connections = instance.connectionPointIn.getConnections()
   307                     step = self.ExtractDivergenceInput(instance, pou)
   304                     if len(divergence_connections) == 1:
   308                     if step:
   305                         stepLocalId = divergence_connections[0].getRefLocalId()
   309                         if isinstance(step, plcopen.step):
   306                         divergence_instance = pou.body.getContentInstance(stepLocalId)
   310                             steps.append(step)
   307                         if isinstance(divergence_instance, plcopen.step):
   311                         elif isinstance(step, plcopen.simultaneousConvergence):
   308                             self.GenerateSFCStep(divergence_instance, pou)
   312                             steps.extend(self.ExtractConvergenceInputs(step, pou))
   309                             steps.append(divergence_instance.getName())
   313                 elif isinstance(instance, plcopen.simultaneousConvergence):
       
   314                     steps.extend(self.ExtractConvergenceInputs(instance, pou))
   310             transition_infos = {"from": [], "to" : []}
   315             transition_infos = {"from": [], "to" : []}
   311             transitionValues = transition.getConditionContent()
   316             transitionValues = transition.getConditionContent()
   312             if transitionValues["type"] == "inline":
   317             if transitionValues["type"] == "inline":
   313                 transition_infos["content"] = "\n    := %s;\n"%transitionValues["value"]
   318                 transition_infos["content"] = "\n    := %s;\n"%transitionValues["value"]
   314             else:
   319             else:
   315                 transitionContent = pou.getTransition(transitionValues["value"])
   320                 transitionContent = pou.getTransition(transitionValues["value"])
   316                 transitionType = transitionContent.getBodyType()
   321                 transitionType = transitionContent.getBodyType()
   317                 transitionBody = transitionContent.getBody()
   322                 transitionBody = transitionContent.getBody()
   318                 if transitionType == "IL":
   323                 if transitionType == "IL":
   319                     transition_infos["content"] = ":\n%s\n"%ReIndentText(transitionBody.getText(), 4)
   324                     transition_infos["content"] = ":\n%s"%ReIndentText(transitionBody.getText(), 4)
   320                 elif transitionType == "ST":
   325                 elif transitionType == "ST":
   321                     transition_infos["content"] = "\n%s\n"%ReIndentText(transitionBody.getText(), 4)
   326                     transition_infos["content"] = "\n%s"%ReIndentText(transitionBody.getText(), 4)
   322                 elif conditionType == "FBD":
   327                 elif conditionType == "FBD":
   323                     for instance in transitionBody.getContentInstances():
   328                     for instance in transitionBody.getContentInstances():
   324                         if isinstance(instance, plcopen.outVariable):
   329                         if isinstance(instance, plcopen.outVariable):
   325                             connections = instance.connectionPointIn.getConnections()
   330                             connections = instance.connectionPointIn.getConnections()
   326                             if connections and len(connections) == 1:
   331                             if connections and len(connections) == 1:
   330                     for instance in transitionbody.getContentInstances():
   335                     for instance in transitionbody.getContentInstances():
   331                         if isinstance(instance, plcopen.coil):
   336                         if isinstance(instance, plcopen.coil):
   332                             paths = self.GenerateLDPaths(instance, conditionBody)
   337                             paths = self.GenerateLDPaths(instance, conditionBody)
   333                             expression = self.ComputeLDExpression(paths, True)
   338                             expression = self.ComputeLDExpression(paths, True)
   334                             transition_infos["content"] = "\n    := %s;\n"%expression
   339                             transition_infos["content"] = "\n    := %s;\n"%expression
   335             for step_name in steps:
   340             for step in steps:
       
   341                 self.GenerateSFCStep(step, pou)
       
   342                 step_name = step.getName()
   336                 if step_name in self.SFCNetworks["Steps"].keys():
   343                 if step_name in self.SFCNetworks["Steps"].keys():
   337                     transition_infos["from"].append(step_name)
   344                     transition_infos["from"].append(step_name)
   338                     self.SFCNetworks["Steps"][step_name]["transitions"].append(transition)
   345                     self.SFCNetworks["Steps"][step_name]["transitions"].append(transition)
   339             self.SFCNetworks["Transitions"][transition] = transition_infos
   346             self.SFCNetworks["Transitions"][transition] = transition_infos
   340 
   347