51 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
51 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
52 <xsd:element name="CanFestivalSlaveNode"> |
52 <xsd:element name="CanFestivalSlaveNode"> |
53 <xsd:complexType> |
53 <xsd:complexType> |
54 <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/> |
54 <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/> |
55 <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/> |
55 <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/> |
56 <xsd:attribute name="NodeId" type="xsd:string" use="optional" default="%(Slave_NodeId)d"/> |
56 <xsd:attribute name="NodeId" type="xsd:integer" use="optional" default="%(Slave_NodeId)d"/> |
57 <xsd:attribute name="Sync_Align" type="xsd:integer" use="optional" default="0"/> |
57 <xsd:attribute name="Sync_Align" type="xsd:integer" use="optional" default="0"/> |
58 <xsd:attribute name="Sync_Align_Ratio" use="optional" default="50"> |
58 <xsd:attribute name="Sync_Align_Ratio" use="optional" default="50"> |
59 <xsd:simpleType> |
59 <xsd:simpleType> |
60 <xsd:restriction base="xsd:integer"> |
60 <xsd:restriction base="xsd:integer"> |
61 <xsd:minInclusive value="1"/> |
61 <xsd:minInclusive value="1"/> |
167 prefix = "_".join(map(str, current_location)) |
170 prefix = "_".join(map(str, current_location)) |
168 Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix ) |
171 Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix ) |
169 # Create a new copy of the model |
172 # Create a new copy of the model |
170 slave = self.GetCurrentNodeCopy() |
173 slave = self.GetCurrentNodeCopy() |
171 slave.SetNodeName("OD_%s"%prefix) |
174 slave.SetNodeName("OD_%s"%prefix) |
|
175 slave.SetNodeID(self.CanFestivalSlaveNode.getNodeId()) |
172 # allow access to local OD from Slave PLC |
176 # allow access to local OD from Slave PLC |
173 pointers = config_utils.LocalODPointers(locations, current_location, slave) |
177 pointers = config_utils.LocalODPointers(locations, current_location, slave) |
174 res = gen_cfile.GenerateFile(Gen_OD_path, slave, pointers) |
178 res = gen_cfile.GenerateFile(Gen_OD_path, slave, pointers) |
175 if res : |
179 if res : |
176 raise Exception, res |
180 raise Exception, res |
217 def GetBufferState(self): |
221 def GetBufferState(self): |
218 return self.GetCurrentBufferState() |
222 return self.GetCurrentBufferState() |
219 |
223 |
220 ConfNodeMethods = [] |
224 ConfNodeMethods = [] |
221 |
225 |
|
226 class _NodeManager(NodeManager): |
|
227 |
|
228 def __init__(self, parent, *args, **kwargs): |
|
229 NodeManager.__init__(self, *args, **kwargs) |
|
230 self.Parent = parent |
|
231 |
|
232 def __del__(self): |
|
233 self.Parent = None |
|
234 |
|
235 def GetCurrentNodeName(self): |
|
236 return self.Parent.CTNName() |
|
237 |
|
238 def GetCurrentNodeID(self): |
|
239 return self.Parent.CanFestivalNode.getNodeId() |
|
240 |
222 class _NodeListCTN(NodeList): |
241 class _NodeListCTN(NodeList): |
223 XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?> |
242 XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?> |
224 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
243 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
225 <xsd:element name="CanFestivalNode"> |
244 <xsd:element name="CanFestivalNode"> |
226 <xsd:complexType> |
245 <xsd:complexType> |
227 <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/> |
246 <xsd:attribute name="CAN_Device" type="xsd:string" use="optional" default="%(CAN_Device)s"/> |
228 <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/> |
247 <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/> |
229 <xsd:attribute name="NodeId" type="xsd:string" use="optional" default="%(Master_NodeId)d"/> |
248 <xsd:attribute name="NodeId" type="xsd:integer" use="optional" default="%(Master_NodeId)d"/> |
230 <xsd:attribute name="Sync_TPDOs" type="xsd:boolean" use="optional" default="true"/> |
249 <xsd:attribute name="Sync_TPDOs" type="xsd:boolean" use="optional" default="true"/> |
231 </xsd:complexType> |
250 </xsd:complexType> |
232 </xsd:element> |
251 </xsd:element> |
233 </xsd:schema> |
252 </xsd:schema> |
234 """ % DEFAULT_SETTINGS |
253 """ % DEFAULT_SETTINGS |
235 |
254 |
236 EditorType = NetworkEditor |
255 EditorType = NetworkEditor |
237 IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png") |
256 IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png") |
238 |
257 |
239 def __init__(self): |
258 def __init__(self): |
240 manager = NodeManager() |
259 manager = _NodeManager(self) |
241 NodeList.__init__(self, manager) |
260 NodeList.__init__(self, manager) |
242 self.LoadProject(self.CTNPath()) |
261 self.LoadProject(self.CTNPath()) |
243 self.SetNetworkName(self.BaseParams.getName()) |
262 self.SetNetworkName(self.BaseParams.getName()) |
244 |
263 |
245 def GetCanDevice(self): |
264 def GetCanDevice(self): |
246 return self.CanFestivalNode.getCan_Device() |
265 return self.CanFestivalNode.getCan_Device() |
247 |
266 |
248 def SetParamsAttribute(self, path, value): |
267 def SetParamsAttribute(self, path, value): |
249 result = ConfigTreeNode.SetParamsAttribute(self, path, value) |
268 if path == "CanFestivalNode.NodeId": |
|
269 nodeid = self.CanFestivalNode.getNodeId() |
|
270 if value != nodeid: |
|
271 slaves = self.GetSlaveIDs() |
|
272 dir = (value - nodeid) / abs(value - nodeid) |
|
273 while value in slaves and value >= 0: |
|
274 value += dir |
|
275 if value < 0: |
|
276 value = nodeid |
|
277 |
|
278 value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) |
|
279 refresh_network = False |
250 |
280 |
251 # Filter IEC_Channel and Name, that have specific behavior |
281 # Filter IEC_Channel and Name, that have specific behavior |
252 if path == "BaseParams.IEC_Channel" and self._View is not None: |
282 if path == "BaseParams.IEC_Channel" and self._View is not None: |
253 self._View.SetBusId(self.GetCurrentLocation()) |
283 self._View.SetBusId(self.GetCurrentLocation()) |
254 elif path == "BaseParams.Name": |
284 elif path == "BaseParams.Name": |
255 self.SetNetworkName(value) |
285 self.SetNetworkName(value) |
256 |
286 refresh_network = True |
257 return result |
287 elif path == "CanFestivalNode.NodeId": |
258 |
288 refresh_network = True |
|
289 |
|
290 if refresh_network and self._View is not None: |
|
291 wx.CallAfter(self._View.RefreshBufferState) |
|
292 return value, refresh |
|
293 |
259 _GeneratedMasterView = None |
294 _GeneratedMasterView = None |
260 def _ShowGeneratedMaster(self): |
295 def _ShowGeneratedMaster(self): |
261 self._OpenView("Generated master") |
296 self._OpenView("Generated master") |
262 |
297 |
263 def _OpenView(self, name=None, onlyopened=False): |
298 def _OpenView(self, name=None, onlyopened=False): |
333 # Create a new copy of the model with DCF loaded with PDO mappings for desired location |
368 # Create a new copy of the model with DCF loaded with PDO mappings for desired location |
334 try: |
369 try: |
335 master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(),"OD_%s"%prefix) |
370 master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(),"OD_%s"%prefix) |
336 except config_utils.PDOmappingException, e: |
371 except config_utils.PDOmappingException, e: |
337 raise Exception, e.message |
372 raise Exception, e.message |
|
373 master.SetNodeID(self.CanFestivalNode.getNodeId()) |
338 # Do generate C file. |
374 # Do generate C file. |
339 res = gen_cfile.GenerateFile(Gen_OD_path, master, pointers) |
375 res = gen_cfile.GenerateFile(Gen_OD_path, master, pointers) |
340 if res : |
376 if res : |
341 raise Exception, res |
377 raise Exception, res |
342 |
378 |