169 ("StatusWord", 0x6041, 0x00, "UINT", "I"), |
169 ("StatusWord", 0x6041, 0x00, "UINT", "I"), |
170 ("ModesOfOperationDisplay", 0x06061, 0x00, "SINT", "I"), |
170 ("ModesOfOperationDisplay", 0x06061, 0x00, "SINT", "I"), |
171 ("ActualPosition", 0x6064, 0x00, "DINT", "I"), |
171 ("ActualPosition", 0x6064, 0x00, "DINT", "I"), |
172 ] |
172 ] |
173 |
173 |
|
174 DEFAULT_RETRIEVE = " __CIA402Node_%(location)s.axis->%(name)s = __CIA402Node_%(location)s.%(name)s;" |
|
175 DEFAULT_PUBLISH = " __CIA402Node_%(location)s.%(name)s = __CIA402Node_%(location)s.axis->%(name)s;" |
|
176 |
|
177 EXTRA_NODE_VARIABLES = [ |
|
178 ("DigitalInputs", [ |
|
179 {"description": ("DigitalInputs", 0x60FD, 0x00, "UDINT", "I"), |
|
180 "publish": None} |
|
181 ]) |
|
182 ] |
|
183 EXTRA_NODE_VARIABLES_DICT = dict([("Enable" + name, value) for name, value in EXTRA_NODE_VARIABLES]) |
|
184 |
174 class _EthercatCIA402SlaveCTN(_EthercatSlaveCTN): |
185 class _EthercatCIA402SlaveCTN(_EthercatSlaveCTN): |
175 XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?> |
186 XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?> |
176 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
187 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
177 <xsd:element name="CIA402SlaveParams"> |
188 <xsd:element name="CIA402SlaveParams"> |
178 <xsd:complexType> |
189 <xsd:complexType> |
179 %s |
190 %s |
180 </xsd:complexType> |
191 </xsd:complexType> |
181 </xsd:element> |
192 </xsd:element> |
182 </xsd:schema> |
193 </xsd:schema> |
183 """ % AxisXSD |
194 """ % ("\n".join(['<xsd:attribute name="Enable%s" type="xsd:boolean" use="optional" default="false"/>' % category |
|
195 for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD) |
184 |
196 |
185 NODE_PROFILE = 402 |
197 NODE_PROFILE = 402 |
186 EditorType = CIA402NodeEditor |
198 EditorType = CIA402NodeEditor |
187 |
199 |
188 ConfNodeMethods = [ |
200 ConfNodeMethods = [ |
255 "MCL_headers": Headers, |
267 "MCL_headers": Headers, |
256 "extern_located_variables_declaration": [], |
268 "extern_located_variables_declaration": [], |
257 "entry_variables": [], |
269 "entry_variables": [], |
258 "init_axis_params": [], |
270 "init_axis_params": [], |
259 "init_entry_variables": [], |
271 "init_entry_variables": [], |
|
272 "extra_variables_retrieve": [], |
|
273 "extra_variables_publish": [] |
260 } |
274 } |
261 |
275 |
262 for variable in NODE_VARIABLES: |
276 variables = NODE_VARIABLES[:] |
|
277 |
|
278 params = self.CTNParams[1].getElementInfos(self.CTNParams[0]) |
|
279 for param in params["children"]: |
|
280 if param["name"] in EXTRA_NODE_VARIABLES_DICT: |
|
281 if param["value"]: |
|
282 extra_variables = EXTRA_NODE_VARIABLES_DICT.get(param["name"]) |
|
283 for variable_infos in extra_variables: |
|
284 var_infos = { |
|
285 "location": location_str, |
|
286 "name": variable_infos["description"][0] |
|
287 } |
|
288 variables.append(variable_infos["description"]) |
|
289 retrieve_template = variable_infos.get("retrieve", DEFAULT_RETRIEVE) |
|
290 publish_template = variable_infos.get("publish", DEFAULT_PUBLISH) |
|
291 |
|
292 if retrieve_template is not None: |
|
293 str_completion["extra_variables_retrieve"].append( |
|
294 retrieve_template % var_infos) |
|
295 if publish_template is not None: |
|
296 str_completion["extra_variables_publish"].append( |
|
297 publish_template % var_infos) |
|
298 elif param["value"] is not None: |
|
299 param_infos = { |
|
300 "location": location_str, |
|
301 "param_name": param["name"], |
|
302 } |
|
303 if param["type"] == "boolean": |
|
304 param_infos["param_value"] = {True: "true", False: "false"}[param["value"]] |
|
305 else: |
|
306 param_infos["param_value"] = str(param["value"]) |
|
307 str_completion["init_axis_params"].append( |
|
308 " __CIA402Node_%(location)s.axis->%(param_name)s = %(param_value)s;" % param_infos) |
|
309 |
|
310 for variable in variables: |
263 var_infos = dict(zip(["name", "index", "subindex", "var_type", "dir"], variable)) |
311 var_infos = dict(zip(["name", "index", "subindex", "var_type", "dir"], variable)) |
264 var_infos["location"] = location_str |
312 var_infos["location"] = location_str |
265 var_infos["var_size"] = self.GetSizeOfType(var_infos["var_type"]) |
313 var_infos["var_size"] = self.GetSizeOfType(var_infos["var_type"]) |
266 var_infos["var_name"] = "__%(dir)s%(var_size)s%(location)s_%(index)d_%(subindex)d" % var_infos |
314 var_infos["var_name"] = "__%(dir)s%(var_size)s%(location)s_%(index)d_%(subindex)d" % var_infos |
267 |
315 |
274 |
322 |
275 self.CTNParent.FileGenerator.DeclareVariable( |
323 self.CTNParent.FileGenerator.DeclareVariable( |
276 self.GetSlavePos(), var_infos["index"], var_infos["subindex"], |
324 self.GetSlavePos(), var_infos["index"], var_infos["subindex"], |
277 var_infos["var_type"], var_infos["dir"], var_infos["var_name"]) |
325 var_infos["var_type"], var_infos["dir"], var_infos["var_name"]) |
278 |
326 |
279 params = self.CTNParams[1].getElementInfos(self.CTNParams[0]) |
|
280 for param in params["children"]: |
|
281 if param["value"] is not None and param["name"] != "DynamicPDOs": |
|
282 param_infos = { |
|
283 "location": location_str, |
|
284 "param_name": param["name"], |
|
285 } |
|
286 if param["type"] == "boolean": |
|
287 param_infos["param_value"] = {True: "true", False: "false"}[param["value"]] |
|
288 else: |
|
289 param_infos["param_value"] = str(param["value"]) |
|
290 str_completion["init_axis_params"].append( |
|
291 " __CIA402Node_%(location)s.axis->%(param_name)s = %(param_value)s;" % param_infos) |
|
292 |
|
293 for element in ["extern_located_variables_declaration", |
327 for element in ["extern_located_variables_declaration", |
294 "entry_variables", |
328 "entry_variables", |
295 "init_axis_params", |
329 "init_axis_params", |
296 "init_entry_variables"]: |
330 "init_entry_variables", |
|
331 "extra_variables_retrieve", |
|
332 "extra_variables_publish"]: |
297 str_completion[element] = "\n".join(str_completion[element]) |
333 str_completion[element] = "\n".join(str_completion[element]) |
298 |
334 |
299 Gen_CIA402Nodefile_path = os.path.join(buildpath, "cia402node_%s.c"%location_str) |
335 Gen_CIA402Nodefile_path = os.path.join(buildpath, "cia402node_%s.c"%location_str) |
300 cia402nodefile = open(Gen_CIA402Nodefile_path, 'w') |
336 cia402nodefile = open(Gen_CIA402Nodefile_path, 'w') |
301 cia402nodefile.write(plc_cia402node_code % str_completion) |
337 cia402nodefile.write(plc_cia402node_code % str_completion) |