etherlab/EthercatSlave.py
changeset 2429 15f18dc8b56a
parent 2405 af050469fc5c
child 2643 b98d9e08231f
equal deleted inserted replaced
2428:e0f16317668e 2429:15f18dc8b56a
     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