Laurent@2111: import wx Laurent@2111: Laurent@2111: from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY Laurent@2111: from ConfigTreeNode import ConfigTreeNode Laurent@2111: Laurent@2111: from ConfigEditor import NodeEditor Laurent@2111: Edouard@2152: #------------------------------------------ Edouard@2152: from CommonEtherCATFunction import _CommonSlave Edouard@2152: #------------------------------------------ Edouard@2152: Edouard@2152: Laurent@2111: TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L", Laurent@2111: "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", Laurent@2111: "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L"} Laurent@2111: Laurent@2111: DATATYPECONVERSION = {"BOOL" : "BIT", "SINT" : "S8", "INT" : "S16", "DINT" : "S32", "LINT" : "S64", Laurent@2111: "USINT" : "U8", "UINT" : "U16", "UDINT" : "U32", "ULINT" : "U64", Laurent@2111: "BYTE" : "U8", "WORD" : "U16", "DWORD" : "U32", "LWORD" : "U64"} Laurent@2111: Laurent@2111: VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY} Laurent@2111: Laurent@2111: def ExtractHexDecValue(value): Laurent@2111: try: Laurent@2111: return int(value) Laurent@2111: except: Laurent@2111: pass Laurent@2111: try: Laurent@2111: return int(value.replace("#", "0"), 16) Laurent@2111: except: Laurent@2111: raise ValueError, "Invalid value for HexDecValue \"%s\"" % value Laurent@2111: Laurent@2111: def GenerateHexDecValue(value, base=10): Laurent@2111: if base == 10: Laurent@2111: return str(value) Laurent@2111: elif base == 16: Laurent@2111: return "#x%.8x" % value Laurent@2111: else: Laurent@2111: raise ValueError, "Not supported base" Laurent@2111: Laurent@2111: def ExtractName(names, default=None): Laurent@2111: if len(names) == 1: Laurent@2111: return names[0].getcontent() Laurent@2111: else: Laurent@2111: for name in names: Laurent@2111: if name.getLcId() == 1033: Laurent@2111: return name.getcontent() Laurent@2111: return default Laurent@2111: Edouard@2152: Laurent@2111: #-------------------------------------------------- Laurent@2111: # Ethercat Node Laurent@2111: #-------------------------------------------------- Laurent@2111: Laurent@2111: class _EthercatSlaveCTN: Laurent@2111: NODE_PROFILE = None Laurent@2111: EditorType = NodeEditor Laurent@2111: Edouard@2152: def __init__(self): Edouard@2152: # ----------- call ethercat mng. function -------------- Edouard@2152: self.CommonMethod = _CommonSlave(self) Edouard@2152: Laurent@2111: def GetIconName(self): Laurent@2111: return "Slave" Laurent@2111: Laurent@2111: def ExtractHexDecValue(self, value): Laurent@2111: return ExtractHexDecValue(value) Laurent@2111: Laurent@2111: def GetSizeOfType(self, type): Laurent@2111: return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None) Laurent@2111: Laurent@2111: def GetSlavePos(self): Laurent@2111: return self.BaseParams.getIEC_Channel() Laurent@2111: Laurent@2111: def GetParamsAttributes(self, path = None): Laurent@2111: if path: Laurent@2111: parts = path.split(".", 1) Laurent@2111: if self.MandatoryParams and parts[0] == self.MandatoryParams[0]: Laurent@2111: return self.MandatoryParams[1].getElementInfos(parts[0], parts[1]) Laurent@2111: elif self.CTNParams and parts[0] == self.CTNParams[0]: Laurent@2111: return self.CTNParams[1].getElementInfos(parts[0], parts[1]) Laurent@2111: else: Laurent@2111: params = [] Laurent@2111: if self.CTNParams: Laurent@2111: params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0])) Laurent@2111: else: Laurent@2111: params.append({ Laurent@2111: 'use': 'required', Laurent@2111: 'type': 'element', Laurent@2111: 'name': 'SlaveParams', Laurent@2111: 'value': None, Laurent@2111: 'children': [] Laurent@2111: }) Laurent@2111: Laurent@2111: slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) Laurent@2111: params[0]['children'].insert(0, Laurent@2111: {'use': 'optional', Laurent@2111: 'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), Laurent@2111: 'name': 'Type', Laurent@2111: 'value': (slave_type["device_type"], slave_type)}) Laurent@2111: params[0]['children'].insert(1, Laurent@2111: {'use': 'optional', Laurent@2111: 'type': 'unsignedLong', Laurent@2111: 'name': 'Alias', Laurent@2111: 'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())}) Laurent@2111: return params Laurent@2111: Laurent@2111: def SetParamsAttribute(self, path, value): Edouard@2152: self.GetSlaveInfos() Laurent@2111: position = self.BaseParams.getIEC_Channel() Laurent@2111: Laurent@2111: if path == "SlaveParams.Type": Laurent@2111: self.CTNParent.SetSlaveType(position, value) Laurent@2111: slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) Laurent@2111: value = (slave_type["device_type"], slave_type) Edouard@2152: #if self._View is not None: Edouard@2152: #wx.CallAfter(self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos()) Edouard@2152: #self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos() Edouard@2152: #self._View.EtherCATManagementTreebook.PDOMonitoringPanel.PDOInfoUpdate() Edouard@2152: #self._View.EtherCATManagementTreebook.SmartView.Create_SmartView() Laurent@2111: return value, True Laurent@2111: elif path == "SlaveParams.Alias": Laurent@2111: self.CTNParent.SetSlaveAlias(position, value) Laurent@2111: return value, True Laurent@2111: Laurent@2111: value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) Laurent@2111: Laurent@2111: # Filter IEC_Channel, Slave_Type and Alias that have specific behavior Laurent@2111: if path == "BaseParams.IEC_Channel" and value != position: Laurent@2111: self.CTNParent.SetSlavePosition(position, value) Laurent@2111: Laurent@2111: return value, refresh Laurent@2111: Laurent@2111: def GetSlaveInfos(self): Laurent@2111: return self.CTNParent.GetSlaveInfos(self.GetSlavePos()) Laurent@2111: Laurent@2111: def GetSlaveVariables(self, limits): Laurent@2111: return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits) Laurent@2111: Laurent@2111: def GetVariableLocationTree(self): Laurent@2111: return {"name": self.BaseParams.getName(), Laurent@2111: "type": LOCATION_CONFNODE, Laurent@2111: "location": self.GetFullIEC_Channel(), Laurent@2111: "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName()) Laurent@2111: } Laurent@2111: Laurent@2111: def CTNGenerate_C(self, buildpath, locations): Laurent@2111: return [],"",False