PLCGenerator.py
changeset 30 768cf2a6b0b1
parent 29 3b7e23a323a6
child 31 d833bf7567b1
equal deleted inserted replaced
29:3b7e23a323a6 30:768cf2a6b0b1
    64         self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}}
    64         self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}}
    65         self.Program = ""
    65         self.Program = ""
    66     
    66     
    67     def IsAlreadyDefined(self, name):
    67     def IsAlreadyDefined(self, name):
    68         for list_type, retain, constant, vars in self.Interface:
    68         for list_type, retain, constant, vars in self.Interface:
    69             for var_type, var_name, var_initial in vars:
    69             for var_type, var_name, var_address, var_initial in vars:
    70                 if name == var_name:
    70                 if name == var_name:
    71                     return True
    71                     return True
    72         return False
    72         return False
    73     
    73     
    74     def GenerateInterface(self, interface):
    74     def GenerateInterface(self, interface):
    81                 initial = var.getInitialValue()
    81                 initial = var.getInitialValue()
    82                 if initial:
    82                 if initial:
    83                     initial_value = initial.getValue()
    83                     initial_value = initial.getValue()
    84                 else:
    84                 else:
    85                     initial_value = None
    85                     initial_value = None
    86                 variables.append((type, var.getName(), initial_value))
    86                 address = var.getAddress()
       
    87                 if address == "":
       
    88                     address = None
       
    89                 variables.append((type, var.getName(), address, initial_value))
    87             self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), 
    90             self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), 
    88                             varlist["value"].getConstant(), variables))
    91                             varlist["value"].getConstant(), variables))
    89     
    92     
    90     def GenerateProgram(self, pou):
    93     def GenerateProgram(self, pou):
    91         body = pou.getBody()
    94         body = pou.getBody()
   141                 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
   144                 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
   142             elif block_infos["type"] == "functionBlock":
   145             elif block_infos["type"] == "functionBlock":
   143                 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
   146                 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
   144                     self.Interface.append(("VAR", False, False, []))
   147                     self.Interface.append(("VAR", False, False, []))
   145                 if not self.IsAlreadyDefined(name):
   148                 if not self.IsAlreadyDefined(name):
   146                     self.Interface[-1][3].append((type, name, None))
   149                     self.Interface[-1][3].append((type, name, None, None))
   147                     vars = []
   150                     vars = []
   148                     for variable in instance.inputVariables.getVariable():
   151                     for variable in instance.inputVariables.getVariable():
   149                         connections = variable.connectionPointIn.getConnections()
   152                         connections = variable.connectionPointIn.getConnections()
   150                         if connections and len(connections) == 1:
   153                         if connections and len(connections) == 1:
   151                             parameter = variable.getFormalParameter()
   154                             parameter = variable.getFormalParameter()
   431         i = 1
   434         i = 1
   432         name = "%s%d"%(edge, i)
   435         name = "%s%d"%(edge, i)
   433         while self.IsAlreadyDefined(name):
   436         while self.IsAlreadyDefined(name):
   434             i += 1
   437             i += 1
   435             name = "%s%d"%(edge, i)
   438             name = "%s%d"%(edge, i)
   436         self.Interface[-1][3].append((edge, name, None))
   439         self.Interface[-1][3].append((edge, name, None, None))
   437         self.Program += "  %s(CLK := %s);\n"%(name, text)
   440         self.Program += "  %s(CLK := %s);\n"%(name, text)
   438         return "%s.Q"%name
   441         return "%s.Q"%name
   439     
   442     
   440     def GenerateSTProgram(self):
   443     def GenerateSTProgram(self):
   441         if self.ReturnType:
   444         if self.ReturnType:
   447             if retain:
   450             if retain:
   448                 program += " RETAIN"
   451                 program += " RETAIN"
   449             if constant:
   452             if constant:
   450                 program += " CONSTANT"
   453                 program += " CONSTANT"
   451             program += "\n"
   454             program += "\n"
   452             for var_type, var_name, var_initial in variables:
   455             for var_type, var_name, var_address, var_initial in variables:
       
   456                 program += "    %s "%var_name
       
   457                 if var_address != None:
       
   458                     program += "AT %s "%address
       
   459                 program += ": %s"%var_type
   453                 if var_initial != None:
   460                 if var_initial != None:
   454                     program += "    %s : %s := %s;\n"%(var_name, var_type, {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(),str(var_initial)))
   461                     program += " := %s"%{"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial))
   455                 else:
   462                 program += ";\n"
   456                     program += "    %s : %s;\n"%(var_name, var_type)
       
   457             program += "  END_VAR\n"
   463             program += "  END_VAR\n"
   458         program += "\n"
   464         program += "\n"
   459         program += self.Program
   465         program += self.Program
   460         program += "END_%s\n\n"%self.Type
   466         program += "END_%s\n\n"%self.Type
   461         return program
   467         return program
   468                 config += " RETAIN"
   474                 config += " RETAIN"
   469             if varlist.getConstant():
   475             if varlist.getConstant():
   470                 config += " CONSTANT"
   476                 config += " CONSTANT"
   471             config += "\n"
   477             config += "\n"
   472             for var in varlist.getVariable():
   478             for var in varlist.getVariable():
   473                 var_type = var.getType().getValue()
   479                 config += "      %s "%var.getName()
   474                 var_name = var.getName()
   480                 address = var.getAddress()
       
   481                 if address:
       
   482                     config += "AT %s "%address
       
   483                 config += ": %s"%var.getType().getValue()
   475                 initial = var.getInitialValue()
   484                 initial = var.getInitialValue()
   476                 if initial:
   485                 if initial:
   477                     var_initial = initial.getValue()
   486                     value = str(initial.getValue())
   478                 else:
   487                     config += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
   479                     var_initial = None
   488                 config += ";\n"
   480                 if var_initial != None:
       
   481                     config += "    %s : %s := %s;\n"%(var_name, var_type, {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(),str(var_initial)))
       
   482                 else:
       
   483                     config += "    %s : %s;\n"%(var_name, var_type)
       
   484             config += "  END_VAR\n"
   489             config += "  END_VAR\n"
   485         for resource in configuration.getResource():
   490         for resource in configuration.getResource():
   486             config += self.GenerateResource(resource)
   491             config += self.GenerateResource(resource)
   487         config += "END_CONFIGURATION\n"
   492         config += "END_CONFIGURATION\n"
   488         return config
   493         return config
   495                 resrce += " RETAIN"
   500                 resrce += " RETAIN"
   496             if varlist.getConstant():
   501             if varlist.getConstant():
   497                 resrce += " CONSTANT"
   502                 resrce += " CONSTANT"
   498             resrce += "\n"
   503             resrce += "\n"
   499             for var in varlist.getVariable():
   504             for var in varlist.getVariable():
   500                 var_type = var.getType().getValue()
   505                 resrce += "      %s "%var.getName()
   501                 var_name = var.getName()
   506                 address = var.getAddress()
       
   507                 if address:
       
   508                     resrce += "AT %s "%address
       
   509                 resrce += ": %s"%var.getType().getValue()
   502                 initial = var.getInitialValue()
   510                 initial = var.getInitialValue()
   503                 if initial:
   511                 if initial:
   504                     var_initial = initial.getValue()
   512                     value = str(initial.getValue())
   505                 else:
   513                     resrce += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
   506                     var_initial = None
   514                 resrce += ";\n"
   507                 if var_initial != None:
       
   508                     resrce += "      %s : %s := %s;\n"%(var_name, var_type, {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(),str(var_initial)))
       
   509                 else:
       
   510                     resrce += "      %s : %s;\n"%(var_name, var_type)
       
   511             resrce += "    END_VAR\n"
   515             resrce += "    END_VAR\n"
   512             tasks = resource.getTask()
   516         tasks = resource.getTask()
   513             for task in tasks:
   517         for task in tasks:
   514                 resrce += "    TASK %s("%task.getName()
   518             resrce += "    TASK %s("%task.getName()
   515                 args = []
   519             args = []
   516                 single = task.getSingle()
   520             single = task.getSingle()
   517                 if single:
   521             if single:
   518                     args.append("SINGLE := %s"%single)
   522                 args.append("SINGLE := %s"%single)
   519                 interval = task.getInterval()
   523             interval = task.getInterval()
   520                 if interval:
   524             if interval:
   521                     text = "t#"
   525                 text = "t#"
   522                     if interval.hour != 0:
   526                 if interval.hour != 0:
   523                         text += "%dh"%interval.hour
   527                     text += "%dh"%interval.hour
   524                     if interval.minute != 0:
   528                 if interval.minute != 0:
   525                         text += "%dm"%interval.minute
   529                     text += "%dm"%interval.minute
   526                     if interval.second != 0:
   530                 if interval.second != 0:
   527                         text += "%ds"%interval.second
   531                     text += "%ds"%interval.second
   528                     if interval.microsecond != 0:
   532                 if interval.microsecond != 0:
   529                         text += "%dms"%(interval.microsecond / 1000)
   533                     text += "%dms"%(interval.microsecond / 1000)
   530                     args.append("INTERVAL := %s"%text)
   534                 args.append("INTERVAL := %s"%text)
   531                 args.append("PRIORITY := %s"%str(task.priority.getValue()))
   535             args.append("PRIORITY := %s"%str(task.priority.getValue()))
   532                 resrce += ",".join(args) + ");\n"
   536             resrce += ",".join(args) + ");\n"
   533             for task in tasks:
   537         for task in tasks:
   534                 for instance in task.getPouInstance():
   538             for instance in task.getPouInstance():
   535                     resrce += "    PROGRAM %s WITH %s : %s;\n"%(instance.getName(), task.getName(), instance.getType())
   539                 resrce += "    PROGRAM %s WITH %s : %s;\n"%(instance.getName(), task.getName(), instance.getType())
   536             for instance in resource.getPouInstance():
   540         for instance in resource.getPouInstance():
   537                 resrce += "    PROGRAM %s : %s;\n"%(instance.getName(), instance.getType())
   541             resrce += "    PROGRAM %s : %s;\n"%(instance.getName(), instance.getType())
   538         resrce += "  END_RESOURCE\n"    
   542         resrce += "  END_RESOURCE\n"
   539         return resrce
   543         return resrce
   540         
   544         
   541             
   545             
   542 def GenerateCurrentProgram(project):
   546 def GenerateCurrentProgram(project):
   543     program = ""
   547     program = ""