etherlab/etherlab.py
changeset 2084 579af800b359
parent 2083 0f7ab170c862
child 2085 ae263886ae92
equal deleted inserted replaced
2083:0f7ab170c862 2084:579af800b359
   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)