41 from plcopen.types_enums import * |
41 from plcopen.types_enums import * |
42 from plcopen.XSLTModelQuery import _StringValue, _BoolValue, _translate_args |
42 from plcopen.XSLTModelQuery import _StringValue, _BoolValue, _translate_args |
43 from plcopen.InstancesPathCollector import InstancesPathCollector |
43 from plcopen.InstancesPathCollector import InstancesPathCollector |
44 from plcopen.POUVariablesCollector import POUVariablesCollector |
44 from plcopen.POUVariablesCollector import POUVariablesCollector |
45 from plcopen.InstanceTagnameCollector import InstanceTagnameCollector |
45 from plcopen.InstanceTagnameCollector import InstanceTagnameCollector |
|
46 from plcopen.VariableInfoCollector import VariableInfoCollector |
46 from graphics.GraphicCommons import * |
47 from graphics.GraphicCommons import * |
47 from PLCGenerator import * |
48 from PLCGenerator import * |
48 |
49 |
49 duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?") |
50 duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?") |
50 |
51 |
69 lib_el.append(deepcopy(lib)) |
70 lib_el.append(deepcopy(lib)) |
70 else: |
71 else: |
71 for ctn in self.Controller.ConfNodeTypes: |
72 for ctn in self.Controller.ConfNodeTypes: |
72 lib_el.append(deepcopy(ctn["types"])) |
73 lib_el.append(deepcopy(ctn["types"])) |
73 return self.resolve_string(etree.tostring(lib_el), context) |
74 return self.resolve_string(etree.tostring(lib_el), context) |
74 |
|
75 |
|
76 # ------------------------------------------------------------------------------- |
|
77 # Helpers object for generating pou var list |
|
78 # ------------------------------------------------------------------------------- |
|
79 |
|
80 |
|
81 class _VariableInfos(object): |
|
82 __slots__ = ["Name", "Class", "Option", "Location", "InitialValue", |
|
83 "Edit", "Documentation", "Type", "Tree", "Number"] |
|
84 |
|
85 def __init__(self, *args): |
|
86 for attr, value in zip(self.__slots__, args): |
|
87 setattr(self, attr, value if value is not None else "") |
|
88 |
|
89 def copy(self): |
|
90 return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__]) |
|
91 |
|
92 |
|
93 class VariablesInfosFactory(object): |
|
94 |
|
95 def __init__(self, variables): |
|
96 self.Variables = variables |
|
97 self.TreeStack = [] |
|
98 self.Type = None |
|
99 self.Dimensions = None |
|
100 |
|
101 def SetType(self, context, *args): |
|
102 self.Type = args[0][0] |
|
103 |
|
104 def GetType(self): |
|
105 if len(self.Dimensions) > 0: |
|
106 return ("array", self.Type, self.Dimensions) |
|
107 return self.Type |
|
108 |
|
109 def GetTree(self): |
|
110 return (self.TreeStack.pop(-1), self.Dimensions) |
|
111 |
|
112 def AddDimension(self, context, *args): |
|
113 self.Dimensions.append(tuple( |
|
114 _translate_args([_StringValue] * 2, args))) |
|
115 |
|
116 def AddTree(self, context, *args): |
|
117 self.TreeStack.append([]) |
|
118 self.Dimensions = [] |
|
119 |
|
120 def AddVarToTree(self, context, *args): |
|
121 var = (args[0][0], self.Type, self.GetTree()) |
|
122 self.TreeStack[-1].append(var) |
|
123 |
|
124 def AddVariable(self, context, *args): |
|
125 self.Variables.append(_VariableInfos(*( |
|
126 _translate_args([_StringValue] * 5 + [_BoolValue] + [_StringValue], args) + |
|
127 [self.GetType(), self.GetTree()]))) |
|
128 |
75 |
129 |
76 |
130 # ------------------------------------------------------------------------------- |
77 # ------------------------------------------------------------------------------- |
131 # Helpers object for generating pou block instances list |
78 # Helpers object for generating pou block instances list |
132 # ------------------------------------------------------------------------------- |
79 # ------------------------------------------------------------------------------- |
383 self.LastNewIndex = 0 |
330 self.LastNewIndex = 0 |
384 self.Reset() |
331 self.Reset() |
385 self.InstancesPathCollector = InstancesPathCollector(self) |
332 self.InstancesPathCollector = InstancesPathCollector(self) |
386 self.POUVariablesCollector = POUVariablesCollector(self) |
333 self.POUVariablesCollector = POUVariablesCollector(self) |
387 self.InstanceTagnameCollector = InstanceTagnameCollector(self) |
334 self.InstanceTagnameCollector = InstanceTagnameCollector(self) |
|
335 self.VariableInfoCollector = VariableInfoCollector(self) |
388 |
336 |
389 # Reset PLCControler internal variables |
337 # Reset PLCControler internal variables |
390 def Reset(self): |
338 def Reset(self): |
391 self.Project = None |
339 self.Project = None |
392 self.ProjectBufferEnabled = True |
340 self.ProjectBufferEnabled = True |
1160 current_varlist.appendvariable(tempvar) |
1108 current_varlist.appendvariable(tempvar) |
1161 return varlist_list |
1109 return varlist_list |
1162 |
1110 |
1163 def GetVariableDictionary(self, object_with_vars, tree=False, debug=False): |
1111 def GetVariableDictionary(self, object_with_vars, tree=False, debug=False): |
1164 variables = [] |
1112 variables = [] |
1165 factory = VariablesInfosFactory(variables) |
1113 factory = self.VariableInfoCollector.Collect(object_with_vars, |
1166 |
1114 debug, variables, tree) |
1167 parser = etree.XMLParser() |
|
1168 parser.resolvers.add(LibraryResolver(self, debug)) |
|
1169 |
|
1170 variables_infos_xslt_tree = etree.XSLT( |
|
1171 etree.parse( |
|
1172 os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), |
|
1173 parser), |
|
1174 extensions={("var_infos_ns", name): getattr(factory, name) |
|
1175 for name in ["SetType", "AddDimension", "AddTree", |
|
1176 "AddVarToTree", "AddVariable"]}) |
|
1177 variables_infos_xslt_tree( |
|
1178 object_with_vars, tree=etree.XSLT.strparam(str(tree))) |
|
1179 |
|
1180 return variables |
1115 return variables |
1181 |
1116 |
1182 # Add a global var to configuration to configuration |
1117 # Add a global var to configuration to configuration |
1183 def AddConfigurationGlobalVar(self, config_name, var_type, var_name, |
1118 def AddConfigurationGlobalVar(self, config_name, var_type, var_name, |
1184 location="", description=""): |
1119 location="", description=""): |
1327 # Verify that the pou has an interface |
1262 # Verify that the pou has an interface |
1328 if pou.interface is not None: |
1263 if pou.interface is not None: |
1329 # Return the return type if there is one |
1264 # Return the return type if there is one |
1330 return_type = pou.interface.getreturnType() |
1265 return_type = pou.interface.getreturnType() |
1331 if return_type is not None: |
1266 if return_type is not None: |
1332 factory = VariablesInfosFactory([]) |
1267 factory = self.VariableInfoCollector.Collect(return_type, |
1333 |
1268 debug, [], tree) |
1334 parser = etree.XMLParser() |
|
1335 parser.resolvers.add(LibraryResolver(self)) |
|
1336 |
|
1337 return_type_infos_xslt_tree = etree.XSLT( |
|
1338 etree.parse( |
|
1339 os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"), |
|
1340 parser), |
|
1341 extensions={("var_infos_ns", name): getattr(factory, name) |
|
1342 for name in ["SetType", "AddDimension", |
|
1343 "AddTree", "AddVarToTree"]}) |
|
1344 return_type_infos_xslt_tree( |
|
1345 return_type, tree=etree.XSLT.strparam(str(tree))) |
|
1346 if tree: |
1269 if tree: |
1347 return [factory.GetType(), factory.GetTree()] |
1270 return [factory.GetType(), factory.GetTree()] |
1348 return factory.GetType() |
1271 return factory.GetType() |
1349 |
1272 |
1350 if tree: |
1273 if tree: |