PLCGenerator.py
changeset 33 0dd4a876392f
parent 31 d833bf7567b1
child 37 256eedd275d0
equal deleted inserted replaced
32:cf9efccff009 33:0dd4a876392f
    63         self.InitialSteps = []
    63         self.InitialSteps = []
    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, located, vars in self.Interface:
    69             for var_type, var_name, var_address, 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):
    75         if self.Type == "FUNCTION":
    75         if self.Type == "FUNCTION":
    76             self.ReturnType = interface.getReturnType().getValue()
    76             self.ReturnType = interface.getReturnType().getValue()
    77         for varlist in interface.getContent():
    77         for varlist in interface.getContent():
    78             variables = []
    78             variables = []
       
    79             located = False
    79             for var in varlist["value"].getVariable():
    80             for var in varlist["value"].getVariable():
    80                 type = var.getType().getValue()
    81                 type = var.getType().getValue()
    81                 initial = var.getInitialValue()
    82                 initial = var.getInitialValue()
    82                 if initial:
    83                 if initial:
    83                     initial_value = initial.getValue()
    84                     initial_value = initial.getValue()
    84                 else:
    85                 else:
    85                     initial_value = None
    86                     initial_value = None
    86                 address = var.getAddress()
    87                 address = var.getAddress()
    87                 if address == "":
    88                 if address == "":
    88                     address = None
    89                     address = None
       
    90                 else:
       
    91                     located = True
    89                 variables.append((type, var.getName(), address, initial_value))
    92                 variables.append((type, var.getName(), address, initial_value))
    90             self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), 
    93             self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), 
    91                             varlist["value"].getConstant(), variables))
    94                             varlist["value"].getConstant(), located, variables))
    92     
    95     
    93     def GenerateProgram(self, pou):
    96     def GenerateProgram(self, pou):
    94         body = pou.getBody()
    97         body = pou.getBody()
    95         body_content = body.getContent()
    98         body_content = body.getContent()
    96         body_type = body_content["name"]
    99         body_type = body_content["name"]
   141                         value = self.ComputeFBDExpression(body, connections[0])
   144                         value = self.ComputeFBDExpression(body, connections[0])
   142                         vars.append(self.ExtractModifier(variable, value))
   145                         vars.append(self.ExtractModifier(variable, value))
   143                 variable = instance.outputVariables.getVariable()[0]
   146                 variable = instance.outputVariables.getVariable()[0]
   144                 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
   147                 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
   145             elif block_infos["type"] == "functionBlock":
   148             elif block_infos["type"] == "functionBlock":
   146                 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
   149                 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]:
   147                     self.Interface.append(("VAR", False, False, []))
   150                     self.Interface.append(("VAR", False, False, False, []))
   148                 if not self.IsAlreadyDefined(name):
   151                 if not self.IsAlreadyDefined(name):
   149                     self.Interface[-1][3].append((type, name, None, None))
   152                     self.Interface[-1][4].append((type, name, None, None))
   150                     vars = []
   153                     vars = []
   151                     for variable in instance.inputVariables.getVariable():
   154                     for variable in instance.inputVariables.getVariable():
   152                         connections = variable.connectionPointIn.getConnections()
   155                         connections = variable.connectionPointIn.getConnections()
   153                         if connections and len(connections) == 1:
   156                         if connections and len(connections) == 1:
   154                             parameter = variable.getFormalParameter()
   157                             parameter = variable.getFormalParameter()
   427                 elif edge.getValue() == "falling":
   430                 elif edge.getValue() == "falling":
   428                     return self.AddTrigger("F_TRIG", text)
   431                     return self.AddTrigger("F_TRIG", text)
   429         return text
   432         return text
   430     
   433     
   431     def AddTrigger(self, edge, text):
   434     def AddTrigger(self, edge, text):
   432         if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
   435         if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]:
   433             self.Interface.append(("VAR", False, False, []))
   436             self.Interface.append(("VAR", False, False, False, []))
   434         i = 1
   437         i = 1
   435         name = "%s%d"%(edge, i)
   438         name = "%s%d"%(edge, i)
   436         while self.IsAlreadyDefined(name):
   439         while self.IsAlreadyDefined(name):
   437             i += 1
   440             i += 1
   438             name = "%s%d"%(edge, i)
   441             name = "%s%d"%(edge, i)
   439         self.Interface[-1][3].append((edge, name, None, None))
   442         self.Interface[-1][4].append((edge, name, None, None))
   440         self.Program += "  %s(CLK := %s);\n"%(name, text)
   443         self.Program += "  %s(CLK := %s);\n"%(name, text)
   441         return "%s.Q"%name
   444         return "%s.Q"%name
   442     
   445     
   443     def GenerateSTProgram(self):
   446     def GenerateSTProgram(self):
   444         if self.ReturnType:
   447         if self.ReturnType:
   445             program = "%s %s : %s\n"%(self.Type, self.Name, self.ReturnType)
   448             program = "%s %s : %s\n"%(self.Type, self.Name, self.ReturnType)
   446         else:
   449         else:
   447             program = "%s %s\n"%(self.Type, self.Name)
   450             program = "%s %s\n"%(self.Type, self.Name)
   448         for list_type, retain, constant, variables in self.Interface:
   451         for list_type, retain, constant, located, variables in self.Interface:
   449             program += "  %s"%list_type
   452             program += "  %s"%list_type
   450             if retain:
   453             if retain:
   451                 program += " RETAIN"
   454                 program += " RETAIN"
   452             if constant:
   455             if constant:
   453                 program += " CONSTANT"
   456                 program += " CONSTANT"
   456                 program += "    %s "%var_name
   459                 program += "    %s "%var_name
   457                 if var_address != None:
   460                 if var_address != None:
   458                     program += "AT %s "%var_address
   461                     program += "AT %s "%var_address
   459                 program += ": %s"%var_type
   462                 program += ": %s"%var_type
   460                 if var_initial != None:
   463                 if var_initial != None:
   461                     program += " := %s"%{"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial))
   464                     value = {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial))
       
   465                     if var_type in ["STRING", "WSTRING"]:
       
   466                         program += " := \"%s\""%value
       
   467                     else:
       
   468                         program += " := %s"%value
   462                 program += ";\n"
   469                 program += ";\n"
   463             program += "  END_VAR\n"
   470             program += "  END_VAR\n"
   464         program += "\n"
   471         program += "\n"
   465         program += self.Program
   472         program += self.Program
   466         program += "END_%s\n\n"%self.Type
   473         program += "END_%s\n\n"%self.Type
   474                 config += " RETAIN"
   481                 config += " RETAIN"
   475             if varlist.getConstant():
   482             if varlist.getConstant():
   476                 config += " CONSTANT"
   483                 config += " CONSTANT"
   477             config += "\n"
   484             config += "\n"
   478             for var in varlist.getVariable():
   485             for var in varlist.getVariable():
   479                 config += "      %s "%var.getName()
   486                 var_type = var.getType().getValue()
       
   487                 config += "    %s "%var.getName()
   480                 address = var.getAddress()
   488                 address = var.getAddress()
   481                 if address:
   489                 if address:
   482                     config += "AT %s "%address
   490                     config += "AT %s "%address
   483                 config += ": %s"%var.getType().getValue()
   491                 config += ": %s"%var_type
   484                 initial = var.getInitialValue()
   492                 initial = var.getInitialValue()
   485                 if initial:
   493                 if initial:
   486                     value = str(initial.getValue())
   494                     value = str(initial.getValue())
   487                     config += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
   495                     value = {"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
       
   496                     if var_type in ["STRING", "WSTRING"]:
       
   497                         config += " := \"%s\""%value
       
   498                     else:
       
   499                         config += " := %s"%value
   488                 config += ";\n"
   500                 config += ";\n"
   489             config += "  END_VAR\n"
   501             config += "  END_VAR\n"
   490         for resource in configuration.getResource():
   502         for resource in configuration.getResource():
   491             config += self.GenerateResource(resource)
   503             config += self.GenerateResource(resource)
   492         config += "END_CONFIGURATION\n"
   504         config += "END_CONFIGURATION\n"
   493         return config
   505         return config
   494         
   506         
   495     def GenerateResource(self, resource):
   507     def GenerateResource(self, resource):
   496         resrce = "\n  RESOURCE %s\n"%resource.getName()
   508         resrce = "\n  RESOURCE %s ON BEREMIZ\n"%resource.getName()
   497         for varlist in resource.getGlobalVars():
   509         for varlist in resource.getGlobalVars():
   498             resrce += "    VAR_GLOBAL"
   510             resrce += "    VAR_GLOBAL"
   499             if varlist.getRetain():
   511             if varlist.getRetain():
   500                 resrce += " RETAIN"
   512                 resrce += " RETAIN"
   501             if varlist.getConstant():
   513             if varlist.getConstant():
   502                 resrce += " CONSTANT"
   514                 resrce += " CONSTANT"
   503             resrce += "\n"
   515             resrce += "\n"
   504             for var in varlist.getVariable():
   516             for var in varlist.getVariable():
       
   517                 var_type = var.getType().getValue()
   505                 resrce += "      %s "%var.getName()
   518                 resrce += "      %s "%var.getName()
   506                 address = var.getAddress()
   519                 address = var.getAddress()
   507                 if address:
   520                 if address:
   508                     resrce += "AT %s "%address
   521                     resrce += "AT %s "%address
   509                 resrce += ": %s"%var.getType().getValue()
   522                 resrce += ": %s"%var.getType().getValue()
   510                 initial = var.getInitialValue()
   523                 initial = var.getInitialValue()
   511                 if initial:
   524                 if initial:
   512                     value = str(initial.getValue())
   525                     value = str(initial.getValue())
   513                     resrce += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
   526                     value = {"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
       
   527                     if var_type in ["STRING", "WSTRING"]:
       
   528                         resrce += " := \"%s\""%value
       
   529                     else:
       
   530                         resrce += " := %s"%value
   514                 resrce += ";\n"
   531                 resrce += ";\n"
   515             resrce += "    END_VAR\n"
   532             resrce += "    END_VAR\n"
   516         tasks = resource.getTask()
   533         tasks = resource.getTask()
   517         for task in tasks:
   534         for task in tasks:
   518             resrce += "    TASK %s("%task.getName()
   535             resrce += "    TASK %s("%task.getName()