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: 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: #------------------------------------------ andrej@2355: from CommonEtherCATFunction import _CommonSlave Edouard@2152: #------------------------------------------ Edouard@2152: Edouard@2152: Laurent@2111: TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L", andrej@2355: "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", andrej@2355: "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) andrej@2353: except Exception: Laurent@2111: pass Laurent@2111: try: Laurent@2111: return int(value.replace("#", "0"), 16) andrej@2353: except Exception: 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 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: 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({ 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()) Laurent@2111: params[0]['children'].insert(0, andrej@2355: {'use': 'optional', andrej@2355: 'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), andrej@2355: 'name': 'Type', andrej@2355: 'value': (slave_type["device_type"], slave_type)}) Laurent@2111: params[0]['children'].insert(1, andrej@2355: {'use': 'optional', andrej@2355: 'type': 'unsignedLong', andrej@2355: 'name': 'Alias', Laurent@2111: 'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())}) 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) 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 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): 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