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")), |