PLCGenerator.py
changeset 70 0e48629c1e6d
parent 68 66308e07402c
child 71 0578bc212c20
equal deleted inserted replaced
69:8fbff50141f8 70:0e48629c1e6d
    60         self.Type = type
    60         self.Type = type
    61         self.ReturnType = None
    61         self.ReturnType = None
    62         self.Interface = []
    62         self.Interface = []
    63         self.InitialSteps = []
    63         self.InitialSteps = []
    64         self.BlockComputed = {}
    64         self.BlockComputed = {}
       
    65         self.ComputedBlocks = ""
    65         self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}}
    66         self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}}
    66         self.ActionNumber = 0
    67         self.ActionNumber = 0
    67         self.Program = ""
    68         self.Program = ""
    68     
    69     
    69     def GetActionNumber(self):
    70     def GetActionNumber(self):
   128                     self.GenerateSFCStepActions(instance, pou)
   129                     self.GenerateSFCStepActions(instance, pou)
   129                 elif isinstance(instance, plcopen.transition):
   130                 elif isinstance(instance, plcopen.transition):
   130                     self.GenerateSFCTransition(instance, pou)
   131                     self.GenerateSFCTransition(instance, pou)
   131                 elif isinstance(instance, plcopen.jumpStep):
   132                 elif isinstance(instance, plcopen.jumpStep):
   132                     self.GenerateSFCJump(instance, pou)
   133                     self.GenerateSFCJump(instance, pou)
   133             if len(self.InitialSteps) > 0:
   134             if len(self.InitialSteps) > 0 and self.ComputedBlocks != "":
   134                 action_name = "COMPUTE_FUNCTION_BLOCKS"
   135                 action_name = "COMPUTE_FUNCTION_BLOCKS"
   135                 action_infos = {"qualifier" : "S", "content" : action_name}
   136                 action_infos = {"qualifier" : "S", "content" : action_name}
   136                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
   137                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
   137                 self.SFCNetworks["Actions"][action_name] = ReIndentText(self.Program, 4)
   138                 self.SFCNetworks["Actions"][action_name] = ReIndentText(self.ComputedBlocks, 4)
   138                 self.Program = ""
   139                 self.Program = ""
   139             else:
   140             else:
   140                 raise Exception
   141                 raise Exception
   141             for initialstep in self.InitialSteps:
   142             for initialstep in self.InitialSteps:
   142                 self.ComputeSFCStep(initialstep)
   143                 self.ComputeSFCStep(initialstep)
   203             localId = connection.getRefLocalId()
   204             localId = connection.getRefLocalId()
   204             next = body.getContentInstance(localId)
   205             next = body.getContentInstance(localId)
   205             if isinstance(next, plcopen.leftPowerRail) or isinstance(next, plcopen.contact):
   206             if isinstance(next, plcopen.leftPowerRail) or isinstance(next, plcopen.contact):
   206                 return "LD"
   207                 return "LD"
   207             elif isinstance(next, plcopen.block):
   208             elif isinstance(next, plcopen.block):
   208                  for variable in instance.inputVariables.getVariable():
   209                  for variable in next.inputVariables.getVariable():
   209                      result = self.GetNetworkType(variable.connectionPointIn.getConnections(), body)
   210                      result = self.GetNetworkType(variable.connectionPointIn.getConnections(), body)
   210                      if result != "FBD":
   211                      if result != "FBD":
   211                          return result
   212                          return result
   212             elif isinstance(next, plcopen.inVariable):
   213             elif isinstance(next, plcopen.inVariable):
   213                 return "FBD"
   214                 return "FBD"
   324                         if isinstance(instance, plcopen.outVariable):
   325                         if isinstance(instance, plcopen.outVariable):
   325                             var = instance.getExpression()
   326                             var = instance.getExpression()
   326                             connections = instance.connectionPointIn.getConnections()
   327                             connections = instance.connectionPointIn.getConnections()
   327                             if connections and len(connections) == 1:
   328                             if connections and len(connections) == 1:
   328                                 expression = self.ComputeFBDExpression(actionBody, connections[0])
   329                                 expression = self.ComputeFBDExpression(actionBody, connections[0])
   329                                 self.SFCNetworks["Actions"][action_name] = self.Program + "  %s := %s;\n"%(var, expression)
   330                                 action_content = self.Program + "  %s := %s;\n"%(var, expression)
   330                                 self.Program = ""
   331                                 self.Program = ""
       
   332                                 self.SFCNetworks["Actions"][action_name] = ReIndentText(action_content, 4)
   331                 elif actionType == "LD":
   333                 elif actionType == "LD":
   332                     for instance in actionbody.getContentInstances():
   334                     for instance in actionbody.getContentInstances():
   333                         if isinstance(instance, plcopen.coil):
   335                         if isinstance(instance, plcopen.coil):
   334                             paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), actionBody)
   336                             paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), actionBody)
   335                             variable = self.ExtractModifier(instance, instance.getVariable())
   337                             variable = self.ExtractModifier(instance, instance.getVariable())
   336                             expression = self.ComputeLDExpression(paths, True)
   338                             expression = self.ComputeLDExpression(paths, True)
   337                             self.SFCNetworks["Actions"][action_name] = self.Program + "  %s := %s;\n"%(variable, expression)
   339                             action_content = self.Program + "  %s := %s;\n"%(variable, expression)
   338                             self.Program = ""
   340                             self.Program = ""
       
   341                             self.SFCNetworks["Actions"][action_name] = ReIndentText(action_content, 4)
   339     
   342     
   340     def GenerateSFCTransition(self, transition, pou):
   343     def GenerateSFCTransition(self, transition, pou):
   341         if transition not in self.SFCNetworks["Transitions"].keys():
   344         if transition not in self.SFCNetworks["Transitions"].keys():
   342             steps = []
   345             steps = []
   343             connections = transition.connectionPointIn.getConnections()
   346             connections = transition.connectionPointIn.getConnections()
   372                         if isinstance(instance, plcopen.outVariable):
   375                         if isinstance(instance, plcopen.outVariable):
   373                             connections = instance.connectionPointIn.getConnections()
   376                             connections = instance.connectionPointIn.getConnections()
   374                             if connections and len(connections) == 1:
   377                             if connections and len(connections) == 1:
   375                                 expression = self.ComputeFBDExpression(transitionBody, connections[0])
   378                                 expression = self.ComputeFBDExpression(transitionBody, connections[0])
   376                                 transition_infos["content"] = "\n    := %s;\n"%expression
   379                                 transition_infos["content"] = "\n    := %s;\n"%expression
       
   380                                 self.ComputedBlocks += self.Program
       
   381                                 self.Program = ""
   377                 elif transitionType == "LD":
   382                 elif transitionType == "LD":
   378                     for instance in transitionBody.getContentInstances():
   383                     for instance in transitionBody.getContentInstances():
   379                         if isinstance(instance, plcopen.coil):
   384                         if isinstance(instance, plcopen.coil):
   380                             paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), transitionBody)
   385                             paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), transitionBody)
   381                             expression = self.ComputeLDExpression(paths, True)
   386                             expression = self.ComputeLDExpression(paths, True)
   382                             transition_infos["content"] = "\n    := %s;\n"%expression
   387                             transition_infos["content"] = "\n    := %s;\n"%expression
       
   388                             self.ComputedBlocks += self.Program
       
   389                             self.Program = ""
   383             elif transitionValues["type"] == "connection":
   390             elif transitionValues["type"] == "connection":
   384                 body = pou.getBody()
   391                 body = pou.getBody()
   385                 connections = transition.getConnections()
   392                 connections = transition.getConnections()
   386                 network_type = self.GetNetworkType(connections, body)
   393                 network_type = self.GetNetworkType(connections, body)
   387                 if network_type == None:
   394                 if network_type == None:
   388                     raise Exception
   395                     raise Exception
   389                 if len(connections) > 1 or network_type == "LD":
   396                 if len(connections) > 1 or network_type == "LD":
   390                     paths = self.GenerateLDPaths(connections, body)
   397                     paths = self.GenerateLDPaths(connections, body)
   391                     expression = self.ComputeLDExpression(paths, True)
   398                     expression = self.ComputeLDExpression(paths, True)
   392                     transition_infos["content"] = "\n    := %s;\n"%expression
   399                     transition_infos["content"] = "\n    := %s;\n"%expression
       
   400                     self.ComputedBlocks += self.Program
       
   401                     self.Program = ""
   393                 else:
   402                 else:
   394                     expression = self.ComputeFBDExpression(body, connections[0])
   403                     expression = self.ComputeFBDExpression(body, connections[0])
   395                     transition_infos["content"] = "\n    := %s;\n"%expression
   404                     transition_infos["content"] = "\n    := %s;\n"%expression
       
   405                     self.ComputedBlocks += self.Program
       
   406                     self.Program = ""
   396             for step in steps:
   407             for step in steps:
   397                 self.GenerateSFCStep(step, pou)
   408                 self.GenerateSFCStep(step, pou)
   398                 step_name = step.getName()
   409                 step_name = step.getName()
   399                 if step_name in self.SFCNetworks["Steps"].keys():
   410                 if step_name in self.SFCNetworks["Steps"].keys():
   400                     transition_infos["from"].append(step_name)
   411                     transition_infos["from"].append(step_name)