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 |