PLCGenerator.py
changeset 483 779a519f78f2
parent 408 0e389fa5b160
child 499 cecb4369fa42
equal deleted inserted replaced
482:4edbbab206a3 483:779a519f78f2
   247         var_number = 0
   247         var_number = 0
   248         # Generate any global variable in configuration
   248         # Generate any global variable in configuration
   249         for varlist in configuration.getglobalVars():
   249         for varlist in configuration.getglobalVars():
   250             # Generate variable block with modifier
   250             # Generate variable block with modifier
   251             config += [("  VAR_GLOBAL", ())]
   251             config += [("  VAR_GLOBAL", ())]
   252             if varlist.getretain():
       
   253                 config += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
       
   254             if varlist.getconstant():
   252             if varlist.getconstant():
   255                 config += [(" CONSTANT", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "constant"))]
   253                 config += [(" CONSTANT", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "constant"))]
       
   254             elif varlist.getretain():
       
   255                 config += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
       
   256             elif varlist.getretain():
       
   257                 config += [(" NON_RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   256             config += [("\n", ())]
   258             config += [("\n", ())]
   257             # Generate any variable of this block
   259             # Generate any variable of this block
   258             for var in varlist.getvariable():
   260             for var in varlist.getvariable():
   259                 vartype_content = var.gettype().getcontent()
   261                 vartype_content = var.gettype().getcontent()
   260                 # Variable type is a user data type
   262                 # Variable type is a user data type
   300         var_number = 0
   302         var_number = 0
   301         # Generate any global variable in configuration
   303         # Generate any global variable in configuration
   302         for varlist in resource.getglobalVars():
   304         for varlist in resource.getglobalVars():
   303             # Generate variable block with modifier
   305             # Generate variable block with modifier
   304             resrce += [("    VAR_GLOBAL", ())]
   306             resrce += [("    VAR_GLOBAL", ())]
   305             if varlist.getretain():
       
   306                 resrce += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
       
   307             if varlist.getconstant():
   307             if varlist.getconstant():
   308                 resrce += [(" CONSTANT", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "constant"))]
   308                 resrce += [(" CONSTANT", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "constant"))]
       
   309             elif varlist.getretain():
       
   310                 resrce += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
       
   311             elif varlist.getnonretain():
       
   312                 resrce += [(" NON_RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   309             resrce += [("\n", ())]
   313             resrce += [("\n", ())]
   310             # Generate any variable of this block
   314             # Generate any variable of this block
   311             for var in varlist.getvariable():
   315             for var in varlist.getvariable():
   312                 vartype_content = var.gettype().getcontent()
   316                 vartype_content = var.gettype().getcontent()
   313                 # Variable type is a user data type
   317                 # Variable type is a user data type
   469         self.ActionNumber += 1
   473         self.ActionNumber += 1
   470         return self.ActionNumber
   474         return self.ActionNumber
   471     
   475     
   472     # Test if a variable has already been defined
   476     # Test if a variable has already been defined
   473     def IsAlreadyDefined(self, name):
   477     def IsAlreadyDefined(self, name):
   474         for list_type, retain, constant, located, vars in self.Interface:
   478         for list_type, option, located, vars in self.Interface:
   475             for var_type, var_name, var_address, var_initial in vars:
   479             for var_type, var_name, var_address, var_initial in vars:
   476                 if name == var_name:
   480                 if name == var_name:
   477                     return True
   481                     return True
   478         return False
   482         return False
   479     
   483     
   480     # Return the type of a variable defined in interface
   484     # Return the type of a variable defined in interface
   481     def GetVariableType(self, name):
   485     def GetVariableType(self, name):
   482         for list_type, retain, constant, located, vars in self.Interface:
   486         for list_type, option, located, vars in self.Interface:
   483             for var_type, var_name, var_address, var_initial in vars:
   487             for var_type, var_name, var_address, var_initial in vars:
   484                 if name == var_name:
   488                 if name == var_name:
   485                     return var_type
   489                     return var_type
   486         return None
   490         return None
   487     
   491     
   590                                 variables.append((vartype_content["name"].upper(), var.getname(), None, initial_value))
   594                                 variables.append((vartype_content["name"].upper(), var.getname(), None, initial_value))
   591                         elif address is not None:
   595                         elif address is not None:
   592                             located.append((vartype_content["name"], var.getname(), address, initial_value))
   596                             located.append((vartype_content["name"], var.getname(), address, initial_value))
   593                         else:
   597                         else:
   594                             variables.append((vartype_content["name"], var.getname(), None, initial_value))
   598                             variables.append((vartype_content["name"], var.getname(), None, initial_value))
       
   599                 if varlist["value"].getconstant():
       
   600                     option = "CONSTANT"
       
   601                 elif varlist["value"].getretain():
       
   602                     option = "RETAIN"
       
   603                 elif varlist["value"].getnonretain():
       
   604                     option = "NON_RETAIN"
       
   605                 else:
       
   606                     option = None
   595                 if len(variables) > 0:
   607                 if len(variables) > 0:
   596                     self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getretain(), 
   608                     self.Interface.append((varTypeNames[varlist["name"]], option, False, variables))
   597                                 varlist["value"].getconstant(), False, variables))
       
   598                 if len(located) > 0:
   609                 if len(located) > 0:
   599                     self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getretain(), 
   610                     self.Interface.append((varTypeNames[varlist["name"]], option, True, located))
   600                                 varlist["value"].getconstant(), True, located))
       
   601         
   611         
   602     def ComputeConnectionTypes(self, pou):
   612     def ComputeConnectionTypes(self, pou):
   603         body = pou.getbody()
   613         body = pou.getbody()
   604         if isinstance(body, ListType):
   614         if isinstance(body, ListType):
   605             body = body[0]
   615             body = body[0]
   949             elif edge == "falling":
   959             elif edge == "falling":
   950                 return self.AddTrigger("F_TRIG", expression, var_info + ("falling",))
   960                 return self.AddTrigger("F_TRIG", expression, var_info + ("falling",))
   951         return expression
   961         return expression
   952     
   962     
   953     def AddTrigger(self, edge, expression, var_info):
   963     def AddTrigger(self, edge, expression, var_info):
   954         if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]:
   964         if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
   955             self.Interface.append(("VAR", False, False, False, []))
   965             self.Interface.append(("VAR", None, False, []))
   956         i = 1
   966         i = 1
   957         name = "%s%d"%(edge, i)
   967         name = "%s%d"%(edge, i)
   958         while self.IsAlreadyDefined(name):
   968         while self.IsAlreadyDefined(name):
   959             i += 1
   969             i += 1
   960             name = "%s%d"%(edge, i)
   970             name = "%s%d"%(edge, i)
   961         self.Interface[-1][4].append((edge, name, None, None))
   971         self.Interface[-1][3].append((edge, name, None, None))
   962         self.Program += [(self.CurrentIndent, ()), (name, var_info), ("(CLK := ", ())] 
   972         self.Program += [(self.CurrentIndent, ()), (name, var_info), ("(CLK := ", ())] 
   963         self.Program += expression
   973         self.Program += expression
   964         self.Program += [(");\n", ())]
   974         self.Program += [(");\n", ())]
   965         return [("%s.Q"%name, var_info)]
   975         return [("%s.Q"%name, var_info)]
   966     
   976     
  1254         if len(self.Interface) == 0:
  1264         if len(self.Interface) == 0:
  1255             raise PLCGenException, _("No variable defined in \"%s\" POU")%self.Name
  1265             raise PLCGenException, _("No variable defined in \"%s\" POU")%self.Name
  1256         if len(self.Program) == 0 :
  1266         if len(self.Program) == 0 :
  1257             raise PLCGenException, _("No body defined in \"%s\" POU")%self.Name
  1267             raise PLCGenException, _("No body defined in \"%s\" POU")%self.Name
  1258         var_number = 0
  1268         var_number = 0
  1259         for list_type, retain, constant, located, variables in self.Interface:
  1269         for list_type, option, located, variables in self.Interface:
  1260             program += [("  %s"%list_type, ())]
  1270             program += [("  %s"%list_type, ())]
  1261             if retain:
  1271             if option is not None:
  1262                 program += [(" RETAIN", (self.TagName, "variable", (var_number, var_number + len(variables)), "retain"))]
  1272                 program += [(" %s"%option, (self.TagName, "variable", (var_number, var_number + len(variables)), option.lower()))]
  1263             if constant:
       
  1264                 program += [(" CONSTANT", (self.TagName, "variable", (var_number, var_number + len(variables)), "constant"))]
       
  1265             program += [("\n", ())]
  1273             program += [("\n", ())]
  1266             for var_type, var_name, var_address, var_initial in variables:
  1274             for var_type, var_name, var_address, var_initial in variables:
  1267                 program += [("    ", ())]
  1275                 program += [("    ", ())]
  1268                 if var_name:
  1276                 if var_name:
  1269                     program += [(var_name, (self.TagName, "variable", var_number, "name")),
  1277                     program += [(var_name, (self.TagName, "variable", var_number, "name")),