edouard@2165: #!/usr/bin/env python edouard@2165: # -*- coding: utf-8 -*- edouard@2165: edouard@2165: # This file is part of Beremiz edouard@2165: # edouard@2165: # Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT edouard@2165: # RTES Lab : CRKim, JBLee, youcu edouard@2165: # Higen Motor : Donggu Kang edouard@2165: # edouard@2165: # See COPYING file for copyrights details. edouard@2165: andrej@2396: from PLCControler import LOCATION_CONFNODE, 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: andrej@2356: # ------------------------------------------ andrej@2355: from CommonEtherCATFunction import _CommonSlave andrej@2356: # ------------------------------------------ Edouard@2152: Edouard@2152: andrej@2375: TYPECONVERSION = {"BOOL": "X", "SINT": "B", "INT": "W", "DINT": "D", "LINT": "L", andrej@2381: "USINT": "B", "UINT": "W", "UDINT": "D", "ULINT": "L", andrej@2381: "BYTE": "B", "WORD": "W", "DWORD": "D", "LWORD": "L"} Laurent@2111: andrej@2375: DATATYPECONVERSION = {"BOOL": "BIT", "SINT": "S8", "INT": "S16", "DINT": "S32", "LINT": "S64", andrej@2381: "USINT": "U8", "UINT": "U16", "UDINT": "U32", "ULINT": "U64", andrej@2381: "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: andrej@2360: Laurent@2111: def ExtractHexDecValue(value): Laurent@2111: try: Laurent@2111: return int(value) andrej@2353: except Exception: Laurent@2111: pass Laurent@2111: try: Laurent@2111: return int(value.replace("#", "0"), 16) andrej@2353: except Exception: andrej@2378: raise ValueError("Invalid value for HexDecValue \"%s\"" % value) Laurent@2111: andrej@2360: 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: andrej@2378: raise ValueError("Not supported base") Laurent@2111: andrej@2360: 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: andrej@2356: # -------------------------------------------------- Laurent@2111: # Ethercat Node andrej@2356: # -------------------------------------------------- Laurent@2111: andrej@2397: class _EthercatSlaveCTN(object): Laurent@2111: NODE_PROFILE = None Laurent@2111: EditorType = NodeEditor andrej@2355: Edouard@2152: def __init__(self): Edouard@2152: # ----------- call ethercat mng. function -------------- Edouard@2152: self.CommonMethod = _CommonSlave(self) andrej@2355: Laurent@2111: def GetIconName(self): Laurent@2111: return "Slave" andrej@2355: Laurent@2111: def ExtractHexDecValue(self, value): Laurent@2111: return ExtractHexDecValue(value) andrej@2355: Laurent@2111: def GetSizeOfType(self, type): Laurent@2111: return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None) andrej@2355: Laurent@2111: def GetSlavePos(self): Laurent@2111: return self.BaseParams.getIEC_Channel() andrej@2355: andrej@2366: 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({ andrej@2355: 'use': 'required', andrej@2355: 'type': 'element', andrej@2355: 'name': 'SlaveParams', andrej@2355: 'value': None, Laurent@2111: 'children': [] Laurent@2111: }) andrej@2355: Laurent@2111: slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) andrej@2381: params[0]['children'].insert( andrej@2381: 0, andrej@2381: { andrej@2381: 'use': 'optional', andrej@2355: 'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), andrej@2355: 'name': 'Type', andrej@2381: 'value': (slave_type["device_type"], slave_type) andrej@2381: }) andrej@2381: params[0]['children'].insert( andrej@2381: 1, andrej@2381: { andrej@2381: 'use': 'optional', andrej@2355: 'type': 'unsignedLong', andrej@2355: 'name': 'Alias', andrej@2381: 'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos()) andrej@2381: }) Laurent@2111: return params andrej@2355: Laurent@2111: def SetParamsAttribute(self, path, value): Edouard@2152: self.GetSlaveInfos() Laurent@2111: position = self.BaseParams.getIEC_Channel() andrej@2355: 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) andrej@2356: # if self._View is not None: andrej@2356: # wx.CallAfter(self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos()) andrej@2356: # self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos() andrej@2356: # self._View.EtherCATManagementTreebook.PDOMonitoringPanel.PDOInfoUpdate() andrej@2356: # 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 andrej@2355: Laurent@2111: value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) andrej@2355: 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) andrej@2355: Laurent@2111: return value, refresh andrej@2355: Laurent@2111: def GetSlaveInfos(self): Laurent@2111: return self.CTNParent.GetSlaveInfos(self.GetSlavePos()) andrej@2355: Laurent@2111: def GetSlaveVariables(self, limits): Laurent@2111: return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits) andrej@2355: Laurent@2111: def GetVariableLocationTree(self): andrej@2362: return { andrej@2362: "name": self.BaseParams.getName(), andrej@2362: "type": LOCATION_CONFNODE, andrej@2362: "location": self.GetFullIEC_Channel(), andrej@2362: "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName()) Laurent@2111: } Laurent@2111: Laurent@2111: def CTNGenerate_C(self, buildpath, locations): andrej@2363: return [], "", False