etherlab/etherlab.py
author Laurent Bessard
Wed, 06 Mar 2013 18:38:17 +0100
changeset 2101 da450992572e
parent 2099 ea5384ab152c
child 2102 90031b8db62d
permissions -rw-r--r--
Added code generation for process variables
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     1
import os, shutil
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     2
import cPickle
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     3
from xml.dom import minidom
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     4
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     5
import wx
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
     6
import csv
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     7
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
     8
from xmlclass import *
2086
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
     9
from POULibrary import POULibrary
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
    10
from ConfigTreeNode import ConfigTreeNode
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
    11
from PLCControler import UndoBuffer, LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
    12
from ConfigEditor import NodeEditor, CIA402NodeEditor, MasterEditor, LibraryEditor, ETHERCAT_VENDOR, ETHERCAT_GROUP, ETHERCAT_DEVICE
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    13
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    14
try:
2049
438a4a1ff188 updated examples also
Edouard Tisserant
parents: 2048
diff changeset
    15
    from MotionLibrary import Headers, AxisXSD
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    16
    HAS_MCL = True
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    17
except:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    18
    HAS_MCL = False
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    19
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    20
TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L",
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    21
    "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    22
    "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L"}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    23
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    24
DATATYPECONVERSION = {"BOOL" : "BIT", "SINT" : "S8", "INT" : "S16", "DINT" : "S32", "LINT" : "S64",
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    25
    "USINT" : "U8", "UINT" : "U16", "UDINT" : "U32", "ULINT" : "U64", 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    26
    "BYTE" : "U8", "WORD" : "U16", "DWORD" : "U32", "LWORD" : "U64"}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    27
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    28
VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY}
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
    29
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
    30
#--------------------------------------------------
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    31
#         Remote Exec Etherlab Commands
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
    32
#--------------------------------------------------
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
    33
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    34
SCAN_COMMAND = """
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    35
import commands
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    36
result = commands.getoutput("ethercat slaves")
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    37
slaves = []
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    38
for slave_line in result.splitlines():
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    39
    chunks = slave_line.split()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    40
    idx, pos, state, flag = chunks[:4]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    41
    name = " ".join(chunks[4:])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    42
    alias, position = pos.split(":")
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    43
    slave = {"idx": int(idx),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    44
             "alias": int(alias),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    45
             "position": int(position),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    46
             "name": name}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    47
    details = commands.getoutput("ethercat slaves -p %d -v" % slave["idx"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    48
    for details_line in details.splitlines():
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    49
        details_line = details_line.strip()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    50
        for header, param in [("Vendor Id:", "vendor_id"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    51
                              ("Product code:", "product_code"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    52
                              ("Revision number:", "revision_number")]:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    53
            if details_line.startswith(header):
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
    54
                slave[param] = details_line.split()[-1]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    55
                break
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    56
    slaves.append(slave)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    57
returnVal = slaves
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    58
"""
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    59
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    60
#--------------------------------------------------
2086
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    61
#      Etherlab Specific Blocks Library
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    62
#--------------------------------------------------
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    63
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    64
def GetLocalPath(filename):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    65
    return os.path.join(os.path.split(__file__)[0], filename)
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    66
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    67
class EtherlabLibrary(POULibrary):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    68
    def GetLibraryPath(self):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    69
        return GetLocalPath("pous.xml")
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    70
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    71
    def Generate_C(self, buildpath, varlist, IECCFLAGS):
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    72
        etherlab_ext_file = open(GetLocalPath("etherlab_ext.c"), 'r')
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    73
        etherlab_ext_code = etherlab_ext_file.read()
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    74
        etherlab_ext_file.close()
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    75
        
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    76
        Gen_etherlabfile_path = os.path.join(buildpath, "etherlab_ext.c")
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    77
        ethelabfile = open(Gen_etherlabfile_path,'w')
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    78
        ethelabfile.write(etherlab_ext_code)
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    79
        ethelabfile.close()
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    80
        
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    81
        runtimefile_path = os.path.join(os.path.split(__file__)[0], "runtime_etherlab.py")
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    82
        return ((["etherlab_ext"], [(Gen_etherlabfile_path, IECCFLAGS)], True), "", 
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    83
                ("runtime_etherlab.py", file(GetLocalPath("runtime_etherlab.py"))))
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    84
8e4992e0f147 Adding block library for SDO download and SDO upload
Laurent Bessard
parents: 2085
diff changeset
    85
#--------------------------------------------------
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    86
#                    Ethercat Node
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    87
#--------------------------------------------------
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    88
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
    89
class _EthercatSlaveCTN:
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
    90
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    91
    NODE_PROFILE = None
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    92
    EditorType = NodeEditor
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
    93
    
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
    94
    def GetIconName(self):
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
    95
        return "Slave"
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
    96
    
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
    97
    def ExtractHexDecValue(self, value):
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
    98
        return ExtractHexDecValue(value)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
    99
    
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
   100
    def GetSizeOfType(self, type):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   101
        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   102
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   103
    def GetSlavePos(self):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   104
        return self.BaseParams.getIEC_Channel()
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   105
    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   106
    def GetParamsAttributes(self, path = None):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   107
        if path:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   108
            parts = path.split(".", 1)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   109
            if self.MandatoryParams and parts[0] == self.MandatoryParams[0]:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   110
                return self.MandatoryParams[1].getElementInfos(parts[0], parts[1])
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   111
            elif self.CTNParams and parts[0] == self.CTNParams[0]:
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   112
                return self.CTNParams[1].getElementInfos(parts[0], parts[1])
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   113
        else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   114
            params = []
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   115
            if self.CTNParams:
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   116
                params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0]))
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   117
            else:
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   118
                params.append({
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   119
                    'use': 'required', 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   120
                    'type': 'element', 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   121
                    'name': 'SlaveParams', 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   122
                    'value': None, 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   123
                    'children': []
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   124
                })
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   125
            
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   126
            slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos())
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   127
            params[0]['children'].insert(0,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   128
                   {'use': 'optional', 
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   129
                    'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE), 
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   130
                    'name': 'Type', 
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   131
                    'value': (slave_type["device_type"], slave_type)}) 
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   132
            params[0]['children'].insert(1,
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   133
                   {'use': 'optional', 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   134
                    'type': 'unsignedLong', 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   135
                    'name': 'Alias', 
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   136
                    'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())})
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   137
            return params
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   138
        
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   139
    def SetParamsAttribute(self, path, value):
2066
de4817ce8b50 Fix bug when modifying node parameters
Laurent Bessard
parents: 2064
diff changeset
   140
        position = self.BaseParams.getIEC_Channel()
de4817ce8b50 Fix bug when modifying node parameters
Laurent Bessard
parents: 2064
diff changeset
   141
        
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   142
        if path == "SlaveParams.Type":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   143
            self.CTNParent.SetSlaveType(position, value)
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   144
            slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos())
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   145
            value = (slave_type["device_type"], slave_type)
2067
04cc0295e2c4 Fix bug slave information panel not refreshed when slave type changed
Laurent Bessard
parents: 2066
diff changeset
   146
            if self._View is not None:
04cc0295e2c4 Fix bug slave information panel not refreshed when slave type changed
Laurent Bessard
parents: 2066
diff changeset
   147
                wx.CallAfter(self._View.RefreshSlaveInfos)
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   148
            return value, True
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   149
        elif path == "SlaveParams.Alias":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   150
            self.CTNParent.SetSlaveAlias(position, value)
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   151
            return value, True
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   152
        
2080
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   153
        value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value)
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   154
        
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   155
        # Filter IEC_Channel, Slave_Type and Alias that have specific behavior
2080
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   156
        if path == "BaseParams.IEC_Channel" and value != position:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   157
            self.CTNParent.SetSlavePosition(position, value)
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   158
        
2080
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   159
        return value, refresh
6d0d94cd0fe0 Fix bug when modifying slave position
Laurent Bessard
parents: 2079
diff changeset
   160
        
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
   161
    def GetSlaveInfos(self):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   162
        return self.CTNParent.GetSlaveInfos(self.GetSlavePos())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   163
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   164
    def GetSlaveVariables(self, limits):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   165
        return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   166
    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   167
    def GetVariableLocationTree(self):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   168
        return  {"name": self.BaseParams.getName(),
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   169
                 "type": LOCATION_CONFNODE,
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   170
                 "location": self.GetFullIEC_Channel(),
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   171
                 "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   172
        }
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   173
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   174
    def CTNGenerate_C(self, buildpath, locations):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   175
        """
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   176
        Generate C code
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   177
        @param current_location: Tupple containing confnode IEC location : %I0.0.4.5 => (0,0,4,5)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   178
        @param locations: List of complete variables locations \
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   179
            [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   180
            "NAME" : name of the variable (generally "__IW0_1_2" style)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   181
            "DIR" : direction "Q","I" or "M"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   182
            "SIZE" : size "X", "B", "W", "D", "L"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   183
            "LOC" : tuple of interger for IEC location (0,1,2,...)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   184
            }, ...]
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   185
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   186
        """
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   187
        return [],"",False
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   188
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   189
#--------------------------------------------------
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   190
#                 Ethercat CIA402 Node
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   191
#--------------------------------------------------
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   192
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   193
if HAS_MCL:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   194
    
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   195
    NODE_VARIABLES = [
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   196
        ("ControlWord", 0x6040, 0x00, "UINT", "Q"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   197
        ("TargetPosition", 0x607a, 0x00, "DINT", "Q"),
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   198
        ("ModesOfOperation", 0x06060, 0x00, "SINT", "Q"),
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   199
        ("StatusWord", 0x6041, 0x00, "UINT", "I"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   200
        ("ModesOfOperationDisplay", 0x06061, 0x00, "SINT", "I"),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   201
        ("ActualPosition", 0x6064, 0x00, "DINT", "I"),
2091
d964dbc2c7b0 Adding support for extracting ActualVelocity from CIA402 nodes PDOs
Laurent Bessard
parents: 2088
diff changeset
   202
        ("ActualVelocity", 0x606C, 0x00, "DINT", "I"),
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   203
    ]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   204
    
2085
ae263886ae92 Fix bug in CIA402 slave digital inputs
Laurent Bessard
parents: 2084
diff changeset
   205
    DEFAULT_RETRIEVE = "    __CIA402Node_%(location)s.axis->%(name)s = *(__CIA402Node_%(location)s.%(name)s);"
ae263886ae92 Fix bug in CIA402 slave digital inputs
Laurent Bessard
parents: 2084
diff changeset
   206
    DEFAULT_PUBLISH = "    *(__CIA402Node_%(location)s.%(name)s) = __CIA402Node_%(location)s.axis->%(name)s;"
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   207
    
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   208
    EXTRA_NODE_VARIABLES = [
2096
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   209
        ("ErrorCode", [
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   210
            {"description": ("ErrorCode", 0x603F, 0x00, "UINT", "I"),
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   211
             "publish": None}
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   212
            ]),
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   213
        ("DigitalInputs", [
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   214
            {"description": ("DigitalInputs", 0x60FD, 0x00, "UDINT", "I"),
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   215
             "publish": None}
2096
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   216
            ]),
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   217
        ("DigitalOutputs", [
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   218
            {"description": ("DigitalOutputs", 0x60FE, 0x00, "UDINT", "Q"),
c9b0340ea0f5 Added support for MC_*DigitalOutput, MC_ReadAxisInfo and MC_ReadAxisError blocks from MCL in DS402 nodes generated code
Laurent Bessard
parents: 2094
diff changeset
   219
             "retrieve": None}
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   220
            ])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   221
    ]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   222
    EXTRA_NODE_VARIABLES_DICT = dict([("Enable" + name, value) for name, value in EXTRA_NODE_VARIABLES])
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   223
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   224
    BLOCK_INPUT_TEMPLATE = "    __SET_VAR(%(blockname)s->,%(input_name)s, %(input_value)s);"
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   225
    BLOCK_OUTPUT_TEMPLATE = "    __SET_VAR(data__->,%(output_name)s, __GET_VAR(%(blockname)s->%(output_name)s));"
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   226
    
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   227
    BLOCK_FUNCTION_TEMPLATE = """
2093
3fdf9d56d803 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2092
diff changeset
   228
extern void ETHERLAB%(ucase_blocktype)s_body__(ETHERLAB%(ucase_blocktype)s* data__);
3fdf9d56d803 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2092
diff changeset
   229
void __%(blocktype)s_%(location)s(MC_%(ucase_blocktype)s *data__) {
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   230
    __DECLARE_GLOBAL_PROTOTYPE(ETHERLAB%(ucase_blocktype)s, %(blockname)s);
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   231
    ETHERLAB%(ucase_blocktype)s* %(blockname)s = __GET_GLOBAL_%(blockname)s();
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   232
%(extract_inputs)s
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   233
    ETHERLAB%(ucase_blocktype)s_body__(%(blockname)s);
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   234
%(return_outputs)s
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   235
}
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   236
"""
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   237
    
2094
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   238
    BLOCK_FUNTION_DEFINITION_TEMPLATE = """    if (!__CIA402Node_%(location)s.axis->__mcl_func_MC_%(blocktype)s)
72b74099b873 Fix bug in support for Etherlab specific fieldbus interface function blocks
Laurent Bessard
parents: 2093
diff changeset
   239
    __CIA402Node_%(location)s.axis->__mcl_func_MC_%(blocktype)s = __%(blocktype)s_%(location)s;"""
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   240
    
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   241
    GLOBAL_INSTANCES = [
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   242
        {"blocktype": "GetTorqueLimit", 
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   243
         "inputs": [],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   244
         "outputs": [{"name": "TorqueLimitPos", "type": "UINT"},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   245
                     {"name": "TorqueLimitNeg", "type": "UINT"}]},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   246
        {"blocktype": "SetTorqueLimit", 
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   247
         "inputs": [{"name": "TorqueLimitPos", "type": "UINT"},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   248
                    {"name": "TorqueLimitNeg", "type": "UINT"}],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   249
         "outputs": []},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   250
    ]
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   251
    
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   252
    class _EthercatCIA402SlaveCTN(_EthercatSlaveCTN):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   253
        XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   254
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   255
          <xsd:element name="CIA402SlaveParams">
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   256
            <xsd:complexType>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   257
              %s
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   258
            </xsd:complexType>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   259
          </xsd:element>
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   260
        </xsd:schema>
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   261
        """ % ("\n".join(['<xsd:attribute name="Enable%s" type="xsd:boolean" use="optional" default="false"/>' % category 
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   262
                          for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   263
        
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   264
        NODE_PROFILE = 402
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   265
        EditorType = CIA402NodeEditor
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   266
        
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   267
        ConfNodeMethods = [
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
   268
            {"bitmap" : "CIA402AxisRef",
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   269
             "name" : _("Axis Ref"),
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   270
             "tooltip" : _("Initiate Drag'n drop of Axis ref located variable"),
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   271
             "method" : "_getCIA402AxisRef",
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   272
             "push": True},
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   273
        ]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   274
        
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
   275
        def GetIconName(self):
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
   276
            return "CIA402Slave"
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   277
        
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   278
        def SetParamsAttribute(self, path, value):
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   279
            if path == "CIA402SlaveParams.Type":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   280
                path = "SlaveParams.Type"
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   281
            elif path == "CIA402SlaveParams.Alias":
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   282
                path = "SlaveParams.Alias"
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   283
            return _EthercatSlaveCTN.SetParamsAttribute(self, path, value)
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   284
        
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   285
        def GetVariableLocationTree(self):
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   286
            axis_name = self.CTNName()
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   287
            current_location = self.GetCurrentLocation()
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   288
            children = [{"name": "%s Axis Ref" % (axis_name),
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   289
                         "type": LOCATION_VAR_INPUT,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   290
                         "size": "W",
2083
0f7ab170c862 Fix Axis_Ref type defined in VariableLocationTree
Laurent Bessard
parents: 2082
diff changeset
   291
                         "IEC_type": "AXIS_REF",
2063
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   292
                         "var_name": axis_name,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   293
                         "location": "%%IW%s.0" % (".".join(map(str, current_location))),
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   294
                         "description": "",
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   295
                         "children": []}]
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   296
            children.extend(self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), current_location, axis_name))
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   297
            return  {"name": axis_name,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   298
                     "type": LOCATION_CONFNODE,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   299
                     "location": self.GetFullIEC_Channel(),
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   300
                     "children": children,
c9a1c5bb51cd Fix bug with AXIS_REF located variable drag'n drop and disable dynamic PDOs support
Laurent Bessard
parents: 2062
diff changeset
   301
            }
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   302
        
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   303
        def CTNGlobalInstances(self):
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   304
            current_location = self.GetCurrentLocation()
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   305
            return [("%s_%s" % (block_infos["blocktype"], "_".join(map(str, current_location))),
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   306
                     "EtherLab%s" % block_infos["blocktype"]) for block_infos in GLOBAL_INSTANCES]
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   307
        
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   308
        def _getCIA402AxisRef(self):
2074
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
   309
            data = wx.TextDataObject(str(("%%IW%s.0" % ".".join(map(str, self.GetCurrentLocation())), 
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   310
                                          "location", "AXIS_REF", self.CTNName(), "")))
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   311
            dragSource = wx.DropSource(self.GetCTRoot().AppFrame)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   312
            dragSource.SetData(data)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   313
            dragSource.DoDragDrop()
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   314
        
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   315
        def CTNGenerate_C(self, buildpath, locations):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   316
            """
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   317
            Generate C code
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   318
            @param current_location: Tupple containing confnode IEC location : %I0.0.4.5 => (0,0,4,5)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   319
            @param locations: List of complete variables locations \
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   320
                [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   321
                "NAME" : name of the variable (generally "__IW0_1_2" style)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   322
                "DIR" : direction "Q","I" or "M"
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   323
                "SIZE" : size "X", "B", "W", "D", "L"
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   324
                "LOC" : tuple of interger for IEC location (0,1,2,...)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   325
                }, ...]
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   326
            @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   327
            """
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   328
            current_location = self.GetCurrentLocation()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   329
            
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   330
            location_str = "_".join(map(lambda x:str(x), current_location))
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   331
            
2045
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   332
            plc_cia402node_filepath = os.path.join(os.path.split(__file__)[0], "plc_cia402node.c")
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   333
            plc_cia402node_file = open(plc_cia402node_filepath, 'r')
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   334
            plc_cia402node_code = plc_cia402node_file.read()
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   335
            plc_cia402node_file.close()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   336
            
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   337
            str_completion = {
2088
c0952932d74b Adding support for using Etherlab SDO function blocks in MCL
Laurent Bessard
parents: 2086
diff changeset
   338
                "slave_pos": self.GetSlavePos(),
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   339
                "location": location_str,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   340
                "MCL_headers": Headers,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   341
                "extern_located_variables_declaration": [],
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   342
                "fieldbus_interface_declaration": [],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   343
                "fieldbus_interface_definition": [],
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   344
                "entry_variables": [],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   345
                "init_axis_params": [],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   346
                "init_entry_variables": [],
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   347
                "extra_variables_retrieve": [],
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   348
                "extra_variables_publish": []
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   349
            }
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   350
            
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   351
            for blocktype_infos in GLOBAL_INSTANCES:
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   352
                texts = {
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   353
                    "blocktype": blocktype_infos["blocktype"],
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   354
                    "ucase_blocktype": blocktype_infos["blocktype"].upper(),
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   355
                    "location": "_".join(map(str, current_location))
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   356
                }
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   357
                texts["blockname"] = "%(ucase_blocktype)s_%(location)s" % texts
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   358
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   359
                inputs = [{"input_name": "POS", "input_value": str(self.GetSlavePos())},
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   360
                          {"input_name": "EXECUTE", "input_value": "__GET_VAR(data__->EXECUTE)"}] +\
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   361
                         [{"input_name": input["name"].upper(), 
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   362
                           "input_value": "__GET_VAR(data__->%s)" % input["name"].upper()}
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   363
                          for input in blocktype_infos["inputs"]]
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   364
                input_texts = []
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   365
                for input_infos in inputs:
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   366
                    input_infos.update(texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   367
                    input_texts.append(BLOCK_INPUT_TEMPLATE % input_infos)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   368
                texts["extract_inputs"] = "\n".join(input_texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   369
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   370
                outputs = [{"output_name": output} for output in ["DONE", "BUSY", "ERROR"]] + \
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   371
                          [{"output_name": output["name"].upper()} for output in blocktype_infos["outputs"]]
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   372
                output_texts = []
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   373
                for output_infos in outputs:
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   374
                    output_infos.update(texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   375
                    output_texts.append(BLOCK_OUTPUT_TEMPLATE % output_infos)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   376
                texts["return_outputs"] = "\n".join(output_texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   377
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   378
                str_completion["fieldbus_interface_declaration"].append(
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   379
                        BLOCK_FUNCTION_TEMPLATE % texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   380
                
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   381
                str_completion["fieldbus_interface_definition"].append(
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   382
                        BLOCK_FUNTION_DEFINITION_TEMPLATE % texts)
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   383
                
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   384
            variables = NODE_VARIABLES[:]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   385
            
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   386
            params = self.CTNParams[1].getElementInfos(self.CTNParams[0])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   387
            for param in params["children"]:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   388
                if param["name"] in EXTRA_NODE_VARIABLES_DICT:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   389
                    if param["value"]:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   390
                        extra_variables = EXTRA_NODE_VARIABLES_DICT.get(param["name"])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   391
                        for variable_infos in extra_variables:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   392
                            var_infos = {
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   393
                                "location": location_str,
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   394
                                "name": variable_infos["description"][0]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   395
                            }
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   396
                            variables.append(variable_infos["description"])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   397
                            retrieve_template = variable_infos.get("retrieve", DEFAULT_RETRIEVE)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   398
                            publish_template = variable_infos.get("publish", DEFAULT_PUBLISH)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   399
                            
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   400
                            if retrieve_template is not None:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   401
                                str_completion["extra_variables_retrieve"].append(
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   402
                                    retrieve_template % var_infos)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   403
                            if publish_template is not None:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   404
                                str_completion["extra_variables_publish"].append(
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   405
                                    publish_template % var_infos)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   406
                elif param["value"] is not None:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   407
                    param_infos = {
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   408
                        "location": location_str,
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   409
                        "param_name": param["name"],
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   410
                    }
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   411
                    if param["type"] == "boolean":
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   412
                        param_infos["param_value"] = {True: "true", False: "false"}[param["value"]]
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   413
                    else:
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   414
                        param_infos["param_value"] = str(param["value"])
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   415
                    str_completion["init_axis_params"].append(
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   416
                        "        __CIA402Node_%(location)s.axis->%(param_name)s = %(param_value)s;" % param_infos)
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   417
            
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   418
            for variable in variables:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   419
                var_infos = dict(zip(["name", "index", "subindex", "var_type", "dir"], variable))
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   420
                var_infos["location"] = location_str
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   421
                var_infos["var_size"] = self.GetSizeOfType(var_infos["var_type"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   422
                var_infos["var_name"] = "__%(dir)s%(var_size)s%(location)s_%(index)d_%(subindex)d" % var_infos
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   423
                
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   424
                str_completion["extern_located_variables_declaration"].append(
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   425
                        "IEC_%(var_type)s *%(var_name)s;" % var_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   426
                str_completion["entry_variables"].append(
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   427
                        "    IEC_%(var_type)s *%(name)s;" % var_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   428
                str_completion["init_entry_variables"].append(
2043
27d4cb689a79 Adding plugin icons and replacing reference to DS402 by CIA402
laurent
parents: 2042
diff changeset
   429
                        "    __CIA402Node_%(location)s.%(name)s = %(var_name)s;" % var_infos)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   430
                
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   431
                self.CTNParent.FileGenerator.DeclareVariable(
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   432
                        self.GetSlavePos(), var_infos["index"], var_infos["subindex"], 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   433
                        var_infos["var_type"], var_infos["dir"], var_infos["var_name"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   434
            
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   435
            for element in ["extern_located_variables_declaration", 
2092
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   436
                            "fieldbus_interface_declaration",
c9776ae8b5d0 Adding support for Etherlab specific function blocks for MCL fieldbus interface function blocks
Laurent Bessard
parents: 2091
diff changeset
   437
                            "fieldbus_interface_definition",
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   438
                            "entry_variables", 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   439
                            "init_axis_params", 
2084
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   440
                            "init_entry_variables",
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   441
                            "extra_variables_retrieve",
579af800b359 Adding support to enable CIA402 slave digital inputs
Laurent Bessard
parents: 2083
diff changeset
   442
                            "extra_variables_publish"]:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   443
                str_completion[element] = "\n".join(str_completion[element])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   444
            
2045
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   445
            Gen_CIA402Nodefile_path = os.path.join(buildpath, "cia402node_%s.c"%location_str)
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   446
            cia402nodefile = open(Gen_CIA402Nodefile_path, 'w')
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   447
            cia402nodefile.write(plc_cia402node_code % str_completion)
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
   448
            cia402nodefile.close()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   449
            
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   450
            return [(Gen_CIA402Nodefile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))],"",True
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   451
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   452
#--------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   453
#                 Ethercat MASTER
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   454
#--------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   455
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   456
EtherCATConfigClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATConfig.xsd")) 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   457
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   458
def ExtractHexDecValue(value):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   459
    try:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   460
        return int(value)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   461
    except:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   462
        pass
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   463
    try:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   464
        return int(value.replace("#", "0"), 16)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   465
    except:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   466
        raise ValueError, "Invalid value for HexDecValue \"%s\"" % value
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   467
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   468
def GenerateHexDecValue(value, base=10):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   469
    if base == 10:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   470
        return str(value)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   471
    elif base == 16:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   472
        return "#x%.8x" % value
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   473
    else:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   474
        raise ValueError, "Not supported base"
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   475
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   476
def sort_commands(x, y):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   477
    if x["Index"] == y["Index"]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   478
        return cmp(x["Subindex"], y["Subindex"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   479
    return cmp(x["Index"], y["Index"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   480
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   481
cls = EtherCATConfigClasses.get("Config_Slave", None)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   482
if cls:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   483
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   484
    def getType(self):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   485
        slave_info = self.getInfo()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   486
        return {"device_type": slave_info.getName(),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   487
                "vendor": GenerateHexDecValue(slave_info.getVendorId()),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   488
                "product_code": GenerateHexDecValue(slave_info.getProductCode(), 16),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   489
                "revision_number": GenerateHexDecValue(slave_info.getRevisionNo(), 16)}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   490
    setattr(cls, "getType", getType)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   491
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   492
    def setType(self, type_infos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   493
        slave_info = self.getInfo()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   494
        slave_info.setName(type_infos["device_type"])
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   495
        slave_info.setVendorId(ExtractHexDecValue(type_infos["vendor"]))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   496
        slave_info.setProductCode(ExtractHexDecValue(type_infos["product_code"]))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   497
        slave_info.setRevisionNo(ExtractHexDecValue(type_infos["revision_number"]))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   498
    setattr(cls, "setType", setType)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   499
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   500
    def getInitCmds(self, create_default=False):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   501
        Mailbox = self.getMailbox()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   502
        if Mailbox is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   503
            if create_default:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   504
                self.addMailbox()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   505
                Mailbox = self.getMailbox()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   506
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   507
                return None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   508
        CoE = Mailbox.getCoE()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   509
        if CoE is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   510
            if create_default:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   511
                Mailbox.addCoE()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   512
                CoE = Mailbox.getCoE()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   513
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   514
                return None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   515
        InitCmds = CoE.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   516
        if InitCmds is None and create_default:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   517
            CoE.addInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   518
            InitCmds = CoE.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   519
        return InitCmds
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   520
    setattr(cls, "getInitCmds", getInitCmds)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   521
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   522
    def getStartupCommands(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   523
        pos = self.getInfo().getPhysAddr()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   524
        InitCmds = self.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   525
        if InitCmds is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   526
            return []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   527
        commands = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   528
        for idx, InitCmd in enumerate(InitCmds.getInitCmd()):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   529
            comment = InitCmd.getComment()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   530
            if comment is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   531
                comment = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   532
            commands.append({
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   533
                "command_idx": idx,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   534
                "Position": pos,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   535
                "Index": InitCmd.getIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   536
                "Subindex": InitCmd.getSubIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   537
                "Value": InitCmd.getData(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   538
                "Description": comment})
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   539
        commands.sort(sort_commands)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   540
        return commands
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   541
    setattr(cls, "getStartupCommands", getStartupCommands)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   542
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   543
    def appendStartupCommand(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   544
        InitCmds = self.getInitCmds(True)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   545
        command = EtherCATConfigClasses["InitCmds_InitCmd"]()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   546
        command.setIndex(command_infos["Index"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   547
        command.setSubIndex(command_infos["Subindex"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   548
        command.setData(command_infos["Value"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   549
        command.setComment(command_infos["Description"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   550
        InitCmds.appendInitCmd(command)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   551
        return len(InitCmds.getInitCmd()) - 1
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   552
    setattr(cls, "appendStartupCommand", appendStartupCommand)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   553
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   554
    def setStartupCommand(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   555
        InitCmds = self.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   556
        if InitCmds is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   557
            commands = InitCmds.getInitCmd()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   558
            if command_infos["command_idx"] < len(commands):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   559
                command = commands[command_infos["command_idx"]]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   560
                command.setIndex(command_infos["Index"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   561
                command.setSubIndex(command_infos["Subindex"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   562
                command.setData(command_infos["Value"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   563
                command.setComment(command_infos["Description"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   564
    setattr(cls, "setStartupCommand", setStartupCommand)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   565
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   566
    def removeStartupCommand(self, command_idx):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   567
        InitCmds = self.getInitCmds()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   568
        if InitCmds is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   569
            if command_idx < len(InitCmds.getInitCmd()):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   570
                InitCmds.removeInitCmd(command_idx)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   571
    setattr(cls, "removeStartupCommand", removeStartupCommand)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   572
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   573
ProcessVariablesXSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   574
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   575
      <xsd:element name="ProcessVariables">
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   576
        <xsd:complexType>
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   577
          <xsd:sequence>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   578
            <xsd:element name="variable" minOccurs="0" maxOccurs="unbounded">
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   579
              <xsd:complexType>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   580
                <xsd:sequence>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   581
                  <xsd:element name="ReadFrom" type="LocationDesc" minOccurs="0"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   582
                  <xsd:element name="WriteTo" type="LocationDesc" minOccurs="0"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   583
                </xsd:sequence>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   584
                <xsd:attribute name="Name" type="xsd:string" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   585
                <xsd:attribute name="Comment" type="xsd:string" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   586
              </xsd:complexType>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   587
            </xsd:element>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   588
          </xsd:sequence>
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   589
        </xsd:complexType>
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   590
      </xsd:element>
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   591
      <xsd:complexType name="LocationDesc">
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   592
        <xsd:attribute name="Position" type="xsd:integer" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   593
        <xsd:attribute name="Index" type="xsd:integer" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   594
        <xsd:attribute name="SubIndex" type="xsd:integer" use="required"/>
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   595
      </xsd:complexType>
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   596
    </xsd:schema>
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   597
"""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   598
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   599
ProcessVariablesClasses = GenerateClassesFromXSDstring(ProcessVariablesXSD) 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   600
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   601
class _EthercatCTN:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   602
    
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   603
    CTNChildrenTypes = [("EthercatSlave", _EthercatSlaveCTN, "Ethercat Slave")]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   604
    if HAS_MCL:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   605
        CTNChildrenTypes.append(("EthercatCIA402Slave", _EthercatCIA402SlaveCTN, "Ethercat CIA402 Slave"))
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   606
    EditorType = MasterEditor
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   607
    
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   608
    def __init__(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   609
        config_filepath = self.ConfigFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   610
        config_is_saved = False
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   611
        self.Config = EtherCATConfigClasses["EtherCATConfig"]()
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   612
        if os.path.isfile(config_filepath):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   613
            config_xmlfile = open(config_filepath, 'r')
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   614
            config_tree = minidom.parse(config_xmlfile)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   615
            config_xmlfile.close()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   616
            
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   617
            for child in config_tree.childNodes:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   618
                if child.nodeType == config_tree.ELEMENT_NODE and child.nodeName == "EtherCATConfig":
2051
13dee9322beb refactoring
laurent
parents: 2047
diff changeset
   619
                    self.Config.loadXMLTree(child)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   620
                    config_is_saved = True
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   621
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   622
        process_filepath = self.ProcessVariablesFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   623
        process_is_saved = False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   624
        self.ProcessVariables = ProcessVariablesClasses["ProcessVariables"]()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   625
        if os.path.isfile(process_filepath):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   626
            process_xmlfile = open(process_filepath, 'r')
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   627
            process_tree = minidom.parse(process_xmlfile)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   628
            process_xmlfile.close()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   629
            
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   630
            for child in process_tree.childNodes:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   631
                if child.nodeType == process_tree.ELEMENT_NODE and child.nodeName == "ProcessVariables":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   632
                    self.ProcessVariables.loadXMLTree(child)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   633
                    process_is_saved = True
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   634
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   635
        if config_is_saved and process_is_saved:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   636
            self.CreateBuffer(True)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   637
        else:
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   638
            self.CreateBuffer(False)
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   639
            self.OnCTNSave()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   640
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   641
    def ExtractHexDecValue(self, value):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   642
        return ExtractHexDecValue(value)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   643
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   644
    def GetSizeOfType(self, type):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   645
        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   646
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   647
    def ConfigFileName(self):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   648
        return os.path.join(self.CTNPath(), "config.xml")
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   649
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   650
    def ProcessVariablesFileName(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   651
        return os.path.join(self.CTNPath(), "process_variables.xml")
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   652
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   653
    def FilterSlave(self, slave, vendor=None, slave_pos=None, slave_profile=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   654
        if slave_pos is not None and slave.getInfo().getPhysAddr() != slave_pos:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   655
            return False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   656
        type_infos = slave.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   657
        if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   658
            return False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   659
        device, alignment = self.GetModuleInfos(type_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   660
        if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   661
            return False
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   662
        return True
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   663
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   664
    def GetSlaves(self, vendor=None, slave_pos=None, slave_profile=None):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   665
        slaves = []
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   666
        for slave in self.Config.getConfig().getSlave():
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   667
            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   668
                slaves.append(slave.getInfo().getPhysAddr())
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   669
        slaves.sort()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   670
        return slaves
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   671
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   672
    def GetSlave(self, slave_pos):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   673
        for slave in self.Config.getConfig().getSlave():
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   674
            slave_info = slave.getInfo()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   675
            if slave_info.getPhysAddr() == slave_pos:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   676
                return slave
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   677
        return None
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   678
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   679
    def GetStartupCommands(self, vendor=None, slave_pos=None, slave_profile=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   680
        commands = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   681
        for slave in self.Config.getConfig().getSlave():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   682
            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   683
                commands.append((slave.getInfo().getPhysAddr(), slave.getStartupCommands()))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   684
        commands.sort()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   685
        return reduce(lambda x, y: x + y[1], commands, [])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   686
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   687
    def AppendStartupCommand(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   688
        slave = self.GetSlave(command_infos["Position"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   689
        if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   690
            command_idx = slave.appendStartupCommand(command_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   691
            self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   692
            return command_idx
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   693
        return None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   694
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   695
    def SetStartupCommandInfos(self, command_infos):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   696
        slave = self.GetSlave(command_infos["Position"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   697
        if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   698
            slave.setStartupCommand(command_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   699
            self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   700
    
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
   701
    def RemoveStartupCommand(self, slave_pos, command_idx, buffer=True):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   702
        slave = self.GetSlave(slave_pos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   703
        if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   704
            slave.removeStartupCommand(command_idx)
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
   705
            if buffer:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
   706
                self.BufferModel()
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   707
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   708
    def SetProcessVariables(self, variables):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   709
        vars = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   710
        for var in variables:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   711
            variable = ProcessVariablesClasses["ProcessVariables_variable"]()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   712
            variable.setName(var["Name"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   713
            variable.setComment(var["Description"])
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   714
            if var["ReadFrom"] != "":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   715
                position, index, subindex = var["ReadFrom"]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   716
                if variable.getReadFrom() is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   717
                    variable.addReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   718
                read_from = variable.getReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   719
                read_from.setPosition(position)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   720
                read_from.setIndex(index)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   721
                read_from.setSubIndex(subindex)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   722
            elif variable.getReadFrom() is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   723
                variable.deleteReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   724
            if var["WriteTo"] != "":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   725
                position, index, subindex = var["WriteTo"]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   726
                if variable.getWriteTo() is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   727
                    variable.addWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   728
                write_to = variable.getWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   729
                write_to.setPosition(position)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   730
                write_to.setIndex(index)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   731
                write_to.setSubIndex(subindex)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   732
            elif variable.getWriteTo() is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   733
                variable.deleteWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   734
            vars.append(variable)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   735
        self.ProcessVariables.setvariable(vars)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   736
        self.BufferModel()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   737
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   738
    def GetProcessVariables(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   739
        variables = []
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   740
        idx = 0
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   741
        for variable in self.ProcessVariables.getvariable():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   742
            var = {"Name": variable.getName(),
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   743
                   "Number": idx,
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   744
                   "Description": variable.getComment()}
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   745
            read_from = variable.getReadFrom()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   746
            if read_from is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   747
                var["ReadFrom"] = (read_from.getPosition(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   748
                                   read_from.getIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   749
                                   read_from.getSubIndex())
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   750
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   751
                var["ReadFrom"] = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   752
            write_to = variable.getWriteTo()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   753
            if write_to is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   754
                var["WriteTo"] = (write_to.getPosition(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   755
                                   write_to.getIndex(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   756
                                   write_to.getSubIndex())
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   757
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   758
                var["WriteTo"] = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   759
            variables.append(var)
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   760
            idx += 1
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   761
        return variables
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   762
    
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   763
    def _ScanNetwork(self):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   764
        app_frame = self.GetCTRoot().AppFrame
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   765
        
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   766
        execute = True
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   767
        if len(self.Children) > 0:
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   768
            dialog = wx.MessageDialog(app_frame, 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   769
                _("The current network configuration will be deleted.\nDo you want to continue?"), 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   770
                _("Scan Network"), 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   771
                wx.YES_NO|wx.ICON_QUESTION)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   772
            execute = dialog.ShowModal() == wx.ID_YES
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   773
            dialog.Destroy()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   774
        
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   775
        if execute:
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   776
            error, returnVal = self.RemoteExec(SCAN_COMMAND, returnVal = None)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   777
            if error != 0:
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   778
                dialog = wx.MessageDialog(app_frame, returnVal, "Error", wx.OK|wx.ICON_ERROR)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   779
                dialog.ShowModal()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   780
                dialog.Destroy()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   781
            elif returnVal is not None:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   782
                for child in self.IECSortedChildren():
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   783
                    self._doRemoveChild(child)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   784
                
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   785
                for slave in returnVal:
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   786
                    type_infos = {
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   787
                        "vendor": slave["vendor_id"],
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   788
                        "product_code": slave["product_code"],
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   789
                        "revision_number":slave["revision_number"],
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   790
                    }
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
   791
                    device, alignment = self.GetModuleInfos(type_infos)
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   792
                    if device is not None:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   793
                        if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers():
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   794
                            CTNType = "EthercatCIA402Slave"
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   795
                        else:
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   796
                            CTNType = "EthercatSlave"
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   797
                        self.CTNAddChild("slave%s" % slave["idx"], CTNType, slave["idx"])
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   798
                        self.SetSlaveAlias(slave["idx"], slave["alias"])
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   799
                        type_infos["device_type"] = device.getType().getcontent()
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   800
                        self.SetSlaveType(slave["idx"], type_infos)
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
   801
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   802
    def CTNAddChild(self, CTNName, CTNType, IEC_Channel=0):
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   803
        """
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   804
        Create the confnodes that may be added as child to this node self
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   805
        @param CTNType: string desining the confnode class name (get name from CTNChildrenTypes)
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   806
        @param CTNName: string for the name of the confnode instance
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   807
        """
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   808
        newConfNodeOpj = ConfigTreeNode.CTNAddChild(self, CTNName, CTNType, IEC_Channel)
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   809
        
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   810
        slave = self.GetSlave(newConfNodeOpj.BaseParams.getIEC_Channel())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   811
        if slave is None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   812
            slave = EtherCATConfigClasses["Config_Slave"]()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   813
            slave_infos = slave.getInfo()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   814
            slave_infos.setName("undefined")
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   815
            slave_infos.setPhysAddr(newConfNodeOpj.BaseParams.getIEC_Channel())
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   816
            slave_infos.setAutoIncAddr(0)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   817
            self.Config.getConfig().appendSlave(slave)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   818
            self.BufferModel()
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   819
            self.OnCTNSave()
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   820
        
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   821
        return newConfNodeOpj
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   822
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   823
    def _doRemoveChild(self, CTNInstance):
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   824
        slave_pos = CTNInstance.GetSlavePos()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   825
        config = self.Config.getConfig()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   826
        for idx, slave in enumerate(config.getSlave()):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   827
            slave_infos = slave.getInfo()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   828
            if slave_infos.getPhysAddr() == slave_pos:
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   829
                config.removeSlave(idx)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   830
                self.BufferModel()
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   831
                self.OnCTNSave()
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   832
        ConfigTreeNode._doRemoveChild(self, CTNInstance)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   833
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   834
    def SetSlavePosition(self, slave_pos, new_pos):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   835
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   836
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   837
            slave_info = slave.getInfo()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   838
            slave_info.setPhysAddr(new_pos)
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   839
            for variable in self.ProcessVariables.getvariable():
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   840
                read_from = variable.getReadFrom()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   841
                if read_from is not None and read_from.getPosition() == slave_pos:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   842
                    read_from.setPosition(new_pos)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   843
                write_to = variable.getWriteTo()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   844
                if write_to is not None and write_to.getPosition() == slave_pos:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   845
                    write_to.setPosition(new_pos)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   846
            self.CreateBuffer(True)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   847
            self.OnCTNSave()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   848
            if self._View is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   849
                self._View.RefreshView()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   850
                self._View.RefreshBuffer()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   851
    
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   852
    def GetSlaveAlias(self, slave_pos):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   853
        slave = self.GetSlave(slave_pos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   854
        if slave is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   855
            slave_info = slave.getInfo()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   856
            return slave_info.getAutoIncAddr()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   857
        return None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   858
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   859
    def SetSlaveAlias(self, slave_pos, alias):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   860
        slave = self.GetSlave(slave_pos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   861
        if slave is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   862
            slave_info = slave.getInfo()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   863
            slave_info.setAutoIncAddr(alias)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   864
            self.BufferModel()
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   865
    
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   866
    def GetSlaveType(self, slave_pos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   867
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   868
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   869
            return slave.getType()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   870
        return None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   871
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   872
    def SetSlaveType(self, slave_pos, type_infos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   873
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   874
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   875
            slave.setType(type_infos)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   876
            self.BufferModel()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   877
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   878
    def GetSlaveInfos(self, slave_pos):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   879
        slave = self.GetSlave(slave_pos)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   880
        if slave is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   881
            type_infos = slave.getType()
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   882
            device, alignment = self.GetModuleInfos(type_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   883
            if device is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   884
                infos = type_infos.copy()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   885
                infos.update({"physics": device.getPhysics(),
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
   886
                              "sync_managers": device.GetSyncManagers(),
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   887
                              "entries": self.GetSlaveVariables(device)})
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   888
                return infos
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   889
        return None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   890
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   891
    def GetSlaveVariables(self, slave_pos=None, limits=None, device=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   892
        if device is None and slave_pos is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   893
            slave = self.GetSlave(slave_pos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   894
            if slave is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   895
                type_infos = slave.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   896
                device, alignment = self.GetModuleInfos(type_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   897
        if device is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   898
            entries = device.GetEntriesList(limits)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   899
            entries_list = entries.items()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   900
            entries_list.sort()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   901
            entries = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   902
            current_index = None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   903
            current_entry = None
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   904
            for (index, subindex), entry in entries_list:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   905
                entry["children"] = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   906
                if slave_pos is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   907
                    entry["Position"] = str(slave_pos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   908
                entry
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   909
                if index != current_index:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   910
                    current_index = index
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   911
                    current_entry = entry
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   912
                    entries.append(entry)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   913
                elif current_entry is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   914
                    current_entry["children"].append(entry)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   915
                else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   916
                    entries.append(entry)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   917
            return entries
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   918
        return []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   919
    
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   920
    def GetSlaveVariableDataType(self, slave_pos, index, subindex):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   921
        slave = self.GetSlave(slave_pos)
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   922
        if slave is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   923
            device, alignment = self.GetModuleInfos(slave.getType())
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   924
            if device is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   925
                entries = device.GetEntriesList()
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   926
                entry_infos = entries.get((index, subindex))
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   927
                if entry_infos is not None:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   928
                    return entry_infos["Type"]
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   929
        return None
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
   930
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   931
    def GetNodesVariables(self, vendor=None, slave_pos=None, slave_profile=None, limits=None):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   932
        entries = []
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   933
        for slave_position in self.GetSlaves():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   934
            if slave_pos is not None and slave_position != slave_pos:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   935
                continue
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   936
            slave = self.GetSlave(slave_position)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   937
            type_infos = slave.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   938
            if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   939
                continue
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   940
            device, alignment = self.GetModuleInfos(type_infos)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   941
            if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   942
                continue
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   943
            entries.extend(self.GetSlaveVariables(slave_position, limits, device))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   944
        return entries
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   945
     
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   946
    def GetModuleInfos(self, type_infos):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   947
        return self.CTNParent.GetModuleInfos(type_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   948
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   949
    def GetSlaveTypesLibrary(self, profile_filter=None):
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   950
        return self.CTNParent.GetModulesLibrary(profile_filter)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   951
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   952
    def GetLibraryVendors(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   953
        return self.CTNParent.GetVendors()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   954
    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   955
    def GetDeviceLocationTree(self, slave_pos, current_location, device_name):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   956
        slave = self.GetSlave(slave_pos)
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
   957
        vars = []    
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   958
        if slave is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   959
            type_infos = slave.getType()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   960
        
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   961
            device, alignment = self.GetModuleInfos(type_infos)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   962
            if device is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   963
                sync_managers = []
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   964
                for sync_manager in device.getSm():
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   965
                    sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   966
                    sync_manager_direction = sync_manager_control_byte & 0x0c
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   967
                    if sync_manager_direction:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   968
                        sync_managers.append(LOCATION_VAR_OUTPUT)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   969
                    else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   970
                        sync_managers.append(LOCATION_VAR_INPUT)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   971
                
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   972
                entries = device.GetEntriesList().items()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   973
                entries.sort()
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   974
                for (index, subindex), entry in entries:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   975
                    var_size = self.GetSizeOfType(entry["Type"])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   976
                    if var_size is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   977
                        var_class = VARCLASSCONVERSION.get(entry["PDOMapping"], None)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   978
                        if var_class is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   979
                            if var_class == LOCATION_VAR_INPUT:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   980
                                var_dir = "%I"
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   981
                            else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   982
                                var_dir = "%Q"    
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   983
                        
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   984
                            vars.append({"name": "0x%4.4x-0x%2.2x: %s" % (index, subindex, entry["Name"]),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   985
                                         "type": var_class,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   986
                                         "size": var_size,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   987
                                         "IEC_type": entry["Type"],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   988
                                         "var_name": "%s_%4.4x_%2.2x" % ("_".join(device_name.split()), index, subindex),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   989
                                         "location": "%s%s%s"%(var_dir, var_size, ".".join(map(str, current_location + 
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   990
                                                                                                    (index, subindex)))),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   991
                                         "description": "",
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
   992
                                         "children": []})
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   993
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   994
        return vars
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
   995
    
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   996
    def CTNTestModified(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
   997
        return self.ChangesToSave or not self.ModelIsSaved()    
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
   998
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
   999
    def OnCTNSave(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1000
        config_filepath = self.ConfigFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1001
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1002
        config_text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1003
        config_extras = {"xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1004
                  "xsi:noNamespaceSchemaLocation" : "EtherCATInfo.xsd"}
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1005
        config_text += self.Config.generateXMLText("EtherCATConfig", 0, config_extras)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1006
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1007
        config_xmlfile = open(config_filepath,"w")
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1008
        config_xmlfile.write(config_text.encode("utf-8"))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1009
        config_xmlfile.close()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1010
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1011
        process_filepath = self.ProcessVariablesFileName()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1012
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1013
        process_text = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1014
        process_extras = {"xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance"}
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1015
        process_text += self.ProcessVariables.generateXMLText("ProcessVariables", 0, process_extras)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1016
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1017
        process_xmlfile = open(process_filepath,"w")
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1018
        process_xmlfile.write(process_text.encode("utf-8"))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1019
        process_xmlfile.close()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1020
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1021
        self.Buffer.CurrentSaved()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1022
        return True
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1023
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1024
    def GetProcessVariableName(self, location, var_type):
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1025
        return "__M%s_%s" % (self.GetSizeOfType(var_type), "_".join(map(str, location)))
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1026
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1027
    def _Generate_C(self, buildpath, locations):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1028
        current_location = self.GetCurrentLocation()
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1029
        # define a unique name for the generated C file
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1030
        location_str = "_".join(map(lambda x:str(x), current_location))
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1031
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1032
        Gen_Ethercatfile_path = os.path.join(buildpath, "ethercat_%s.c"%location_str)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1033
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1034
        self.FileGenerator = _EthercatCFileGenerator(self)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1035
        
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1036
        LocationCFilesAndCFLAGS, LDFLAGS, extra_files = ConfigTreeNode._Generate_C(self, buildpath, locations)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1037
        
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1038
        for variable in self.ProcessVariables.getvariable():
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1039
            name = None
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1040
            var_type = None
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1041
            read_from = variable.getReadFrom()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1042
            write_to = variable.getWriteTo()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1043
            if read_from is not None:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1044
                pos = read_from.getPosition()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1045
                index = read_from.getIndex()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1046
                subindex = read_from.getSubIndex()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1047
                location = current_location + (pos, index, subindex)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1048
                var_type = self.GetSlaveVariableDataType(pos, index, subindex)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1049
                name = self.FileGenerator.DeclareVariable(
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1050
                            pos, index, subindex, var_type, "I",
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1051
                            self.GetProcessVariableName(location, var_type))
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1052
            if write_to is not None:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1053
                pos = write_to.getPosition()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1054
                index = write_to.getIndex()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1055
                subindex = write_to.getSubIndex()
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1056
                if name is None:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1057
                    location = current_location + (pos, index, subindex)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1058
                    var_type = self.GetSlaveVariableDataType(pos, index, subindex)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1059
                    name = self.GetProcessVariableName(location, var_type)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1060
                self.FileGenerator.DeclareVariable(
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1061
                            pos, index, subindex, var_type, "Q",
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1062
                            name)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1063
        
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1064
        self.FileGenerator.GenerateCFile(Gen_Ethercatfile_path, location_str, self.BaseParams.getIEC_Channel())
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1065
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1066
        LocationCFilesAndCFLAGS.append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1067
            (current_location, 
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1068
             [(Gen_Ethercatfile_path, '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath()))], 
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1069
             True))
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1070
        LDFLAGS.append("-lethercat -lrtdm")
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1071
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1072
        return LocationCFilesAndCFLAGS, LDFLAGS, extra_files
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1073
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1074
    ConfNodeMethods = [
2068
05a267b1a362 Adding support using plcopeneditor bitmap library for icon request
Laurent Bessard
parents: 2067
diff changeset
  1075
        {"bitmap" : "ScanNetwork",
2042
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1076
         "name" : _("Scan Network"), 
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1077
         "tooltip" : _("Scan Network"),
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1078
         "method" : "_ScanNetwork"},
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1079
    ]
563ccc918ded Adding support for remotely scanning Etherlab network and automatically configure it
laurent
parents: 2041
diff changeset
  1080
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1081
    def CTNGenerate_C(self, buildpath, locations):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1082
        """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1083
        Generate C code
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1084
        @param current_location: Tupple containing confnode IEC location : %I0.0.4.5 => (0,0,4,5)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1085
        @param locations: List of complete variables locations \
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1086
            [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1087
            "NAME" : name of the variable (generally "__IW0_1_2" style)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1088
            "DIR" : direction "Q","I" or "M"
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1089
            "SIZE" : size "X", "B", "W", "D", "L"
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1090
            "LOC" : tuple of interger for IEC location (0,1,2,...)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1091
            }, ...]
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1092
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1093
        """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1094
        current_location = self.GetCurrentLocation()
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1095
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1096
        slaves = self.GetSlaves()
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1097
        for slave_pos in slaves:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1098
            slave = self.GetSlave(slave_pos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1099
            if slave is not None:
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1100
                self.FileGenerator.DeclareSlave(slave_pos, slave)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1101
        
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1102
        for location in locations:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1103
            loc = location["LOC"][len(current_location):]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1104
            slave_pos = loc[0]
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1105
            if slave_pos in slaves and len(loc) == 3 and location["DIR"] != "M":
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1106
                self.FileGenerator.DeclareVariable(
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1107
                    slave_pos, loc[1], loc[2], location["IEC_TYPE"], location["DIR"], location["NAME"])
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1108
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1109
        return [],"",False
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1110
        
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1111
#-------------------------------------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1112
#                      Current Buffering Management Functions
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1113
#-------------------------------------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1114
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1115
    """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1116
    Return a copy of the config
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1117
    """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1118
    def Copy(self, model):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1119
        return cPickle.loads(cPickle.dumps(model))
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1120
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1121
    def CreateBuffer(self, saved):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1122
        self.Buffer = UndoBuffer(cPickle.dumps((self.Config, self.ProcessVariables)), saved)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1123
        
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1124
    def BufferModel(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1125
        self.Buffer.Buffering(cPickle.dumps((self.Config, self.ProcessVariables)))
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1126
    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1127
    def ModelIsSaved(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1128
        if self.Buffer is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1129
            return self.Buffer.IsCurrentSaved()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1130
        else:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1131
            return True
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1132
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1133
    def LoadPrevious(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1134
        self.Config, self.ProcessVariables = cPickle.loads(self.Buffer.Previous())
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1135
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1136
    def LoadNext(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1137
        self.Config, self.ProcessVariables = cPickle.loads(self.Buffer.Next())
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1138
    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1139
    def GetBufferState(self):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1140
        first = self.Buffer.IsFirst()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1141
        last = self.Buffer.IsLast()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1142
        return not first, not last
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1143
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1144
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1145
SLAVE_PDOS_CONFIGURATION_DECLARATION = """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1146
/* Slave %(slave)d, "%(device_type)s"
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1147
 * Vendor ID:       0x%(vendor).8x
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1148
 * Product code:    0x%(product_code).8x
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1149
 * Revision number: 0x%(revision_number).8x
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1150
 */
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1151
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1152
ec_pdo_entry_info_t slave_%(slave)d_pdo_entries[] = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1153
%(pdos_entries_infos)s
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1154
};
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1155
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1156
ec_pdo_info_t slave_%(slave)d_pdos[] = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1157
%(pdos_infos)s
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1158
};
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1159
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1160
ec_sync_info_t slave_%(slave)d_syncs[] = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1161
%(pdos_sync_infos)s
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1162
    {0xff}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1163
};
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1164
"""
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1165
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1166
SLAVE_CONFIGURATION_TEMPLATE = """
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1167
    if (!(slave%(slave)d = ecrt_master_slave_config(master, %(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x))) {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1168
        fprintf(stderr, "Failed to get slave %(device_type)s configuration at alias %(alias)d and position %(position)d.\\n");
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1169
        return -1;
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1170
    }
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1171
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1172
    if (ecrt_slave_config_pdos(slave%(slave)d, EC_END, slave_%(slave)d_syncs)) {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1173
        fprintf(stderr, "Failed to configure PDOs for slave %(device_type)s at alias %(alias)d and position %(position)d.\\n");
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1174
        return -1;
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1175
    }
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1176
"""
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1177
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1178
SLAVE_INITIALIZATION_TEMPLATE = """
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1179
    {
2081
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1180
        uint8_t value[%(data_size)d];
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1181
        EC_WRITE_%(data_type)s((uint8_t *)value, %(data)s);
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1182
        if (ecrt_master_sdo_download(master, %(slave)d, 0x%(index).4x, 0x%(subindex).2x, (uint8_t *)value, %(data_size)d, &abort_code)) {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1183
            fprintf(stderr, "Failed to initialize slave %(device_type)s at alias %(alias)d and position %(position)d.\\nError: %%d\\n", abort_code);
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1184
            return -1;
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1185
        }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1186
    }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1187
"""
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1188
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1189
SLAVE_OUTPUT_PDO_DEFAULT_VALUE = """
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1190
    {
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1191
        uint8_t value[%(data_size)d];
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1192
        if (ecrt_master_sdo_upload(master, %(slave)d, 0x%(index).4x, 0x%(subindex).2x, (uint8_t *)value, %(data_size)d, &result_size, &abort_code)) {
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1193
            fprintf(stderr, "Failed to get default value for output PDO in slave %(device_type)s at alias %(alias)d and position %(position)d.\\nError: %%d\\n", abort_code);
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1194
            return -1;
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1195
        }
2081
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1196
        %(real_var)s = EC_READ_%(data_type)s((uint8_t *)value);
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1197
    }
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1198
"""
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1199
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1200
def ConfigureVariable(entry_infos, str_completion):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1201
    entry_infos["data_type"] = DATATYPECONVERSION.get(entry_infos["var_type"], None)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1202
    if entry_infos["data_type"] is None:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1203
        raise ValueError, _("Type of location \"%s\" not yet supported!") % entry_infos["var_name"]
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1204
    
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1205
    if entry_infos.has_key("real_var"):
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1206
        str_completion["located_variables_declaration"].append(
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1207
            "IEC_%(var_type)s %(real_var)s;" % entry_infos)
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1208
    else:
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1209
        entry_infos["real_var"] = "beremiz" + entry_infos["var_name"]
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1210
        str_completion["located_variables_declaration"].extend(
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1211
            ["IEC_%(var_type)s %(real_var)s;" % entry_infos,
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1212
             "IEC_%(var_type)s *%(var_name)s = &%(real_var)s;" % entry_infos])
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1213
    for declaration in entry_infos.get("extra_declarations", []):
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1214
        entry_infos["extra_decl"] = declaration
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1215
        str_completion["located_variables_declaration"].append(
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1216
             "IEC_%(var_type)s *%(extra_decl)s = &%(real_var)s;" % entry_infos)
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1217
    
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1218
    str_completion["used_pdo_entry_offset_variables_declaration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1219
        "unsigned int slave%(slave)d_%(index).4x_%(subindex).2x;" % entry_infos)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1220
    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1221
    if entry_infos["data_type"] == "BIT":
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1222
        str_completion["used_pdo_entry_offset_variables_declaration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1223
            "unsigned int slave%(slave)d_%(index).4x_%(subindex).2x_bit;" % entry_infos)
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1224
        
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1225
        str_completion["used_pdo_entry_configuration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1226
             ("    {%(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x, " + 
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1227
              "0x%(index).4x, %(subindex)d, &slave%(slave)d_%(index).4x_%(subindex).2x, " + 
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1228
              "&slave%(slave)d_%(index).4x_%(subindex).2x_bit},") % entry_infos)
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1229
        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1230
        if entry_infos["dir"] == "I":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1231
            str_completion["retrieve_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1232
              ("    %(real_var)s = EC_READ_BIT(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1233
               "slave%(slave)d_%(index).4x_%(subindex).2x_bit);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1234
        elif entry_infos["dir"] == "Q":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1235
            str_completion["publish_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1236
              ("    EC_WRITE_BIT(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1237
               "slave%(slave)d_%(index).4x_%(subindex).2x_bit, %(real_var)s);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1238
    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1239
    else:
2034
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1240
        str_completion["used_pdo_entry_configuration"].append(
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1241
            ("    {%(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x, 0x%(index).4x, " + 
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1242
             "%(subindex)d, &slave%(slave)d_%(index).4x_%(subindex).2x},") % entry_infos)
ae8fecf082a1 Adding support for MCL
laurent
parents: 2032
diff changeset
  1243
        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1244
        if entry_infos["dir"] == "I":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1245
            str_completion["retrieve_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1246
                ("    %(real_var)s = EC_READ_%(data_type)s(domain1_pd + " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1247
                 "slave%(slave)d_%(index).4x_%(subindex).2x);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1248
        elif entry_infos["dir"] == "Q":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1249
            str_completion["publish_variables"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1250
                ("    EC_WRITE_%(data_type)s(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1251
                 "%(real_var)s);") % entry_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1252
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1253
def ExclusionSortFunction(x, y):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1254
    if x["matching"] == y["matching"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1255
        if x["assigned"] and not y["assigned"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1256
            return -1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1257
        elif not x["assigned"] and y["assigned"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1258
            return 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1259
        return cmp(x["count"], y["count"])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1260
    return -cmp(x["matching"], y["matching"])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1261
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1262
class _EthercatCFileGenerator:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1263
    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1264
    def __init__(self, controler):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1265
        self.Controler = controler
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1266
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1267
        self.Slaves = []
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1268
        self.UsedVariables = {}
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1269
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1270
    def __del__(self):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1271
        self.Controler = None            
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1272
    
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1273
    def DeclareSlave(self, slave_index, slave):
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1274
        self.Slaves.append((slave_index, slave.getInfo().getAutoIncAddr(), slave))
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1275
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1276
    def DeclareVariable(self, slave_index, index, subindex, iec_type, dir, name):
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1277
        slave_variables = self.UsedVariables.setdefault(slave_index, {})
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1278
        
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1279
        entry_infos = slave_variables.get((index, subindex), None)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1280
        if entry_infos is None:
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1281
            slave_variables[(index, subindex)] = {
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1282
                "infos": (iec_type, dir, name, []),
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1283
                "mapped": False}
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1284
            return name
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1285
        elif entry_infos["infos"][:2] == (iec_type, dir):
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1286
            if name != entry_infos["infos"][2]:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1287
                if dir == "I":
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1288
                    entry_infos["infos"][3].append(name)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1289
                    return entry_infos["infos"][2]
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1290
                else:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1291
                    raise ValueError, _("Output variables can't be defined with different locations (%s and %s)") % (entry_infos["infos"][2], name)
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1292
        else:
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1293
            print entry_infos["infos"][:2], (iec_type, dir)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1294
            raise ValueError, _("Definition conflict for location \"%s\"") % name 
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1295
        
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1296
    def GenerateCFile(self, filepath, location_str, master_number):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1297
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1298
        # Extract etherlab master code template
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1299
        plc_etherlab_filepath = os.path.join(os.path.split(__file__)[0], "plc_etherlab.c")
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1300
        plc_etherlab_file = open(plc_etherlab_filepath, 'r')
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1301
        plc_etherlab_code = plc_etherlab_file.read()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1302
        plc_etherlab_file.close()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1303
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1304
        # Initialize strings for formatting master code template
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1305
        str_completion = {
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1306
            "location": location_str,
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1307
            "master_number": master_number,
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1308
            "located_variables_declaration": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1309
            "used_pdo_entry_offset_variables_declaration": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1310
            "used_pdo_entry_configuration": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1311
            "pdos_configuration_declaration": "",
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1312
            "slaves_declaration": "",
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1313
            "slaves_configuration": "",
2039
3a218f6bd805 Adding support for uploading default value for unused entries in output pdos from slaves before starting master
laurent
parents: 2038
diff changeset
  1314
            "slaves_output_pdos_default_values_extraction": "",
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1315
            "slaves_initialization": "",
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1316
            "retrieve_variables": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1317
            "publish_variables": [],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1318
        }
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1319
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1320
        # Initialize variable storing variable mapping state
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1321
        for slave_entries in self.UsedVariables.itervalues():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1322
            for entry_infos in slave_entries.itervalues():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1323
                entry_infos["mapped"] = False
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1324
        
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1325
        # Sort slaves by position (IEC_Channel)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1326
        self.Slaves.sort()
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1327
        # Initialize dictionary storing alias auto-increment position values
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1328
        alias = {}
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1329
        
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1330
        # Generating code for each slave
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1331
        for (slave_idx, slave_alias, slave) in self.Slaves:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1332
            type_infos = slave.getType()
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1333
            
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1334
            # Defining slave alias and auto-increment position
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1335
            if alias.get(slave_alias) is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1336
                alias[slave_alias] += 1
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1337
            else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1338
                alias[slave_alias] = 0
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1339
            slave_pos = (slave_alias, alias[slave_alias])
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1340
            
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1341
            # Extract slave device informations
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1342
            device, alignment = self.Controler.GetModuleInfos(type_infos)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1343
            if device is not None:
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1344
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1345
                # Extract slaves variables to be mapped
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1346
                slave_variables = self.UsedVariables.get(slave_idx, {})
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1347
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1348
                # Extract slave device object dictionary entries
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1349
                device_entries = device.GetEntriesList()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1350
                
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1351
                # Adding code for declaring slave in master code template strings
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1352
                for element in ["vendor", "product_code", "revision_number"]:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1353
                    type_infos[element] = ExtractHexDecValue(type_infos[element])
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1354
                type_infos.update(dict(zip(["slave", "alias", "position"], (slave_idx,) + slave_pos)))
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1355
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1356
                # Extract slave device CoE informations
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1357
                device_coe = device.getCoE()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1358
                if device_coe is not None:
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1359
                    
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1360
                    # If device support CanOpen over Ethernet, adding code for calling 
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1361
                    # init commands when initializing slave in master code template strings
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1362
                    initCmds = []
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1363
                    for initCmd in device_coe.getInitCmd():
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1364
                        initCmds.append({
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1365
                            "Index": ExtractHexDecValue(initCmd.getIndex()),
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1366
                            "Subindex": ExtractHexDecValue(initCmd.getSubIndex()),
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1367
                            "Value": initCmd.getData().getcontent()})
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1368
                    initCmds.extend(slave.getStartupCommands())
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1369
                    for initCmd in initCmds:
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1370
                        index = initCmd["Index"]
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1371
                        subindex = initCmd["Subindex"]
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1372
                        entry = device_entries.get((index, subindex), None)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1373
                        if entry is not None:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1374
                            data_size = entry["BitSize"] / 8
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1375
                            data_str = ("0x%%.%dx" % (data_size * 2)) % initCmd["Value"]
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1376
                            init_cmd_infos = {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1377
                                "index": index,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1378
                                "subindex": subindex,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1379
                                "data": data_str,
2081
b1801bf4365c Fix bug in endianization in value transmit and received by SDO
Laurent Bessard
parents: 2080
diff changeset
  1380
                                "data_type": DATATYPECONVERSION.get(entry["Type"]),
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1381
                                "data_size": data_size
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1382
                            }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1383
                            init_cmd_infos.update(type_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1384
                            str_completion["slaves_initialization"] += SLAVE_INITIALIZATION_TEMPLATE % init_cmd_infos
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1385
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1386
                    # Extract slave device PDO configuration capabilities
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1387
                    PdoAssign = device_coe.getPdoAssign()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1388
                    PdoConfig = device_coe.getPdoConfig()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1389
                else:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1390
                    PdoAssign = PdoConfig = False
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1391
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1392
                # Test if slave has a configuration or need one
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1393
                if len(device.getTxPdo() + device.getRxPdo()) > 0 or len(slave_variables) > 0 and PdoConfig and PdoAssign:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1394
                    
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1395
                    str_completion["slaves_declaration"] += "static ec_slave_config_t *slave%(slave)d = NULL;\n" % type_infos
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1396
                    str_completion["slaves_configuration"] += SLAVE_CONFIGURATION_TEMPLATE % type_infos
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1397
                    
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1398
                    # Initializing 
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1399
                    pdos_infos = {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1400
                        "pdos_entries_infos": [],
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1401
                        "pdos_infos": [],
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1402
                        "pdos_sync_infos": [], 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1403
                    }
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1404
                    pdos_infos.update(type_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1405
                    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1406
                    sync_managers = []
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1407
                    for sync_manager_idx, sync_manager in enumerate(device.getSm()):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1408
                        sync_manager_infos = {
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1409
                            "index": sync_manager_idx, 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1410
                            "name": sync_manager.getcontent(),
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1411
                            "slave": slave_idx,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1412
                            "pdos": [], 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1413
                            "pdos_number": 0,
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1414
                        }
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1415
                        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1416
                        sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1417
                        sync_manager_direction = sync_manager_control_byte & 0x0c
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1418
                        sync_manager_watchdog = sync_manager_control_byte & 0x40
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1419
                        if sync_manager_direction:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1420
                            sync_manager_infos["sync_manager_type"] = "EC_DIR_OUTPUT"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1421
                        else:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1422
                            sync_manager_infos["sync_manager_type"] = "EC_DIR_INPUT"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1423
                        if sync_manager_watchdog:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1424
                            sync_manager_infos["watchdog"] = "EC_WD_ENABLE"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1425
                        else:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1426
                            sync_manager_infos["watchdog"] = "EC_WD_DISABLE"
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1427
                        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1428
                        sync_managers.append(sync_manager_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1429
                    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1430
                    pdos_index = []
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1431
                    exclusive_pdos = {}
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1432
                    selected_pdos = []
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1433
                    for pdo, pdo_type in ([(pdo, "Inputs") for pdo in device.getTxPdo()] +
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1434
                                          [(pdo, "Outputs") for pdo in device.getRxPdo()]):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1435
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1436
                        pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1437
                        pdos_index.append(pdo_index)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1438
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1439
                        excluded_list = pdo.getExclude()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1440
                        if len(excluded_list) > 0:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1441
                            exclusion_list = [pdo_index]
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1442
                            for excluded in excluded_list:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1443
                                exclusion_list.append(ExtractHexDecValue(excluded.getcontent()))
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1444
                            exclusion_list.sort()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1445
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1446
                            exclusion_scope = exclusive_pdos.setdefault(tuple(exclusion_list), [])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1447
                            
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1448
                            entries = pdo.getEntry()
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1449
                            pdo_mapping_match = {
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1450
                                "index": pdo_index, 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1451
                                "matching": 0, 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1452
                                "count": len(entries), 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1453
                                "assigned": pdo.getSm() is not None
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1454
                            }
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1455
                            exclusion_scope.append(pdo_mapping_match)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1456
                            
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1457
                            for entry in entries:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1458
                                index = ExtractHexDecValue(entry.getIndex().getcontent())
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1459
                                subindex = ExtractHexDecValue(entry.getSubIndex())
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1460
                                if slave_variables.get((index, subindex), None) is not None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1461
                                    pdo_mapping_match["matching"] += 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1462
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1463
                        elif pdo.getMandatory():
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1464
                            selected_pdos.append(pdo_index)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1465
                    
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1466
                    excluded_pdos = []
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1467
                    for exclusion_scope in exclusive_pdos.itervalues():
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1468
                        exclusion_scope.sort(ExclusionSortFunction)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1469
                        start_excluding_index = 0
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1470
                        if exclusion_scope[0]["matching"] > 0:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1471
                            selected_pdos.append(exclusion_scope[0]["index"])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1472
                            start_excluding_index = 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1473
                        excluded_pdos.extend([pdo["index"] for pdo in exclusion_scope[start_excluding_index:] if PdoAssign or not pdo["assigned"]])
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1474
                    
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1475
                    for pdo, pdo_type in ([(pdo, "Inputs") for pdo in device.getTxPdo()] +
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1476
                                          [(pdo, "Outputs") for pdo in device.getRxPdo()]):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1477
                        entries = pdo.getEntry()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1478
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1479
                        pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1480
                        if pdo_index in excluded_pdos:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1481
                            continue
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1482
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1483
                        pdo_needed = pdo_index in selected_pdos
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1484
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1485
                        entries_infos = []
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1486
                        
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1487
                        for entry in entries:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1488
                            index = ExtractHexDecValue(entry.getIndex().getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1489
                            subindex = ExtractHexDecValue(entry.getSubIndex())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1490
                            entry_infos = {
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1491
                                "index": index,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1492
                                "subindex": subindex,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1493
                                "name": ExtractName(entry.getName()),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1494
                                "bitlen": entry.getBitLen(),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1495
                            }
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1496
                            entry_infos.update(type_infos)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1497
                            entries_infos.append("    {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1498
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1499
                            entry_declaration = slave_variables.get((index, subindex), None)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1500
                            if entry_declaration is not None and not entry_declaration["mapped"]:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1501
                                pdo_needed = True
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1502
                                
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1503
                                entry_infos.update(dict(zip(["var_type", "dir", "var_name", "extra_declarations"], entry_declaration["infos"])))
2082
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1504
                                entry_declaration["mapped"] = True
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1505
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1506
                                entry_type = entry.getDataType().getcontent()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1507
                                if entry_infos["var_type"] != entry_type:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1508
                                    message = _("Wrong type for location \"%s\"!") % entry_infos["var_name"]
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1509
                                    if (self.Controler.GetSizeOfType(entry_infos["var_type"]) != 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1510
                                        self.Controler.GetSizeOfType(entry_type)):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1511
                                        raise ValueError, message
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1512
                                    else:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1513
                                        self.Controler.GetCTRoot().logger.write_warning(_("Warning: ") + message + "\n")
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1514
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1515
                                if (entry_infos["dir"] == "I" and pdo_type != "Inputs" or 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1516
                                    entry_infos["dir"] == "Q" and pdo_type != "Outputs"):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1517
                                    raise ValueError, _("Wrong direction for location \"%s\"!") % entry_infos["var_name"]
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1518
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1519
                                ConfigureVariable(entry_infos, str_completion)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1520
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1521
                            elif pdo_type == "Outputs" and entry.getDataType() is not None and device_coe is not None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1522
                                data_type = entry.getDataType().getcontent()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1523
                                entry_infos["dir"] = "Q"
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1524
                                entry_infos["data_size"] = max(1, entry_infos["bitlen"] / 8)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1525
                                entry_infos["data_type"] = DATATYPECONVERSION.get(data_type)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1526
                                entry_infos["var_type"] = data_type
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1527
                                entry_infos["real_var"] = "slave%(slave)d_%(index).4x_%(subindex).2x_default" % entry_infos
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1528
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1529
                                ConfigureVariable(entry_infos, str_completion)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1530
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1531
                                str_completion["slaves_output_pdos_default_values_extraction"] += \
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1532
                                    SLAVE_OUTPUT_PDO_DEFAULT_VALUE % entry_infos
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1533
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1534
                        if pdo_needed:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1535
                            for excluded in pdo.getExclude():
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1536
                                excluded_index = ExtractHexDecValue(excluded.getcontent())
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1537
                                if excluded_index not in excluded_pdos:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1538
                                    excluded_pdos.append(excluded_index)
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1539
                            
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1540
                            sm = pdo.getSm()
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1541
                            if sm is None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1542
                                for sm_idx, sync_manager in enumerate(sync_managers):
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1543
                                    if sync_manager["name"] == pdo_type:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1544
                                        sm = sm_idx
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1545
                            if sm is None:
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1546
                                raise ValueError, _("No sync manager available for %s pdo!") % pdo_type
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1547
                                
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1548
                            sync_managers[sm]["pdos_number"] += 1
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1549
                            sync_managers[sm]["pdos"].append(
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1550
                                {"slave": slave_idx,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1551
                                 "index": pdo_index,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1552
                                 "name": ExtractName(pdo.getName()),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1553
                                 "type": pdo_type, 
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1554
                                 "entries": entries_infos,
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1555
                                 "entries_number": len(entries_infos),
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1556
                                 "fixed": pdo.getFixed() == True})
caae3ad2d03b Adding support for selecting a PDO in a list of mutually exclusive configured PDOs in Ethercat Network Configurator
Laurent Bessard
parents: 2081
diff changeset
  1557
                
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1558
                    if PdoConfig and PdoAssign:
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1559
                        dynamic_pdos = {}
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1560
                        dynamic_pdos_number = 0
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1561
                        for category, min_index, max_index in [("Inputs", 0x1600, 0x1800), 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1562
                                                               ("Outputs", 0x1a00, 0x1C00)]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1563
                            for sync_manager in sync_managers:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1564
                                if sync_manager["name"] == category:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1565
                                    category_infos = dynamic_pdos.setdefault(category, {})
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1566
                                    category_infos["sync_manager"] = sync_manager
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1567
                                    category_infos["pdos"] = [pdo for pdo in category_infos["sync_manager"]["pdos"] 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1568
                                                              if not pdo["fixed"] and pdo["type"] == category]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1569
                                    category_infos["current_index"] = min_index
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1570
                                    category_infos["max_index"] = max_index
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1571
                                    break
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1572
                        
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1573
                        for (index, subindex), entry_declaration in slave_variables.iteritems():
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1574
                            
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1575
                            if not entry_declaration["mapped"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1576
                                entry = device_entries.get((index, subindex), None)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1577
                                if entry is None:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1578
                                    raise ValueError, _("Unknown entry index 0x%4.4x, subindex 0x%2.2x for device %s") % \
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1579
                                                     (index, subindex, type_infos["device_type"])
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1580
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1581
                                entry_infos = {
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1582
                                    "index": index,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1583
                                    "subindex": subindex,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1584
                                    "name": entry["Name"],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1585
                                    "bitlen": entry["BitSize"],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1586
                                }
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1587
                                entry_infos.update(type_infos)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1588
                                
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1589
                                entry_infos.update(dict(zip(["var_type", "dir", "var_name", "extra_declarations"], entry_declaration["infos"])))
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1590
                                entry_declaration["mapped"] = True
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1591
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1592
                                if entry_infos["var_type"] != entry["Type"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1593
                                    message = _("Wrong type for location \"%s\"!") % entry_infos["var_name"]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1594
                                    if (self.Controler.GetSizeOfType(entry_infos["var_type"]) != 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1595
                                        self.Controler.GetSizeOfType(entry["Type"])):
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1596
                                        raise ValueError, message
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1597
                                    else:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1598
                                        self.Controler.GetCTRoot().logger.write_warning(message + "\n")
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1599
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1600
                                if entry_infos["dir"] == "I" and entry["PDOMapping"] in ["T", "RT"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1601
                                    pdo_type = "Inputs"
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1602
                                elif entry_infos["dir"] == "Q" and entry["PDOMapping"] in ["R", "RT"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1603
                                    pdo_type = "Outputs"
2045
62e102935f3e Adding test project using higen drive
laurent
parents: 2043
diff changeset
  1604
                                else:
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1605
                                    raise ValueError, _("Wrong direction for location \"%s\"!") % entry_infos["var_name"]
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1606
                                
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1607
                                if not dynamic_pdos.has_key(pdo_type):
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1608
                                    raise ValueError, _("No Sync manager defined for %s!") % pdo_type
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1609
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1610
                                ConfigureVariable(entry_infos, str_completion)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1611
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1612
                                if len(dynamic_pdos[pdo_type]["pdos"]) > 0:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1613
                                    pdo = dynamic_pdos[pdo_type]["pdos"][0]
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1614
                                else:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1615
                                    while dynamic_pdos[pdo_type]["current_index"] in pdos_index:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1616
                                        dynamic_pdos[pdo_type]["current_index"] += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1617
                                    if dynamic_pdos[pdo_type]["current_index"] >= dynamic_pdos[pdo_type]["max_index"]:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1618
                                        raise ValueError, _("No more free PDO index available for %s!") % pdo_type
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1619
                                    pdos_index.append(dynamic_pdos[pdo_type]["current_index"])
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1620
                                    
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1621
                                    dynamic_pdos_number += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1622
                                    pdo = {"slave": slave_idx,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1623
                                           "index": dynamic_pdos[pdo_type]["current_index"],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1624
                                           "name": "Dynamic PDO %d" % dynamic_pdos_number,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1625
                                           "type": pdo_type, 
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1626
                                           "entries": [],
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1627
                                           "entries_number": 0,
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1628
                                           "fixed": False}
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1629
                                    dynamic_pdos[pdo_type]["sync_manager"]["pdos_number"] += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1630
                                    dynamic_pdos[pdo_type]["sync_manager"]["pdos"].append(pdo)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1631
                                    dynamic_pdos[pdo_type]["pdos"].append(pdo)
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1632
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1633
                                pdo["entries"].append("    {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1634
                                if entry_infos["bitlen"] < alignment:
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  1635
                                    print (alignment, entry_infos["bitlen"])
2099
ea5384ab152c Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2098
diff changeset
  1636
                                    pdo["entries"].append("    {0x0000, 0x00, %d}, /* None */" % (alignment - entry_infos["bitlen"]))
2062
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1637
                                pdo["entries_number"] += 1
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1638
                                
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1639
                                if pdo["entries_number"] == 255:
c485269ec443 Adding support for getting CIA402 slave AXIS_REF located variables and disabling dynamic PDO mapping algorithm for drives than doesn't support this functionality
Laurent Bessard
parents: 2057
diff changeset
  1640
                                    dynamic_pdos[pdo_type]["pdos"].pop(0)
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1641
                    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1642
                    pdo_offset = 0
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1643
                    entry_offset = 0
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1644
                    for sync_manager_infos in sync_managers:
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1645
                    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1646
                        for pdo_infos in sync_manager_infos["pdos"]:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1647
                            pdo_infos["offset"] = entry_offset
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1648
                            pdo_entries = pdo_infos["entries"]
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1649
                            pdos_infos["pdos_infos"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1650
                                ("    {0x%(index).4x, %(entries_number)d, " + 
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1651
                                 "slave_%(slave)d_pdo_entries + %(offset)d}, /* %(name)s */") % pdo_infos)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1652
                            entry_offset += len(pdo_entries)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1653
                            pdos_infos["pdos_entries_infos"].extend(pdo_entries)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1654
                        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1655
                        sync_manager_infos["offset"] = pdo_offset
2047
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1656
                        pdo_offset_shift = sync_manager_infos["pdos_number"]
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1657
                        pdos_infos["pdos_sync_infos"].append(
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1658
                            ("    {%(index)d, %(sync_manager_type)s, %(pdos_number)d, " + 
2047
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1659
                             ("slave_%(slave)d_pdos + %(offset)d" if pdo_offset_shift else "NULL") +
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1660
                             ", %(watchdog)s},") % sync_manager_infos)
b0b7bd288b6e Fixed wrong PDO in unused sync managers\nFix higen drive ethercat example
edouard_and_laurent
parents: 2045
diff changeset
  1661
                        pdo_offset += pdo_offset_shift  
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1662
                    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1663
                    for element in ["pdos_entries_infos", "pdos_infos", "pdos_sync_infos"]:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1664
                        pdos_infos[element] = "\n".join(pdos_infos[element])
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1665
                    
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1666
                    str_completion["pdos_configuration_declaration"] += SLAVE_PDOS_CONFIGURATION_DECLARATION % pdos_infos
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1667
                
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1668
                for (index, subindex), entry_declaration in slave_variables.iteritems():
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1669
                    if not entry_declaration["mapped"]:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1670
                        message = _("Entry index 0x%4.4x, subindex 0x%2.2x not mapped for device %s") % \
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1671
                                        (index, subindex, type_infos["device_type"])
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1672
                        self.Controler.GetCTRoot().logger.write_warning(_("Warning: ") + message + "\n")
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1673
                    
2023
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1674
        for element in ["used_pdo_entry_offset_variables_declaration", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1675
                        "used_pdo_entry_configuration", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1676
                        "located_variables_declaration", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1677
                        "retrieve_variables", 
f9f884cf3033 Adding support for not configuring pdos when not mandatory and not needed by locations defined in PLC program. Adding support for displaying locations tree in Topology panel and BrowseLocationsDialog. Merging pdos grid and variables grid into one single grid in slave infos panel.
laurent
parents: 2022
diff changeset
  1678
                        "publish_variables"]:
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1679
            str_completion[element] = "\n".join(str_completion[element])
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1680
        
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1681
        etherlabfile = open(filepath, 'w')
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1682
        etherlabfile.write(plc_etherlab_code % str_completion)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1683
        etherlabfile.close()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1684
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1685
#--------------------------------------------------
2048
5726f2bbdace reflected changes in beremiz extension mechanism
Edouard Tisserant
parents: 2047
diff changeset
  1686
#                 Ethercat ConfNode
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1687
#--------------------------------------------------
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1688
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1689
EtherCATInfoClasses = GenerateClassesFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATInfo.xsd")) 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1690
2074
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1691
cls = EtherCATInfoClasses["EtherCATBase.xsd"].get("DictionaryType", None)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1692
if cls:
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1693
    cls.loadXMLTreeArgs = None
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1694
    
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1695
    setattr(cls, "_loadXMLTree", getattr(cls, "loadXMLTree"))
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1696
    
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1697
    def loadXMLTree(self, *args):
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1698
        self.loadXMLTreeArgs = args
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1699
    setattr(cls, "loadXMLTree", loadXMLTree)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1700
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1701
    def load(self):
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1702
        if self.loadXMLTreeArgs is not None:
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1703
            self._loadXMLTree(*self.loadXMLTreeArgs)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1704
            self.loadXMLTreeArgs = None
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1705
    setattr(cls, "load", load)
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1706
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1707
cls = EtherCATInfoClasses["EtherCATInfo.xsd"].get("DeviceType", None)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1708
if cls:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1709
    cls.DataTypes = None
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1710
    
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1711
    def GetProfileNumbers(self):
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1712
        profiles = []
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1713
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1714
        for profile in self.getProfile():
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1715
            profile_content = profile.getcontent()
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1716
            if profile_content is None:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1717
                continue
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1718
            
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1719
            for content_element in profile_content["value"]:
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1720
                if content_element["name"] == "ProfileNo":
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1721
                    profiles.append(content_element["value"])
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1722
        
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1723
        return profiles
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1724
    setattr(cls, "GetProfileNumbers", GetProfileNumbers)
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1725
    
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1726
    def GetProfileDictionaries(self):
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1727
        dictionaries = []
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1728
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1729
        for profile in self.getProfile():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1730
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1731
            profile_content = profile.getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1732
            if profile_content is None:
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1733
                continue
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1734
            
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1735
            for content_element in profile_content["value"]:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1736
                if content_element["name"] == "Dictionary":
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1737
                    dictionaries.append(content_element["value"])
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1738
                elif content_element["name"] == "DictionaryFile":
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1739
                    raise ValueError, "DictionaryFile for defining Device Profile is not yet supported!"
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1740
                
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1741
        return dictionaries
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1742
    setattr(cls, "GetProfileDictionaries", GetProfileDictionaries)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1743
    
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1744
    def ExtractDataTypes(self):
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1745
        self.DataTypes = {}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1746
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1747
        for dictionary in self.GetProfileDictionaries():
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1748
            dictionary.load()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1749
            
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1750
            datatypes = dictionary.getDataTypes()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1751
            if datatypes is not None:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1752
                
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1753
                for datatype in datatypes.getDataType():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1754
                    content = datatype.getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1755
                    if content is not None and content["name"] == "SubItem":
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1756
                        self.DataTypes[datatype.getName()] = datatype
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1757
    
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1758
    setattr(cls, "ExtractDataTypes", ExtractDataTypes)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1759
    
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1760
    def getCoE(self):
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1761
        mailbox = self.getMailbox()
2079
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1762
        if mailbox is not None:
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1763
            return mailbox.getCoE()
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1764
        return None
49242019a9ca Fix C code Generator to use CoE section contained in the slave ESI file for defining Ethercat network configuration
Laurent Bessard
parents: 2077
diff changeset
  1765
    setattr(cls, "getCoE", getCoE)
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1766
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1767
    def GetEntriesList(self, limits=None):
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1768
        if self.DataTypes is None:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1769
            self.ExtractDataTypes()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1770
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1771
        entries = {}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1772
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1773
        for dictionary in self.GetProfileDictionaries():
2074
bf2fa4cb62a9 Adding support for loading Profile dictionaries only if needed
Laurent Bessard
parents: 2073
diff changeset
  1774
            dictionary.load()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1775
            
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1776
            for object in dictionary.getObjects().getObject():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1777
                entry_index = object.getIndex().getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1778
                index = ExtractHexDecValue(entry_index)
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1779
                if limits is None or limits[0] <= index <= limits[1]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1780
                    entry_type = object.getType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1781
                    entry_name = ExtractName(object.getName())
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1782
                    
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1783
                    entry_type_infos = self.DataTypes.get(entry_type, None)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1784
                    if entry_type_infos is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1785
                        content = entry_type_infos.getcontent()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1786
                        for subitem in content["value"]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1787
                            entry_subidx = subitem.getSubIdx()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1788
                            if entry_subidx is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1789
                                entry_subidx = "0"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1790
                            subidx = ExtractHexDecValue(entry_subidx)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1791
                            subitem_access = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1792
                            subitem_pdomapping = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1793
                            subitem_flags = subitem.getFlags()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1794
                            if subitem_flags is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1795
                                access = subitem_flags.getAccess()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1796
                                if access is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1797
                                    subitem_access = access.getcontent()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1798
                                pdomapping = subitem_flags.getPdoMapping()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1799
                                if pdomapping is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1800
                                    subitem_pdomapping = pdomapping.upper()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1801
                            entries[(index, subidx)] = {
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1802
                                "Index": entry_index,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1803
                                "SubIndex": entry_subidx,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1804
                                "Name": "%s - %s" % 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1805
                                        (entry_name.decode("utf-8"),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1806
                                         ExtractName(subitem.getDisplayName(), 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1807
                                                     subitem.getName()).decode("utf-8")),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1808
                                "Type": subitem.getType(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1809
                                "BitSize": subitem.getBitSize(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1810
                                "Access": subitem_access, 
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1811
                                "PDOMapping": subitem_pdomapping}
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1812
                    else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1813
                        entry_access = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1814
                        entry_pdomapping = ""
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1815
                        entry_flags = object.getFlags()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1816
                        if entry_flags is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1817
                            access = entry_flags.getAccess()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1818
                            if access is not None:
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1819
                                entry_access = access.getcontent()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1820
                            pdomapping = entry_flags.getPdoMapping()
2032
766078d83e22 Adding support for DS402 node subplugin (only simple state transition implemented)
laurent
parents: 2031
diff changeset
  1821
                            if pdomapping is not None:
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1822
                                entry_pdomapping = pdomapping.upper()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1823
                        entries[(index, 0)] = {
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1824
                             "Index": entry_index,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1825
                             "SubIndex": "0",
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1826
                             "Name": entry_name,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1827
                             "Type": entry_type,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1828
                             "BitSize": object.getBitSize(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1829
                             "Access": entry_access,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1830
                             "PDOMapping": entry_pdomapping}
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1831
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1832
        for TxPdo in self.getTxPdo():
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1833
            ExtractPdoInfos(TxPdo, "Transmit", entries, limits)
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1834
        for RxPdo in self.getRxPdo():
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1835
            ExtractPdoInfos(RxPdo, "Receive", entries, limits)
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1836
        
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1837
        return entries
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1838
    setattr(cls, "GetEntriesList", GetEntriesList)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1839
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1840
    def GetSyncManagers(self):
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1841
        sync_managers = []
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1842
        for sync_manager in self.getSm():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1843
            sync_manager_infos = {}
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1844
            for name, value in [("Name", sync_manager.getcontent()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1845
                                ("Start Address", sync_manager.getStartAddress()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1846
                                ("Default Size", sync_manager.getDefaultSize()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1847
                                ("Control Byte", sync_manager.getControlByte()),
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1848
                                ("Enable", sync_manager.getEnable())]:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1849
                if value is None:
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1850
                    value =""
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1851
                sync_manager_infos[name] = value
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1852
            sync_managers.append(sync_manager_infos)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1853
        return sync_managers
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1854
    setattr(cls, "GetSyncManagers", GetSyncManagers)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1855
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1856
def GroupItemCompare(x, y):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1857
    if x["type"] == y["type"]:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1858
        if x["type"] == ETHERCAT_GROUP:
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1859
            return cmp(x["order"], y["order"])
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1860
        else:
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  1861
            return cmp(x["name"], y["name"])
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1862
    elif x["type"] == ETHERCAT_GROUP:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1863
        return -1
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1864
    return 1
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1865
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1866
def SortGroupItems(group):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1867
    for item in group["children"]:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1868
        if item["type"] == ETHERCAT_GROUP:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1869
            SortGroupItems(item)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1870
    group["children"].sort(GroupItemCompare)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1871
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1872
def ExtractName(names, default=None):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1873
    if len(names) == 1:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1874
        return names[0].getcontent()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1875
    else:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1876
        for name in names:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1877
            if name.getLcId() == 1033:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1878
                return name.getcontent()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1879
    return default
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1880
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1881
def ExtractPdoInfos(pdo, pdo_type, entries, limits=None):
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1882
    pdo_index = pdo.getIndex().getcontent()
2029
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1883
    pdo_name = ExtractName(pdo.getName())
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1884
    for pdo_entry in pdo.getEntry():
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1885
        entry_index = pdo_entry.getIndex().getcontent()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1886
        entry_subindex = pdo_entry.getSubIndex()
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1887
        index = ExtractHexDecValue(entry_index)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1888
        subindex = ExtractHexDecValue(entry_subindex)
7c848efa21c6 Adding support for displaying slave sync managers and profile object dictionary and for arbitrarily mapping variable through variable location
laurent
parents: 2026
diff changeset
  1889
        
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1890
        if limits is None or limits[0] <= index <= limits[1]:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1891
            entry = entries.get((index, subindex), None)
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1892
            if entry is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1893
                entry["PDO index"] = pdo_index
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1894
                entry["PDO name"] = pdo_name
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1895
                entry["PDO type"] = pdo_type
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1896
            else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1897
                entry_type = pdo_entry.getDataType()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1898
                if entry_type is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1899
                    if pdo_type == "Transmit":
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1900
                        access = "ro"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1901
                        pdomapping = "T"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1902
                    else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1903
                        access = "wo"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1904
                        pdomapping = "R"
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1905
                    entries[(index, subindex)] = {
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1906
                        "Index": entry_index,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1907
                        "SubIndex": entry_subindex,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1908
                        "Name": ExtractName(pdo_entry.getName()),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1909
                        "Type": entry_type.getcontent(),
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1910
                        "Access": access,
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1911
                        "PDOMapping": pdomapping}
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1912
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1913
DEFAULT_ALIGNMENT = 8
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1914
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1915
class ModulesLibrary:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1916
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1917
    def __init__(self, path, parent_library=None):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1918
        self.Path = path
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1919
        if not os.path.exists(self.Path):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1920
            os.makedirs(self.Path)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1921
        self.ParentLibrary = parent_library
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1922
        
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1923
        if parent_library is not None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1924
            self.LoadModules()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1925
        else:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1926
            self.Library = None
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1927
        self.LoadAlignments()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1928
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1929
    def GetPath(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1930
        return self.Path
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1931
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1932
    def GetAlignmentFilePath(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1933
        return os.path.join(self.Path, "alignments.cfg")
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1934
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1935
    def LoadModules(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1936
        self.Library = {}
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1937
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1938
        files = os.listdir(self.Path)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1939
        for file in files:
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1940
            filepath = os.path.join(self.Path, file)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1941
            if os.path.isfile(filepath) and os.path.splitext(filepath)[-1] == ".xml":
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1942
                xmlfile = open(filepath, 'r')
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1943
                xml_tree = minidom.parse(xmlfile)
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1944
                xmlfile.close()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1945
                
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1946
                modules_infos = None
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1947
                for child in xml_tree.childNodes:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1948
                    if child.nodeType == xml_tree.ELEMENT_NODE and child.nodeName == "EtherCATInfo":
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1949
                        modules_infos = EtherCATInfoClasses["EtherCATInfo.xsd"]["EtherCATInfo"]()
2051
13dee9322beb refactoring
laurent
parents: 2047
diff changeset
  1950
                        modules_infos.loadXMLTree(child)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1951
                
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1952
                if modules_infos is not None:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1953
                    vendor = modules_infos.getVendor()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1954
                    
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1955
                    vendor_category = self.Library.setdefault(ExtractHexDecValue(vendor.getId()), 
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1956
                                                              {"name": ExtractName(vendor.getName(), _("Miscellaneous")), 
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1957
                                                               "groups": {}})
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1958
                    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1959
                    for group in modules_infos.getDescriptions().getGroups().getGroup():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1960
                        group_type = group.getType()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1961
                        
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1962
                        vendor_category["groups"].setdefault(group_type, {"name": ExtractName(group.getName(), group_type), 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1963
                                                                          "parent": group.getParentGroup(),
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1964
                                                                          "order": group.getSortOrder(), 
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1965
                                                                          "devices": []})
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1966
                    
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1967
                    for device in modules_infos.getDescriptions().getDevices().getDevice():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1968
                        device_group = device.getGroupType()
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1969
                        if not vendor_category["groups"].has_key(device_group):
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1970
                            raise ValueError, "Not such group \"%\"" % device_group
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1971
                        vendor_category["groups"][device_group]["devices"].append((device.getType().getcontent(), device))
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1972
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1973
    def GetModulesLibrary(self, profile_filter=None):
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1974
        if self.Library is None:
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  1975
            self.LoadModules()
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1976
        library = []
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1977
        for vendor_id, vendor in self.Library.iteritems():
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1978
            groups = []
2073
d14ab97a452a Fix bug modules present in all groups with the same name even if they are defined by different vendors
Laurent Bessard
parents: 2069
diff changeset
  1979
            children_dict = {}
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1980
            for group_type, group in vendor["groups"].iteritems():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1981
                group_infos = {"name": group["name"],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1982
                               "order": group["order"],
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1983
                               "type": ETHERCAT_GROUP,
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1984
                               "infos": None,
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1985
                               "children": children_dict.setdefault(group_type, [])}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1986
                device_dict = {}
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  1987
                for device_type, device in group["devices"]:
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1988
                    if profile_filter is None or profile_filter in device.GetProfileNumbers():
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1989
                        product_code = device.getType().getProductCode()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1990
                        revision_number = device.getType().getRevisionNo()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1991
                        alignment = self.GetAlignment(vendor_id, product_code, revision_number)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1992
                        device_infos = {"name": ExtractName(device.getName()),
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1993
                                        "type": ETHERCAT_DEVICE,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1994
                                        "infos": {"device_type": device_type,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1995
                                                  "vendor": vendor_id,
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1996
                                                  "product_code": product_code,
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1997
                                                  "revision_number": revision_number,
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  1998
                                                  "alignment": alignment},
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  1999
                                        "children": []}
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2000
                        group_infos["children"].append(device_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2001
                        device_type_occurrences = device_dict.setdefault(device_type, [])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2002
                        device_type_occurrences.append(device_infos)
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  2003
                for device_type_occurrences in device_dict.itervalues():
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  2004
                    if len(device_type_occurrences) > 1:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  2005
                        for occurrence in device_type_occurrences:
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  2006
                            occurrence["name"] += _(" (rev. %s)") % occurrence["infos"]["revision_number"]
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2007
                if len(group_infos["children"]) > 0:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2008
                    if group["parent"] is not None:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2009
                        parent_children = children_dict.setdefault(group["parent"], [])
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2010
                        parent_children.append(group_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2011
                    else:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2012
                        groups.append(group_infos)
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2013
            if len(groups) > 0:
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2014
                library.append({"name": vendor["name"],
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2015
                                "type": ETHERCAT_VENDOR,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2016
                                "infos": None,
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2017
                                "children": groups})
2031
c6f32810723e Fix some issues regarding arbitrary variable mapping
laurent
parents: 2030
diff changeset
  2018
        library.sort(lambda x, y: cmp(x["name"], y["name"]))
2022
c2295d311402 First working implementation of Beremiz plugin for etherlab
laurent
parents:
diff changeset
  2019
        return library
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2020
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2021
    def GetVendors(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2022
        return [(vendor_id, vendor["name"]) for vendor_id, vendor in self.Library.items()]
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2023
    
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2024
    def GetModuleInfos(self, module_infos):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2025
        vendor = ExtractHexDecValue(module_infos["vendor"])
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2026
        vendor_infos = self.Library.get(vendor)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2027
        if vendor_infos is not None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2028
            for group_name, group_infos in vendor_infos["groups"].iteritems():
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2029
                for device_type, device_infos in group_infos["devices"]:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2030
                    product_code = ExtractHexDecValue(device_infos.getType().getProductCode())
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2031
                    revision_number = ExtractHexDecValue(device_infos.getType().getRevisionNo())
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2032
                    if (product_code == ExtractHexDecValue(module_infos["product_code"]) and
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2033
                        revision_number == ExtractHexDecValue(module_infos["revision_number"])):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2034
                        return device_infos, self.GetAlignment(vendor, product_code, revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2035
        return None, None
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2036
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2037
    def ImportModuleLibrary(self, filepath):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2038
        if os.path.isfile(filepath):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2039
            shutil.copy(filepath, self.Path)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2040
            self.LoadModules()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2041
            return True
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2042
        return False
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2043
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2044
    def LoadAlignments(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2045
        self.Alignments = {}
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2046
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2047
        csvfile_path = self.GetAlignmentFilePath()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2048
        if os.path.exists(csvfile_path):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2049
            csvfile = open(csvfile_path, "rb")
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2050
            sample = csvfile.read(1024)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2051
            csvfile.seek(0)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2052
            dialect = csv.Sniffer().sniff(sample)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2053
            has_header = csv.Sniffer().has_header(sample)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2054
            reader = csv.reader(csvfile, dialect)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2055
            for row in reader:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2056
                if has_header:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2057
                    has_header = False
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2058
                else:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2059
                    try:
2101
da450992572e Added code generation for process variables
Laurent Bessard
parents: 2099
diff changeset
  2060
                        self.Alignments[tuple(map(int, row[:3]))] = int(row[3])
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2061
                    except:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2062
                        pass
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2063
            csvfile.close()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2064
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2065
    def SaveAlignments(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2066
        csvfile = open(self.GetAlignmentFilePath(), "wb")
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2067
        writer = csv.writer(csvfile, delimiter=';')
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2068
        writer.writerow(['Vendor', 'product_code', 'revision_number', 'alignment'])
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2069
        for (vendor, product_code, revision_number), alignment in self.Alignments.iteritems():
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2070
            writer.writerow([vendor, product_code, revision_number, alignment])
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2071
        csvfile.close()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2072
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2073
    def SetAlignment(self, vendor, product_code, revision_number, alignment):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2074
        vendor = ExtractHexDecValue(vendor)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2075
        product_code = ExtractHexDecValue(product_code)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2076
        revision_number = ExtractHexDecValue(revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2077
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2078
        self.Alignments[tuple([vendor, product_code, revision_number])] = alignment
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2079
        self.SaveAlignments()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2080
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2081
    def GetAlignment(self, vendor, product_code, revision_number):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2082
        vendor = ExtractHexDecValue(vendor)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2083
        product_code = ExtractHexDecValue(product_code)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2084
        revision_number = ExtractHexDecValue(revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2085
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2086
        alignment = self.Alignments.get(tuple([vendor, product_code, revision_number]))
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2087
        if alignment is not None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2088
            return alignment
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2089
        
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2090
        if self.ParentLibrary is not None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2091
            return self.ParentLibrary.GetAlignment(vendor, product_code, revision_number)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2092
        return DEFAULT_ALIGNMENT
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2093
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2094
USERDATA_DIR = wx.StandardPaths.Get().GetUserDataDir()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2095
if wx.Platform != '__WXMSW__':
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2096
    USERDATA_DIR += '_files'
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2098
ModulesDatabase = ModulesLibrary(
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2099
    os.path.join(USERDATA_DIR, "ethercat_modules"))
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2100
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2101
class RootClass:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2102
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2103
    CTNChildrenTypes = [("EthercatNode",_EthercatCTN,"Ethercat Master")]
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2104
    EditorType = LibraryEditor
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2105
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2106
    def __init__(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2107
        self.ModulesLibrary = None
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2108
        self.LoadModulesLibrary()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2109
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2110
    def GetModulesLibraryPath(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2111
        return os.path.join(self.CTNPath(), "modules") 
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2112
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2113
    def CTNGenerate_C(self, buildpath, locations):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2114
        return [],"",False
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2115
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2116
    def LoadModulesLibrary(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2117
        if self.ModulesLibrary is None:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2118
            self.ModulesLibrary = ModulesLibrary(self.GetModulesLibraryPath(), ModulesDatabase)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2119
        else:
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2120
            self.ModulesLibrary.LoadModulesLibrary()
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2121
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2122
    def GetModulesDatabaseInstance(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2123
        return ModulesDatabase
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2124
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2125
    def GetModulesLibraryInstance(self):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2126
        return self.ModulesLibrary
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2127
    
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2128
    def GetModulesLibrary(self, profile_filter=None):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2129
        return self.ModulesLibrary.GetModulesLibrary(profile_filter)
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2130
    
2098
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2131
    def GetVendors(self):
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2132
        return self.ModulesLibrary.GetVendors()
392791b5cc04 Improved Ethercat Network Configurator panels
Laurent Bessard
parents: 2097
diff changeset
  2133
    
2097
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2134
    def GetModuleInfos(self, module_infos):
58d07e039896 Added panel for managing ESI files from project and from database including module PDO alignment setting
Laurent Bessard
parents: 2096
diff changeset
  2135
        return self.ModulesLibrary.GetModuleInfos(module_infos)
2041
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2136
ce3727171207 Defining all slaves as Etherlab master subplugin instead of editing them in an editor with vertical notebook
laurent
parents: 2039
diff changeset
  2137