7 # RTES Lab : CRKim, JBLee, youcu |
7 # RTES Lab : CRKim, JBLee, youcu |
8 # Higen Motor : Donggu Kang |
8 # Higen Motor : Donggu Kang |
9 # |
9 # |
10 # See COPYING file for copyrights details. |
10 # See COPYING file for copyrights details. |
11 |
11 |
12 import wx |
12 from __future__ import absolute_import |
13 |
13 |
14 from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY |
14 from PLCControler import LOCATION_CONFNODE, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY |
15 from ConfigTreeNode import ConfigTreeNode |
15 from ConfigTreeNode import ConfigTreeNode |
16 |
16 |
17 from ConfigEditor import NodeEditor |
17 from etherlab.ConfigEditor import NodeEditor |
18 |
18 |
19 #------------------------------------------ |
19 # ------------------------------------------ |
20 from CommonEtherCATFunction import _CommonSlave |
20 from etherlab.CommonEtherCATFunction import _CommonSlave |
21 #------------------------------------------ |
21 # ------------------------------------------ |
22 |
22 |
23 |
23 |
24 TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L", |
24 TYPECONVERSION = {"BOOL": "X", "SINT": "B", "INT": "W", "DINT": "D", "LINT": "L", |
25 "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", |
25 "USINT": "B", "UINT": "W", "UDINT": "D", "ULINT": "L", |
26 "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L"} |
26 "BYTE": "B", "WORD": "W", "DWORD": "D", "LWORD": "L"} |
27 |
27 |
28 DATATYPECONVERSION = {"BOOL" : "BIT", "SINT" : "S8", "INT" : "S16", "DINT" : "S32", "LINT" : "S64", |
28 DATATYPECONVERSION = {"BOOL": "BIT", "SINT": "S8", "INT": "S16", "DINT": "S32", "LINT": "S64", |
29 "USINT" : "U8", "UINT" : "U16", "UDINT" : "U32", "ULINT" : "U64", |
29 "USINT": "U8", "UINT": "U16", "UDINT": "U32", "ULINT": "U64", |
30 "BYTE" : "U8", "WORD" : "U16", "DWORD" : "U32", "LWORD" : "U64"} |
30 "BYTE": "U8", "WORD": "U16", "DWORD": "U32", "LWORD": "U64"} |
31 |
31 |
32 VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY} |
32 VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY} |
|
33 |
33 |
34 |
34 def ExtractHexDecValue(value): |
35 def ExtractHexDecValue(value): |
35 try: |
36 try: |
36 return int(value) |
37 return int(value) |
37 except: |
38 except Exception: |
38 pass |
39 pass |
39 try: |
40 try: |
40 return int(value.replace("#", "0"), 16) |
41 return int(value.replace("#", "0"), 16) |
41 except: |
42 except Exception: |
42 raise ValueError, "Invalid value for HexDecValue \"%s\"" % value |
43 raise ValueError("Invalid value for HexDecValue \"%s\"" % value) |
|
44 |
43 |
45 |
44 def GenerateHexDecValue(value, base=10): |
46 def GenerateHexDecValue(value, base=10): |
45 if base == 10: |
47 if base == 10: |
46 return str(value) |
48 return str(value) |
47 elif base == 16: |
49 elif base == 16: |
48 return "#x%.8x" % value |
50 return "#x%.8x" % value |
49 else: |
51 else: |
50 raise ValueError, "Not supported base" |
52 raise ValueError("Not supported base") |
|
53 |
51 |
54 |
52 def ExtractName(names, default=None): |
55 def ExtractName(names, default=None): |
53 if len(names) == 1: |
56 if len(names) == 1: |
54 return names[0].getcontent() |
57 return names[0].getcontent() |
55 else: |
58 else: |
57 if name.getLcId() == 1033: |
60 if name.getLcId() == 1033: |
58 return name.getcontent() |
61 return name.getcontent() |
59 return default |
62 return default |
60 |
63 |
61 |
64 |
62 #-------------------------------------------------- |
65 # -------------------------------------------------- |
63 # Ethercat Node |
66 # Ethercat Node |
64 #-------------------------------------------------- |
67 # -------------------------------------------------- |
65 |
68 |
66 class _EthercatSlaveCTN: |
69 class _EthercatSlaveCTN(object): |
67 NODE_PROFILE = None |
70 NODE_PROFILE = None |
68 EditorType = NodeEditor |
71 EditorType = NodeEditor |
69 |
72 |
70 def __init__(self): |
73 def __init__(self): |
71 # ----------- call ethercat mng. function -------------- |
74 # ----------- call ethercat mng. function -------------- |
72 self.CommonMethod = _CommonSlave(self) |
75 self.CommonMethod = _CommonSlave(self) |
73 |
76 |
74 def GetIconName(self): |
77 def GetIconName(self): |
75 return "Slave" |
78 return "Slave" |
76 |
79 |
77 def ExtractHexDecValue(self, value): |
80 def ExtractHexDecValue(self, value): |
78 return ExtractHexDecValue(value) |
81 return ExtractHexDecValue(value) |
79 |
82 |
80 def GetSizeOfType(self, type): |
83 def GetSizeOfType(self, type): |
81 return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None) |
84 return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None) |
82 |
85 |
83 def GetSlavePos(self): |
86 def GetSlavePos(self): |
84 return self.BaseParams.getIEC_Channel() |
87 return self.BaseParams.getIEC_Channel() |
85 |
88 |
86 def GetParamsAttributes(self, path = None): |
89 def GetParamsAttributes(self, path=None): |
87 if path: |
90 if path: |
88 parts = path.split(".", 1) |
91 parts = path.split(".", 1) |
89 if self.MandatoryParams and parts[0] == self.MandatoryParams[0]: |
92 if self.MandatoryParams and parts[0] == self.MandatoryParams[0]: |
90 return self.MandatoryParams[1].getElementInfos(parts[0], parts[1]) |
93 return self.MandatoryParams[1].getElementInfos(parts[0], parts[1]) |
91 elif self.CTNParams and parts[0] == self.CTNParams[0]: |
94 elif self.CTNParams and parts[0] == self.CTNParams[0]: |
94 params = [] |
97 params = [] |
95 if self.CTNParams: |
98 if self.CTNParams: |
96 params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0])) |
99 params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0])) |
97 else: |
100 else: |
98 params.append({ |
101 params.append({ |
99 'use': 'required', |
102 'use': 'required', |
100 'type': 'element', |
103 'type': 'element', |
101 'name': 'SlaveParams', |
104 'name': 'SlaveParams', |
102 'value': None, |
105 'value': None, |
103 'children': [] |
106 'children': [] |
104 }) |
107 }) |
105 |
108 |
106 slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) |
109 slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) |
107 params[0]['children'].insert(0, |
110 params[0]['children'].insert( |
108 {'use': 'optional', |
111 0, |
109 'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), |
112 { |
110 'name': 'Type', |
113 'use': 'optional', |
111 'value': (slave_type["device_type"], slave_type)}) |
114 'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), |
112 params[0]['children'].insert(1, |
115 'name': 'Type', |
113 {'use': 'optional', |
116 'value': (slave_type["device_type"], slave_type) |
114 'type': 'unsignedLong', |
117 }) |
115 'name': 'Alias', |
118 params[0]['children'].insert( |
116 'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())}) |
119 1, |
|
120 { |
|
121 'use': 'optional', |
|
122 'type': 'unsignedLong', |
|
123 'name': 'Alias', |
|
124 'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos()) |
|
125 }) |
117 return params |
126 return params |
118 |
127 |
119 def SetParamsAttribute(self, path, value): |
128 def SetParamsAttribute(self, path, value): |
120 self.GetSlaveInfos() |
129 self.GetSlaveInfos() |
121 position = self.BaseParams.getIEC_Channel() |
130 position = self.BaseParams.getIEC_Channel() |
122 |
131 |
123 if path == "SlaveParams.Type": |
132 if path == "SlaveParams.Type": |
124 self.CTNParent.SetSlaveType(position, value) |
133 self.CTNParent.SetSlaveType(position, value) |
125 slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) |
134 slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) |
126 value = (slave_type["device_type"], slave_type) |
135 value = (slave_type["device_type"], slave_type) |
127 #if self._View is not None: |
136 # if self._View is not None: |
128 #wx.CallAfter(self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos()) |
137 # wx.CallAfter(self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos()) |
129 #self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos() |
138 # self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos() |
130 #self._View.EtherCATManagementTreebook.PDOMonitoringPanel.PDOInfoUpdate() |
139 # self._View.EtherCATManagementTreebook.PDOMonitoringPanel.PDOInfoUpdate() |
131 #self._View.EtherCATManagementTreebook.SmartView.Create_SmartView() |
140 # self._View.EtherCATManagementTreebook.SmartView.Create_SmartView() |
132 return value, True |
141 return value, True |
133 elif path == "SlaveParams.Alias": |
142 elif path == "SlaveParams.Alias": |
134 self.CTNParent.SetSlaveAlias(position, value) |
143 self.CTNParent.SetSlaveAlias(position, value) |
135 return value, True |
144 return value, True |
136 |
145 |
137 value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) |
146 value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) |
138 |
147 |
139 # Filter IEC_Channel, Slave_Type and Alias that have specific behavior |
148 # Filter IEC_Channel, Slave_Type and Alias that have specific behavior |
140 if path == "BaseParams.IEC_Channel" and value != position: |
149 if path == "BaseParams.IEC_Channel" and value != position: |
141 self.CTNParent.SetSlavePosition(position, value) |
150 self.CTNParent.SetSlavePosition(position, value) |
142 |
151 |
143 return value, refresh |
152 return value, refresh |
144 |
153 |
145 def GetSlaveInfos(self): |
154 def GetSlaveInfos(self): |
146 return self.CTNParent.GetSlaveInfos(self.GetSlavePos()) |
155 return self.CTNParent.GetSlaveInfos(self.GetSlavePos()) |
147 |
156 |
148 def GetSlaveVariables(self, limits): |
157 def GetSlaveVariables(self, limits): |
149 return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits) |
158 return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits) |
150 |
159 |
151 def GetVariableLocationTree(self): |
160 def GetVariableLocationTree(self): |
152 return {"name": self.BaseParams.getName(), |
161 return { |
153 "type": LOCATION_CONFNODE, |
162 "name": self.BaseParams.getName(), |
154 "location": self.GetFullIEC_Channel(), |
163 "type": LOCATION_CONFNODE, |
155 "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName()) |
164 "location": self.GetFullIEC_Channel(), |
|
165 "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName()) |
156 } |
166 } |
157 |
167 |
158 def CTNGenerate_C(self, buildpath, locations): |
168 def CTNGenerate_C(self, buildpath, locations): |
159 return [],"",False |
169 return [], "", False |