diff -r bcf346f558bd -r 02a2b5dee5e3 etherlab/EthercatSlave.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etherlab/EthercatSlave.py Sat Jun 23 09:08:13 2018 +0200 @@ -0,0 +1,159 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file is part of Beremiz +# +# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT +# RTES Lab : CRKim, JBLee, youcu +# Higen Motor : Donggu Kang +# +# See COPYING file for copyrights details. + +import wx + +from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY +from ConfigTreeNode import ConfigTreeNode + +from ConfigEditor import NodeEditor + +#------------------------------------------ +from CommonEtherCATFunction import _CommonSlave +#------------------------------------------ + + +TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L", + "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", + "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L"} + +DATATYPECONVERSION = {"BOOL" : "BIT", "SINT" : "S8", "INT" : "S16", "DINT" : "S32", "LINT" : "S64", + "USINT" : "U8", "UINT" : "U16", "UDINT" : "U32", "ULINT" : "U64", + "BYTE" : "U8", "WORD" : "U16", "DWORD" : "U32", "LWORD" : "U64"} + +VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY} + +def ExtractHexDecValue(value): + try: + return int(value) + except: + pass + try: + return int(value.replace("#", "0"), 16) + except: + raise ValueError, "Invalid value for HexDecValue \"%s\"" % value + +def GenerateHexDecValue(value, base=10): + if base == 10: + return str(value) + elif base == 16: + return "#x%.8x" % value + else: + raise ValueError, "Not supported base" + +def ExtractName(names, default=None): + if len(names) == 1: + return names[0].getcontent() + else: + for name in names: + if name.getLcId() == 1033: + return name.getcontent() + return default + + +#-------------------------------------------------- +# Ethercat Node +#-------------------------------------------------- + +class _EthercatSlaveCTN: + NODE_PROFILE = None + EditorType = NodeEditor + + def __init__(self): + # ----------- call ethercat mng. function -------------- + self.CommonMethod = _CommonSlave(self) + + def GetIconName(self): + return "Slave" + + def ExtractHexDecValue(self, value): + return ExtractHexDecValue(value) + + def GetSizeOfType(self, type): + return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None) + + def GetSlavePos(self): + return self.BaseParams.getIEC_Channel() + + def GetParamsAttributes(self, path = None): + if path: + parts = path.split(".", 1) + if self.MandatoryParams and parts[0] == self.MandatoryParams[0]: + return self.MandatoryParams[1].getElementInfos(parts[0], parts[1]) + elif self.CTNParams and parts[0] == self.CTNParams[0]: + return self.CTNParams[1].getElementInfos(parts[0], parts[1]) + else: + params = [] + if self.CTNParams: + params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0])) + else: + params.append({ + 'use': 'required', + 'type': 'element', + 'name': 'SlaveParams', + 'value': None, + 'children': [] + }) + + slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) + params[0]['children'].insert(0, + {'use': 'optional', + 'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), + 'name': 'Type', + 'value': (slave_type["device_type"], slave_type)}) + params[0]['children'].insert(1, + {'use': 'optional', + 'type': 'unsignedLong', + 'name': 'Alias', + 'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())}) + return params + + def SetParamsAttribute(self, path, value): + self.GetSlaveInfos() + position = self.BaseParams.getIEC_Channel() + + if path == "SlaveParams.Type": + self.CTNParent.SetSlaveType(position, value) + slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos()) + value = (slave_type["device_type"], slave_type) + #if self._View is not None: + #wx.CallAfter(self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos()) + #self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos() + #self._View.EtherCATManagementTreebook.PDOMonitoringPanel.PDOInfoUpdate() + #self._View.EtherCATManagementTreebook.SmartView.Create_SmartView() + return value, True + elif path == "SlaveParams.Alias": + self.CTNParent.SetSlaveAlias(position, value) + return value, True + + value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value) + + # Filter IEC_Channel, Slave_Type and Alias that have specific behavior + if path == "BaseParams.IEC_Channel" and value != position: + self.CTNParent.SetSlavePosition(position, value) + + return value, refresh + + def GetSlaveInfos(self): + return self.CTNParent.GetSlaveInfos(self.GetSlavePos()) + + def GetSlaveVariables(self, limits): + return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits) + + def GetVariableLocationTree(self): + return {"name": self.BaseParams.getName(), + "type": LOCATION_CONFNODE, + "location": self.GetFullIEC_Channel(), + "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName()) + } + + def CTNGenerate_C(self, buildpath, locations): + return [],"",False