--- a/etherlab/etherlab.py Thu Oct 18 01:23:35 2012 +0200
+++ b/etherlab/etherlab.py Fri Oct 19 12:43:42 2012 +0200
@@ -171,6 +171,17 @@
("ActualPosition", 0x6064, 0x00, "DINT", "I"),
+ DEFAULT_RETRIEVE = " __CIA402Node_%(location)s.axis->%(name)s = __CIA402Node_%(location)s.%(name)s;" + DEFAULT_PUBLISH = " __CIA402Node_%(location)s.%(name)s = __CIA402Node_%(location)s.axis->%(name)s;" + EXTRA_NODE_VARIABLES = [ + {"description": ("DigitalInputs", 0x60FD, 0x00, "UDINT", "I"), + EXTRA_NODE_VARIABLES_DICT = dict([("Enable" + name, value) for name, value in EXTRA_NODE_VARIABLES]) class _EthercatCIA402SlaveCTN(_EthercatSlaveCTN):
XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
@@ -180,7 +191,8 @@
+ """ % ("\n".join(['<xsd:attribute name="Enable%s" type="xsd:boolean" use="optional" default="false"/>' % category + for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD) EditorType = CIA402NodeEditor
@@ -257,9 +269,45 @@
"init_entry_variables": [],
+ "extra_variables_retrieve": [], + "extra_variables_publish": [] - for variable in NODE_VARIABLES:
+ variables = NODE_VARIABLES[:] + params = self.CTNParams[1].getElementInfos(self.CTNParams[0]) + for param in params["children"]: + if param["name"] in EXTRA_NODE_VARIABLES_DICT: + extra_variables = EXTRA_NODE_VARIABLES_DICT.get(param["name"]) + for variable_infos in extra_variables: + "location": location_str, + "name": variable_infos["description"][0] + variables.append(variable_infos["description"]) + retrieve_template = variable_infos.get("retrieve", DEFAULT_RETRIEVE) + publish_template = variable_infos.get("publish", DEFAULT_PUBLISH) + if retrieve_template is not None: + str_completion["extra_variables_retrieve"].append( + retrieve_template % var_infos) + if publish_template is not None: + str_completion["extra_variables_publish"].append( + publish_template % var_infos) + elif param["value"] is not None: + "location": location_str, + "param_name": param["name"], + if param["type"] == "boolean": + param_infos["param_value"] = {True: "true", False: "false"}[param["value"]] + param_infos["param_value"] = str(param["value"]) + str_completion["init_axis_params"].append( + " __CIA402Node_%(location)s.axis->%(param_name)s = %(param_value)s;" % param_infos) + for variable in variables: var_infos = dict(zip(["name", "index", "subindex", "var_type", "dir"], variable))
var_infos["location"] = location_str
var_infos["var_size"] = self.GetSizeOfType(var_infos["var_type"])
@@ -276,24 +324,12 @@
self.GetSlavePos(), var_infos["index"], var_infos["subindex"],
var_infos["var_type"], var_infos["dir"], var_infos["var_name"])
- params = self.CTNParams[1].getElementInfos(self.CTNParams[0])
- for param in params["children"]:
- if param["value"] is not None and param["name"] != "DynamicPDOs":
- "location": location_str,
- "param_name": param["name"],
- if param["type"] == "boolean":
- param_infos["param_value"] = {True: "true", False: "false"}[param["value"]]
- param_infos["param_value"] = str(param["value"])
- str_completion["init_axis_params"].append(
- " __CIA402Node_%(location)s.axis->%(param_name)s = %(param_value)s;" % param_infos)
for element in ["extern_located_variables_declaration",
- "init_entry_variables"]:
+ "init_entry_variables", + "extra_variables_retrieve", + "extra_variables_publish"]: str_completion[element] = "\n".join(str_completion[element])
Gen_CIA402Nodefile_path = os.path.join(buildpath, "cia402node_%s.c"%location_str)
--- a/etherlab/plc_cia402node.c Thu Oct 18 01:23:35 2012 +0200
+++ b/etherlab/plc_cia402node.c Fri Oct 19 12:43:42 2012 +0200
@@ -104,8 +104,12 @@
+ // Default variables retrieve __CIA402Node_%(location)s.axis->PowerFeedback = __CIA402Node_%(location)s.state == __OperationEnabled;
__CIA402Node_%(location)s.axis->ActualPosition = (IEC_LREAL)(*(__CIA402Node_%(location)s.ActualPosition)) * __CIA402Node_%(location)s.axis->RatioDenominator / __CIA402Node_%(location)s.axis->RatioNumerator;
+ // Extra variables retrieve +%(extra_variables_retrieve)s void __publish_%(location)s()
@@ -135,10 +139,14 @@
+ // Default variables publish if (__CIA402Node_%(location)s.axis->CSP && *(__CIA402Node_%(location)s.ModesOfOperationDisplay) == 0x08) {
*(__CIA402Node_%(location)s.TargetPosition) = (IEC_DINT)(__CIA402Node_%(location)s.axis->PositionSetPoint * __CIA402Node_%(location)s.axis->RatioNumerator / __CIA402Node_%(location)s.axis->RatioDenominator);
*(__CIA402Node_%(location)s.TargetPosition) = *(__CIA402Node_%(location)s.ActualPosition);
+ // Extra variables publish +%(extra_variables_publish)s