etherlab/EthercatCIA402Slave.py
changeset 2355 fec77f2b9e07
parent 2165 02a2b5dee5e3
child 2356 c26e0c66d8d5
equal deleted inserted replaced
2354:9460872f1440 2355:fec77f2b9e07
    18 from MotionLibrary import Headers, AxisXSD
    18 from MotionLibrary import Headers, AxisXSD
    19 from EthercatSlave import _EthercatSlaveCTN, _CommonSlave
    19 from EthercatSlave import _EthercatSlaveCTN, _CommonSlave
    20 from ConfigEditor import CIA402NodeEditor
    20 from ConfigEditor import CIA402NodeEditor
    21 
    21 
    22 # Definition of node variables that have to be mapped in PDO
    22 # Definition of node variables that have to be mapped in PDO
    23 # [(name, index, subindex, type, 
    23 # [(name, index, subindex, type,
    24 #   direction for master ('I': input, 'Q': output)),...]
    24 #   direction for master ('I': input, 'Q': output)),...]
    25 NODE_VARIABLES = [
    25 NODE_VARIABLES = [
    26     ("ControlWord",             0x6040, 0x00, "UINT", "Q"),
    26     ("ControlWord",             0x6040, 0x00, "UINT", "Q"),
    27     ("TargetPosition",          0x607a, 0x00, "DINT", "Q"),
    27     ("TargetPosition",          0x607a, 0x00, "DINT", "Q"),
    28     ("TargetVelocity",          0x60ff, 0x00, "DINT", "Q"),
    28     ("TargetVelocity",          0x60ff, 0x00, "DINT", "Q"),
    36 ]
    36 ]
    37 
    37 
    38 # Definition of optional node variables that can be added to PDO mapping.
    38 # Definition of optional node variables that can be added to PDO mapping.
    39 # A checkbox will be displayed for each section in node configuration panel to
    39 # A checkbox will be displayed for each section in node configuration panel to
    40 # enable them
    40 # enable them
    41 # [(section_name, 
    41 # [(section_name,
    42 #   [{'description', (name, index, subindex, type, 
    42 #   [{'description', (name, index, subindex, type,
    43 #                     direction for master ('I': input, 'Q': output)),
    43 #                     direction for master ('I': input, 'Q': output)),
    44 #     'retrieve', string_template_for_retrieve_variable (None: not retrieved, 
    44 #     'retrieve', string_template_for_retrieve_variable (None: not retrieved,
    45 #                                 default string template if not defined),
    45 #                                 default string template if not defined),
    46 #     'publish', string_template_for_publish_variable (None: not published, 
    46 #     'publish', string_template_for_publish_variable (None: not published,
    47 #                                 default string template if not defined),
    47 #                                 default string template if not defined),
    48 #    },...]
    48 #    },...]
    49 EXTRA_NODE_VARIABLES = [
    49 EXTRA_NODE_VARIABLES = [
    50     ("ErrorCode", [
    50     ("ErrorCode", [
    51         {"description": ("ErrorCode", 0x603F, 0x00, "UINT", "I"),
    51         {"description": ("ErrorCode", 0x603F, 0x00, "UINT", "I"),
    72 ]
    72 ]
    73 
    73 
    74 # List of parameters name in no configuration panel for optional variable
    74 # List of parameters name in no configuration panel for optional variable
    75 # sections
    75 # sections
    76 EXTRA_NODE_VARIABLES_DICT = {
    76 EXTRA_NODE_VARIABLES_DICT = {
    77     "Enable" + name: params 
    77     "Enable" + name: params
    78     for name, params in EXTRA_NODE_VARIABLES}
    78     for name, params in EXTRA_NODE_VARIABLES}
    79 
    79 
    80 # List of block to define to interface MCL to fieldbus for specific functions
    80 # List of block to define to interface MCL to fieldbus for specific functions
    81 FIELDBUS_INTERFACE_GLOBAL_INSTANCES = [
    81 FIELDBUS_INTERFACE_GLOBAL_INSTANCES = [
    82     {"blocktype": "GetTorqueLimit", 
    82     {"blocktype": "GetTorqueLimit",
    83      "inputs": [],
    83      "inputs": [],
    84      "outputs": [{"name": "TorqueLimitPos", "type": "UINT"},
    84      "outputs": [{"name": "TorqueLimitPos", "type": "UINT"},
    85                  {"name": "TorqueLimitNeg", "type": "UINT"}]},
    85                  {"name": "TorqueLimitNeg", "type": "UINT"}]},
    86     {"blocktype": "SetTorqueLimit", 
    86     {"blocktype": "SetTorqueLimit",
    87      "inputs": [{"name": "TorqueLimitPos", "type": "UINT"},
    87      "inputs": [{"name": "TorqueLimitPos", "type": "UINT"},
    88                 {"name": "TorqueLimitNeg", "type": "UINT"}],
    88                 {"name": "TorqueLimitNeg", "type": "UINT"}],
    89      "outputs": []},
    89      "outputs": []},
    90 ]
    90 ]
    91 
    91 
   102         </xsd:complexType>
   102         </xsd:complexType>
   103       </xsd:element>
   103       </xsd:element>
   104     </xsd:schema>
   104     </xsd:schema>
   105     """ % ("\n".join(["""\
   105     """ % ("\n".join(["""\
   106           <xsd:attribute name="Enable%s" type="xsd:boolean"
   106           <xsd:attribute name="Enable%s" type="xsd:boolean"
   107                          use="optional" default="false"/>""" % category 
   107                          use="optional" default="false"/>""" % category
   108                 for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD)
   108                 for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD)
   109     
   109 
   110     NODE_PROFILE = 402
   110     NODE_PROFILE = 402
   111     EditorType = CIA402NodeEditor
   111     EditorType = CIA402NodeEditor
   112     
   112 
   113     ConfNodeMethods = [
   113     ConfNodeMethods = [
   114         {"bitmap" : "CIA402AxisRef",
   114         {"bitmap" : "CIA402AxisRef",
   115          "name" : _("Axis Ref"),
   115          "name" : _("Axis Ref"),
   116          "tooltip" : _("Initiate Drag'n drop of Axis ref located variable"),
   116          "tooltip" : _("Initiate Drag'n drop of Axis ref located variable"),
   117          "method" : "_getCIA402AxisRef",
   117          "method" : "_getCIA402AxisRef",
   120          "name" : _("Axis Pos"),
   120          "name" : _("Axis Pos"),
   121          "tooltip" : _("Initiate Drag'n drop of Network position located variable"),
   121          "tooltip" : _("Initiate Drag'n drop of Network position located variable"),
   122          "method" : "_getCIA402NetworkPosition",
   122          "method" : "_getCIA402NetworkPosition",
   123          "push": True},
   123          "push": True},
   124     ]
   124     ]
   125     
   125 
   126 #--------------------------------------------------
   126 #--------------------------------------------------
   127 #    class code
   127 #    class code
   128 #--------------------------------------------------    
   128 #--------------------------------------------------
   129     
   129 
   130     def __init__(self):
   130     def __init__(self):
   131         # ----------- call ethercat mng. function --------------
   131         # ----------- call ethercat mng. function --------------
   132         self.CommonMethod = _CommonSlave(self)
   132         self.CommonMethod = _CommonSlave(self)
   133     
   133 
   134     def GetIconName(self):
   134     def GetIconName(self):
   135         return "CIA402Slave"
   135         return "CIA402Slave"
   136     
   136 
   137     def SetParamsAttribute(self, path, value):
   137     def SetParamsAttribute(self, path, value):
   138         if path == "CIA402SlaveParams.Type":
   138         if path == "CIA402SlaveParams.Type":
   139             path = "SlaveParams.Type"
   139             path = "SlaveParams.Type"
   140         elif path == "CIA402SlaveParams.Alias":
   140         elif path == "CIA402SlaveParams.Alias":
   141             path = "SlaveParams.Alias"
   141             path = "SlaveParams.Alias"
   142         return _EthercatSlaveCTN.SetParamsAttribute(self, path, value)
   142         return _EthercatSlaveCTN.SetParamsAttribute(self, path, value)
   143     
   143 
   144     def GetVariableLocationTree(self):
   144     def GetVariableLocationTree(self):
   145         axis_name = self.CTNName()
   145         axis_name = self.CTNName()
   146         current_location = self.GetCurrentLocation()
   146         current_location = self.GetCurrentLocation()
   147         children = [{"name": name_frmt % (axis_name),
   147         children = [{"name": name_frmt % (axis_name),
   148                      "type": LOCATION_VAR_INPUT,
   148                      "type": LOCATION_VAR_INPUT,
   161         return  {"name": axis_name,
   161         return  {"name": axis_name,
   162                  "type": LOCATION_CONFNODE,
   162                  "type": LOCATION_CONFNODE,
   163                  "location": self.GetFullIEC_Channel(),
   163                  "location": self.GetFullIEC_Channel(),
   164                  "children": children,
   164                  "children": children,
   165         }
   165         }
   166     
   166 
   167     def CTNGlobalInstances(self):
   167     def CTNGlobalInstances(self):
   168         current_location = self.GetCurrentLocation()
   168         current_location = self.GetCurrentLocation()
   169         return [("%s_%s" % (block_infos["blocktype"], 
   169         return [("%s_%s" % (block_infos["blocktype"],
   170                             "_".join(map(str, current_location))),
   170                             "_".join(map(str, current_location))),
   171                  "EtherLab%s" % block_infos["blocktype"], "") 
   171                  "EtherLab%s" % block_infos["blocktype"], "")
   172                 for block_infos in FIELDBUS_INTERFACE_GLOBAL_INSTANCES]
   172                 for block_infos in FIELDBUS_INTERFACE_GLOBAL_INSTANCES]
   173     
   173 
   174     def StartDragNDrop(self, data):
   174     def StartDragNDrop(self, data):
   175         data_obj = wx.TextDataObject(str(data))
   175         data_obj = wx.TextDataObject(str(data))
   176         dragSource = wx.DropSource(self.GetCTRoot().AppFrame)
   176         dragSource = wx.DropSource(self.GetCTRoot().AppFrame)
   177         dragSource.SetData(data_obj)
   177         dragSource.SetData(data_obj)
   178         dragSource.DoDragDrop()
   178         dragSource.DoDragDrop()
   179     
   179 
   180     def _getCIA402NetworkPosition(self):
   180     def _getCIA402NetworkPosition(self):
   181         self.StartDragNDrop(
   181         self.StartDragNDrop(
   182             ("%%IW%s" % ".".join(map(str, self.GetCurrentLocation())), 
   182             ("%%IW%s" % ".".join(map(str, self.GetCurrentLocation())),
   183              "location", "UINT", self.CTNName() + "_Pos", ""))
   183              "location", "UINT", self.CTNName() + "_Pos", ""))
   184         
   184 
   185     def _getCIA402AxisRef(self):
   185     def _getCIA402AxisRef(self):
   186         self.StartDragNDrop(
   186         self.StartDragNDrop(
   187             ("%%IW%s.402" % ".".join(map(str, self.GetCurrentLocation())), 
   187             ("%%IW%s.402" % ".".join(map(str, self.GetCurrentLocation())),
   188              "location", "AXIS_REF", self.CTNName(), ""))
   188              "location", "AXIS_REF", self.CTNName(), ""))
   189         
   189 
   190     def CTNGenerate_C(self, buildpath, locations):
   190     def CTNGenerate_C(self, buildpath, locations):
   191         current_location = self.GetCurrentLocation()
   191         current_location = self.GetCurrentLocation()
   192         
   192 
   193         location_str = "_".join(map(lambda x:str(x), current_location))
   193         location_str = "_".join(map(lambda x:str(x), current_location))
   194         slave_pos = self.GetSlavePos()
   194         slave_pos = self.GetSlavePos()
   195         MCL_headers = Headers
   195         MCL_headers = Headers
   196         
   196 
   197         # Open CIA402 node code template file 
   197         # Open CIA402 node code template file
   198         plc_cia402node_filepath = os.path.join(os.path.split(__file__)[0], 
   198         plc_cia402node_filepath = os.path.join(os.path.split(__file__)[0],
   199                                                "plc_cia402node.c")
   199                                                "plc_cia402node.c")
   200         plc_cia402node_file = open(plc_cia402node_filepath, 'r')
   200         plc_cia402node_file = open(plc_cia402node_filepath, 'r')
   201         plc_cia402node_code = plc_cia402node_file.read()
   201         plc_cia402node_code = plc_cia402node_file.read()
   202         plc_cia402node_file.close()
   202         plc_cia402node_file.close()
   203         
   203 
   204         # Init list of generated strings for each code template file section
   204         # Init list of generated strings for each code template file section
   205         fieldbus_interface_declaration = []
   205         fieldbus_interface_declaration = []
   206         fieldbus_interface_definition = []
   206         fieldbus_interface_definition = []
   207         init_axis_params = []
   207         init_axis_params = []
   208         extra_variables_retrieve = []
   208         extra_variables_retrieve = []
   209         extra_variables_publish = []
   209         extra_variables_publish = []
   210         extern_located_variables_declaration = []
   210         extern_located_variables_declaration = []
   211         entry_variables = []
   211         entry_variables = []
   212         init_entry_variables = []
   212         init_entry_variables = []
   213         
   213 
   214         # Fieldbus interface code sections
   214         # Fieldbus interface code sections
   215         for blocktype_infos in FIELDBUS_INTERFACE_GLOBAL_INSTANCES:
   215         for blocktype_infos in FIELDBUS_INTERFACE_GLOBAL_INSTANCES:
   216             blocktype = blocktype_infos["blocktype"]
   216             blocktype = blocktype_infos["blocktype"]
   217             ucase_blocktype = blocktype.upper()
   217             ucase_blocktype = blocktype.upper()
   218             blockname = "_".join([ucase_blocktype, location_str])
   218             blockname = "_".join([ucase_blocktype, location_str])
   219             
   219 
   220             extract_inputs = "\n".join(["""\
   220             extract_inputs = "\n".join(["""\
   221     __SET_VAR(%s->, %s,, %s);""" % (blockname, input_name, input_value)
   221     __SET_VAR(%s->, %s,, %s);""" % (blockname, input_name, input_value)
   222                 for (input_name, input_value) in [
   222                 for (input_name, input_value) in [
   223                     ("EXECUTE", "__GET_VAR(data__->EXECUTE)")] + [
   223                     ("EXECUTE", "__GET_VAR(data__->EXECUTE)")] + [
   224                     (input["name"].upper(), 
   224                     (input["name"].upper(),
   225                      "__GET_VAR(data__->%s)" % input["name"].upper())
   225                      "__GET_VAR(data__->%s)" % input["name"].upper())
   226                     for input in blocktype_infos["inputs"]]
   226                     for input in blocktype_infos["inputs"]]
   227                 ])
   227                 ])
   228             
   228 
   229             
   229 
   230             return_outputs = "\n".join(["""\
   230             return_outputs = "\n".join(["""\
   231     __SET_VAR(data__->,%(output_name)s,, 
   231     __SET_VAR(data__->,%(output_name)s,,
   232               __GET_VAR(%(blockname)s->%(output_name)s));""" % locals()
   232               __GET_VAR(%(blockname)s->%(output_name)s));""" % locals()
   233                     for output_name in ["DONE", "BUSY", "ERROR"] + [
   233                     for output_name in ["DONE", "BUSY", "ERROR"] + [
   234                         output["name"].upper()
   234                         output["name"].upper()
   235                         for output in blocktype_infos["outputs"]]
   235                         for output in blocktype_infos["outputs"]]
   236                 ])
   236                 ])
   237                         
   237 
   238             fieldbus_interface_declaration.append("""
   238             fieldbus_interface_declaration.append("""
   239 extern void ETHERLAB%(ucase_blocktype)s_body__(ETHERLAB%(ucase_blocktype)s* data__);
   239 extern void ETHERLAB%(ucase_blocktype)s_body__(ETHERLAB%(ucase_blocktype)s* data__);
   240 void __%(blocktype)s_%(location_str)s(MC_%(ucase_blocktype)s *data__) {
   240 void __%(blocktype)s_%(location_str)s(MC_%(ucase_blocktype)s *data__) {
   241 __DECLARE_GLOBAL_PROTOTYPE(ETHERLAB%(ucase_blocktype)s, %(blockname)s);
   241 __DECLARE_GLOBAL_PROTOTYPE(ETHERLAB%(ucase_blocktype)s, %(blockname)s);
   242 ETHERLAB%(ucase_blocktype)s* %(blockname)s = __GET_GLOBAL_%(blockname)s();
   242 ETHERLAB%(ucase_blocktype)s* %(blockname)s = __GET_GLOBAL_%(blockname)s();
   243 __SET_VAR(%(blockname)s->, POS,, AxsPub.axis->NetworkPosition);
   243 __SET_VAR(%(blockname)s->, POS,, AxsPub.axis->NetworkPosition);
   244 %(extract_inputs)s
   244 %(extract_inputs)s
   245 ETHERLAB%(ucase_blocktype)s_body__(%(blockname)s);
   245 ETHERLAB%(ucase_blocktype)s_body__(%(blockname)s);
   246 %(return_outputs)s
   246 %(return_outputs)s
   247 }""" % locals())
   247 }""" % locals())
   248             
   248 
   249             fieldbus_interface_definition.append("""\
   249             fieldbus_interface_definition.append("""\
   250         AxsPub.axis->__mcl_func_MC_%(blocktype)s = __%(blocktype)s_%(location_str)s;\
   250         AxsPub.axis->__mcl_func_MC_%(blocktype)s = __%(blocktype)s_%(location_str)s;\
   251 """ % locals())
   251 """ % locals())
   252         
   252 
   253         # Get a copy list of default variables to map
   253         # Get a copy list of default variables to map
   254         variables = NODE_VARIABLES[:]
   254         variables = NODE_VARIABLES[:]
   255         
   255 
   256         # Set AxisRef public struct members value
   256         # Set AxisRef public struct members value
   257         node_params = self.CTNParams[1].getElementInfos(self.CTNParams[0])
   257         node_params = self.CTNParams[1].getElementInfos(self.CTNParams[0])
   258         for param in node_params["children"]:
   258         for param in node_params["children"]:
   259             param_name = param["name"]
   259             param_name = param["name"]
   260             
   260 
   261             # Param is optional variables section enable flag
   261             # Param is optional variables section enable flag
   262             extra_node_variable_infos = EXTRA_NODE_VARIABLES_DICT.get(param_name)
   262             extra_node_variable_infos = EXTRA_NODE_VARIABLES_DICT.get(param_name)
   263             if extra_node_variable_infos is not None:
   263             if extra_node_variable_infos is not None:
   264                 param_name = param_name.replace("Enable", "") + "Enabled"
   264                 param_name = param_name.replace("Enable", "") + "Enabled"
   265                 
   265 
   266                 if not param["value"]:
   266                 if not param["value"]:
   267                     continue
   267                     continue
   268                 
   268 
   269                 # Optional variables section is enabled
   269                 # Optional variables section is enabled
   270                 for variable_infos in extra_node_variable_infos:
   270                 for variable_infos in extra_node_variable_infos:
   271                     var_name = variable_infos["description"][0]
   271                     var_name = variable_infos["description"][0]
   272                     
   272 
   273                     # Add each variables defined in section description to the
   273                     # Add each variables defined in section description to the
   274                     # list of variables to map
   274                     # list of variables to map
   275                     variables.append(variable_infos["description"])
   275                     variables.append(variable_infos["description"])
   276                     
   276 
   277                     # Add code to publish or retrive variable
   277                     # Add code to publish or retrive variable
   278                     for var_exchange_dir, str_list, default_template in [
   278                     for var_exchange_dir, str_list, default_template in [
   279                          ("retrieve", extra_variables_retrieve,
   279                          ("retrieve", extra_variables_retrieve,
   280                           "    AxsPub.axis->%(var_name)s = *(AxsPub.%(var_name)s);"),
   280                           "    AxsPub.axis->%(var_name)s = *(AxsPub.%(var_name)s);"),
   281                          ("publish", extra_variables_publish,
   281                          ("publish", extra_variables_publish,
   282                           "    *(AxsPub.%(var_name)s) = AxsPub.axis->%(var_name)s;")]:
   282                           "    *(AxsPub.%(var_name)s) = AxsPub.axis->%(var_name)s;")]:
   283                         
   283 
   284                         template = variable_infos.get(var_exchange_dir, 
   284                         template = variable_infos.get(var_exchange_dir,
   285                                                       default_template)
   285                                                       default_template)
   286                         if template is not None:
   286                         if template is not None:
   287                             extra_variables_publish.append(template % locals())
   287                             extra_variables_publish.append(template % locals())
   288             
   288 
   289             # Set AxisRef public struct member value if defined
   289             # Set AxisRef public struct member value if defined
   290             if param["value"] is not None:
   290             if param["value"] is not None:
   291                 param_value = ({True: "1", False: "0"}[param["value"]]
   291                 param_value = ({True: "1", False: "0"}[param["value"]]
   292                                if param["type"] == "boolean"
   292                                if param["type"] == "boolean"
   293                                else str(param["value"]))
   293                                else str(param["value"]))
   294                 
   294 
   295                 init_axis_params.append("""\
   295                 init_axis_params.append("""\
   296         AxsPub.axis->%(param_name)s = %(param_value)s;""" % locals())
   296         AxsPub.axis->%(param_name)s = %(param_value)s;""" % locals())
   297         
   297 
   298         # Add each variable in list of variables to map to master list of
   298         # Add each variable in list of variables to map to master list of
   299         # variables to add to network configuration
   299         # variables to add to network configuration
   300         for name, index, subindex, var_type, dir in variables:
   300         for name, index, subindex, var_type, dir in variables:
   301             var_size = self.GetSizeOfType(var_type)
   301             var_size = self.GetSizeOfType(var_type)
   302             var_name = """\
   302             var_name = """\
   303 __%(dir)s%(var_size)s%(location_str)s_%(index)d_%(subindex)d""" % locals()
   303 __%(dir)s%(var_size)s%(location_str)s_%(index)d_%(subindex)d""" % locals()
   304             
   304 
   305             extern_located_variables_declaration.append(
   305             extern_located_variables_declaration.append(
   306                     "IEC_%(var_type)s *%(var_name)s;" % locals())
   306                     "IEC_%(var_type)s *%(var_name)s;" % locals())
   307             entry_variables.append(
   307             entry_variables.append(
   308                     "    IEC_%(var_type)s *%(name)s;" % locals())
   308                     "    IEC_%(var_type)s *%(name)s;" % locals())
   309             init_entry_variables.append(
   309             init_entry_variables.append(
   310                     "    AxsPub.%(name)s = %(var_name)s;" % locals())
   310                     "    AxsPub.%(name)s = %(var_name)s;" % locals())
   311             
   311 
   312             self.CTNParent.FileGenerator.DeclareVariable(
   312             self.CTNParent.FileGenerator.DeclareVariable(
   313                     slave_pos, index, subindex, var_type, dir, var_name)
   313                     slave_pos, index, subindex, var_type, dir, var_name)
   314         
   314 
   315         # Add newline between string in list of generated strings for sections
   315         # Add newline between string in list of generated strings for sections
   316         [fieldbus_interface_declaration, fieldbus_interface_definition,
   316         [fieldbus_interface_declaration, fieldbus_interface_definition,
   317          init_axis_params, extra_variables_retrieve, extra_variables_publish,
   317          init_axis_params, extra_variables_retrieve, extra_variables_publish,
   318          extern_located_variables_declaration, entry_variables, 
   318          extern_located_variables_declaration, entry_variables,
   319          init_entry_variables] = map(lambda l: "\n".join(l), [
   319          init_entry_variables] = map(lambda l: "\n".join(l), [
   320             fieldbus_interface_declaration, fieldbus_interface_definition,
   320             fieldbus_interface_declaration, fieldbus_interface_definition,
   321             init_axis_params, extra_variables_retrieve, extra_variables_publish,
   321             init_axis_params, extra_variables_retrieve, extra_variables_publish,
   322             extern_located_variables_declaration, entry_variables, 
   322             extern_located_variables_declaration, entry_variables,
   323             init_entry_variables])
   323             init_entry_variables])
   324         
   324 
   325         # Write generated content to CIA402 node file
   325         # Write generated content to CIA402 node file
   326         Gen_CIA402Nodefile_path = os.path.join(buildpath, 
   326         Gen_CIA402Nodefile_path = os.path.join(buildpath,
   327                                 "cia402node_%s.c"%location_str)
   327                                 "cia402node_%s.c"%location_str)
   328         cia402nodefile = open(Gen_CIA402Nodefile_path, 'w')
   328         cia402nodefile = open(Gen_CIA402Nodefile_path, 'w')
   329         cia402nodefile.write(plc_cia402node_code % locals())
   329         cia402nodefile.write(plc_cia402node_code % locals())
   330         cia402nodefile.close()
   330         cia402nodefile.close()
   331         
   331 
   332         return [(Gen_CIA402Nodefile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))],"",True
   332         return [(Gen_CIA402Nodefile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))],"",True