config_utils.py
author lbessard
Wed, 25 Jul 2007 17:58:18 +0200
changeset 1 6e9f24fd1b98
child 3 6d8728efcdec
permissions -rw-r--r--
Adding Build Method for PLC program generating
1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     1
#!/usr/bin/env python
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     3
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     4
#This file is part of CanFestival, a library implementing CanOpen Stack. 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     5
#
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     6
#Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     7
#
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     8
#See COPYING file for copyrights details.
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
     9
#
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    10
#This library is free software; you can redistribute it and/or
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    11
#modify it under the terms of the GNU Lesser General Public
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    12
#License as published by the Free Software Foundation; either
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    13
#version 2.1 of the License, or (at your option) any later version.
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    14
#
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    15
#This library is distributed in the hope that it will be useful,
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    16
#but WITHOUT ANY WARRANTY; without even the implied warranty of
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    17
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    18
#Lesser General Public License for more details.
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    19
#
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    20
#You should have received a copy of the GNU Lesser General Public
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    21
#License along with this library; if not, write to the Free Software
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    22
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    23
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    24
from types import *
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    25
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    26
DicoTypes = {"BOOL":0x01, "SINT":0x02, "INT":0x03,"DINT":0x04,"LINT":0x10,
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    27
             "USINT":0x05,"UINT":0x06,"UDINT":0x07,"ULINT":0x1B,"REAL":0x08,
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    28
             "LREAL":0x11,"STRING":0x09,"BYTE":0x02,"WORD":0x03,"DWORD":0x04,
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    29
             "LWORD":0x1B,"WSTRING":0x0B}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    30
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    31
DictLocations = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    32
DictCobID = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    33
DictLocationsNotMapped = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    34
ListCobIDAvailable = []
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    35
SlavesPdoNumber = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    36
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    37
# Constants for PDO types 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    38
RPDO = 1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    39
TPDO = 2
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    40
SlavePDOType = {"I" : TPDO, "Q" : RPDO}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    41
InvertPDOType = {RPDO : TPDO, TPDO : RPDO}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    42
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    43
DefaultTransmitTypeMaster = 0x01
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    44
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    45
GenerateMasterMapping = lambda x:[None] + [(loc_infos["type"], name) for name, loc_infos in x]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    46
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    47
TrashVariableSizes = {1 : 0x01, 8 : 0x05, 16 : 0x06, 32 : 0x07, 64 : 0x1B}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    48
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    49
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    50
def GetSlavePDOIndexes(slave, type, parameters = False):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    51
    indexes = []
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    52
    if type & RPDO:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    53
        indexes.extend([idx for idx in slave.GetIndexes() if 0x1400 <= idx <= 0x15FF])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    54
    if type & TPDO:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    55
        indexes.extend([idx for idx in slave.GetIndexes() if 0x1800 <= idx <= 0x19FF])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    56
    if not parameters:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    57
        return [idx + 0x200 for idx in indexes]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    58
    else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    59
        return indexes
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    60
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    61
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    62
def LE_to_BE(value, size): # Convert Little Endian to Big Endian
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    63
    data = ("%" + str(size * 2) + "." + str(size * 2) + "X") % value
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    64
    list_car = [data[i:i+2] for i in xrange(0, len(data), 2)]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    65
    list_car.reverse()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    66
    return "".join([chr(int(car, 16)) for car in list_car])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    67
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    68
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    69
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    70
def SearchSlavePDOMapping(loc_infos, slave): # Search the TPDO or RPDO mapping where location is defined on the slave
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    71
    typeinfos = slave.GetEntryInfos(loc_infos["type"])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    72
    model = (loc_infos["index"] << 16) + (loc_infos["subindex"] << 8) + typeinfos["size"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    73
    slavePDOidxlist = GetSlavePDOIndexes(slave, loc_infos["pdotype"])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    74
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    75
    for PDOidx in slavePDOidxlist:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    76
        values = slave.GetEntry(PDOidx)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    77
        if values != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    78
            for subindex, mapping in enumerate(values):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    79
                if subindex != 0 and mapping == model:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    80
                    return PDOidx, subindex
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    81
    return None
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    82
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    83
def GenerateMappingDCF(cobid, idx, pdomapping, mapped): # Build concise DCF
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    84
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    85
    # Create entry for RPDO or TPDO parameters and Disable PDO
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    86
    dcfdata = LE_to_BE(idx, 2) + LE_to_BE(0x01, 1) + LE_to_BE(0x04, 4) + LE_to_BE((0x80000000 + cobid), 4)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    87
    # Set Transmit type synchrone
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    88
    dcfdata += LE_to_BE(idx, 2) + LE_to_BE(0x02, 1) + LE_to_BE(0x01, 4) + LE_to_BE(DefaultTransmitTypeSlave, 1)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    89
    # Re-Enable PDO
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    90
    #         ---- INDEX -----   --- SUBINDEX ----   ----- SIZE ------   ------ DATA ------
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    91
    dcfdata += LE_to_BE(idx, 2) + LE_to_BE(0x01, 1) + LE_to_BE(0x04, 4) + LE_to_BE(0x00000000 + cobid, 4)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    92
    nbparams = 3
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    93
    if mapped == False and pdomapping != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    94
    # Map Variables
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    95
        for subindex, (name, loc_infos) in enumerate(pdomapping):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    96
            value = (loc_infos["index"] << 16) + (loc_infos["subindex"] << 8) + loc_infos["size"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    97
            dcfdata += LE_to_BE(idx + 0x200, 2) + LE_to_BE(subindex + 1, 1) + LE_to_BE(0x04, 4) + LE_to_BE(value, 4)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    98
            nbparams += 1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
    99
    return dcfdata, nbparams
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   100
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   101
def GetNewCobID(nodeid, type): # Return a cobid not used
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   102
    global ListCobIDAvailable, SlavesPdoNumber
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   103
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   104
    if len(ListCobIDAvailable) == 0:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   105
        return None
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   106
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   107
    nbSlavePDO = SlavesPdoNumber[nodeid][type]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   108
    if type == RPDO:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   109
        if nbSlavePDO < 4:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   110
            # For the fourth PDO -> cobid = 0x200 + ( numPdo parameters * 0x100) + nodeid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   111
            newcobid = (0x200 + nbSlavePDO * 0x100 + nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   112
            if newcobid in ListCobIDAvailable:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   113
                ListCobIDAvailable.remove(newcobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   114
                return newcobid, 0x1400 + nbSlavePDO
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   115
        return ListCobIDAvailable.pop(0), 0x1400 + nbSlavePDO
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   116
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   117
    elif type == TPDO:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   118
        if nbSlavePDO < 4:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   119
            # For the fourth PDO -> cobid = 0x180 + (numPdo parameters * 0x100) + nodeid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   120
            newcobid = (0x180 + nbSlavePDO * 0x100 + nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   121
            if newcobid in ListCobIDAvailable:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   122
                ListCobIDAvailable.remove(newcobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   123
                return newcobid, 0x1800 + nbSlavePDO
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   124
        return ListCobIDAvailable.pop(0), 0x1800 + nbSlavePDO
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   125
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   126
    for number in xrange(4):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   127
        if type == RPDO:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   128
            # For the fourth PDO -> cobid = 0x200 + ( numPdo * 0x100) + nodeid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   129
            newcobid = (0x200 + number * 0x100 + nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   130
        elif type == TPDO:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   131
            # For the fourth PDO -> cobid = 0x180 + (numPdo * 0x100) + nodeid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   132
            newcobid = (0x180 + number * 0x100 + nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   133
        else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   134
            return None
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   135
        if newcobid in ListCobIDAvailable:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   136
            ListCobIDAvailable.remove(newcobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   137
            return newcobid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   138
    return ListCobIDAvailable.pop(0)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   139
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   140
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   141
def GenerateConciseDCF(locations, busname, nodelist):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   142
    global DictLocations, DictCobID, DictLocationsNotMapped, ListCobIDAvailable, SlavesPdoNumber, DefaultTransmitTypeSlave
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   143
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   144
    DictLocations = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   145
    DictCobID = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   146
    DictLocationsNotMapped = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   147
    DictSDOparams = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   148
    ListCobIDAvailable = range(0x180, 0x580)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   149
    SlavesPdoNumber = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   150
    DictNameVariable = { "" : 1, "X": 2, "B": 3, "W": 4, "D": 5, "L": 6, "increment": 0x100, 1:("__I", 0x2000), 2:("__Q", 0x4000)}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   151
    DefaultTransmitTypeSlave = 0xFF
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   152
    # Master Node initialisation
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   153
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   154
    manager = nodelist.Manager
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   155
    masternode = manager.GetCurrentNodeCopy()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   156
    if not masternode.IsEntry(0x1F22):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   157
        masternode.AddEntry(0x1F22, 1, "")
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   158
    manager.AddSubentriesToCurrent(0x1F22, 127, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   159
    # Adding trash mappable variables for unused mapped datas
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   160
    idxTrashVariables = 0x2000 + masternode.GetNodeID()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   161
    TrashVariableValue = {}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   162
    manager.AddMapVariableToCurrent(idxTrashVariables, "trashvariables", 3, len(TrashVariableSizes), masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   163
    for subidx, (size, typeidx) in enumerate(TrashVariableSizes.items()):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   164
        manager.SetCurrentEntry(idxTrashVariables, subidx + 1, "TRASH%d" % size, "name", None, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   165
        manager.SetCurrentEntry(idxTrashVariables, subidx + 1, typeidx, "type", None, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   166
        TrashVariableValue[size] = (idxTrashVariables << 16) + ((subidx + 1) << 8) + size
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   167
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   168
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   169
    # Extract Master Node current empty mapping index
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   170
    CurrentPDOParamsIdx = {RPDO : 0x1400 + len(GetSlavePDOIndexes(masternode, RPDO)),
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   171
                           TPDO : 0x1800 + len(GetSlavePDOIndexes(masternode, TPDO))}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   172
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   173
    # Get list of all Slave's CobID and Slave's default SDO server parameters
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   174
    for nodeid, nodeinfos in nodelist.SlaveNodes.items():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   175
        node = nodeinfos["Node"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   176
        node.SetNodeID(nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   177
        DictSDOparams[nodeid] = {"RSDO" : node.GetEntry(0x1200,0x01), "TSDO" : node.GetEntry(0x1200,0x02)}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   178
        slaveRpdoIndexes = GetSlavePDOIndexes(node, RPDO, True)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   179
        slaveTpdoIndexes = GetSlavePDOIndexes(node, TPDO, True)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   180
        SlavesPdoNumber[nodeid] = {RPDO : len(slaveRpdoIndexes), TPDO : len(slaveTpdoIndexes)}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   181
        for PdoIdx in slaveRpdoIndexes + slaveTpdoIndexes:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   182
            pdo_cobid = node.GetEntry(PdoIdx, 0x01)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   183
            if pdo_cobid > 0x600 :
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   184
                pdo_cobid -= 0x80000000
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   185
            if pdo_cobid in ListCobIDAvailable:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   186
                ListCobIDAvailable.remove(pdo_cobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   187
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   188
    # Get list of locations check if exists and mappables -> put them in DictLocations
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   189
    for locationtype, name in locations:    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   190
        if name in DictLocations.keys():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   191
            if DictLocations[name]["type"] != DicoTypes[locationtype]:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   192
                raise ValueError, "Conflict type for location \"%s\"" % name 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   193
        else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   194
            loc = [i for i in name.split("_") if len(i) > 0]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   195
            if len(loc) not in (4, 5):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   196
                continue
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   197
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   198
            prefix = loc[0][0]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   199
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   200
            # Extract and check busname
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   201
            if loc[0][1].isdigit():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   202
                sizelocation = ""
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   203
                busnamelocation = int(loc[0][1:])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   204
            else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   205
                sizelocation = loc[0][1]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   206
                busnamelocation = int(loc[0][2:])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   207
            if busnamelocation != busname:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   208
                continue # A ne pas remplacer par un message d'erreur
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   209
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   210
            # Extract and check nodeid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   211
            nodeid = int(loc[1])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   212
            if nodeid not in nodelist.SlaveNodes.keys():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   213
                continue
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   214
            node = nodelist.SlaveNodes[nodeid]["Node"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   215
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   216
            # Extract and check index and subindex
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   217
            index = int(loc[2])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   218
            subindex = int(loc[3])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   219
            if not node.IsEntry(index, subindex):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   220
                continue
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   221
            subentry_infos = node.GetSubentryInfos(index, subindex)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   222
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   223
            if subentry_infos and subentry_infos["pdo"]:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   224
                if sizelocation == "X" and len(loc) > 4:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   225
                    numbit = loc[4]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   226
                elif sizelocation != "X" and len(loc) > 4:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   227
                    continue
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   228
                else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   229
                    numbit = None
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   230
                
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   231
                locationtype = DicoTypes[locationtype]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   232
                entryinfos = node.GetSubentryInfos(index, subindex)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   233
                if entryinfos["type"] != locationtype:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   234
                    raise ValueError, "Invalid type for location \"%s\"" % name
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   235
                
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   236
                typeinfos = node.GetEntryInfos(locationtype)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   237
                DictLocations[name] = {"type":locationtype, "pdotype":SlavePDOType[prefix],
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   238
                                       "nodeid": nodeid, "index": index,"subindex": subindex, 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   239
                                       "bit": numbit, "size": typeinfos["size"], "busname": busname, "sizelocation": sizelocation}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   240
                  
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   241
    # Create DictCobID with variables already mapped and add them in DictValidLocations
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   242
    for name, locationinfos in DictLocations.items():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   243
        node = nodelist.SlaveNodes[locationinfos["nodeid"]]["Node"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   244
        result = SearchSlavePDOMapping(locationinfos, node)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   245
        if result != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   246
            index, subindex = result
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   247
            cobid = nodelist.GetSlaveNodeEntry(locationinfos["nodeid"], index - 0x200, 1)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   248
            if cobid not in DictCobID.keys():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   249
                mapping = [None]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   250
                values = node.GetEntry(index)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   251
                for value in values[1:]:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   252
                    mapping.append(value % 0x100)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   253
                DictCobID[cobid] = {"type" : InvertPDOType[locationinfos["pdotype"]], "mapping" : mapping}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   254
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   255
            DictCobID[cobid]["mapping"][subindex] = (locationinfos["type"], name)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   256
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   257
        else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   258
            if locationinfos["nodeid"] not in DictLocationsNotMapped.keys():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   259
                DictLocationsNotMapped[locationinfos["nodeid"]] = {TPDO : [], RPDO : []}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   260
            DictLocationsNotMapped[locationinfos["nodeid"]][locationinfos["pdotype"]].append((name, locationinfos))
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   261
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   262
    # Check Master Pdo parameters for cobid already used and remove it in ListCobIDAvailable
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   263
    ListPdoParams = [idx for idx in masternode.GetIndexes() if 0x1400 <= idx <= 0x15FF or  0x1800 <= idx <= 0x19FF]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   264
    for idx in ListPdoParams:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   265
        cobid = masternode.GetEntry(idx, 0x01)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   266
        if cobid not in DictCobID.keys():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   267
            ListCobIDAvailable.pop(cobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   268
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   269
    #-------------------------------------------------------------------------------
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   270
    #                         Build concise DCF for the others locations
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   271
    #-------------------------------------------------------------------------------
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   272
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   273
    for nodeid, locations in DictLocationsNotMapped.items():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   274
        # Get current concise DCF
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   275
        node = nodelist.SlaveNodes[nodeid]["Node"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   276
        nodeDCF = masternode.GetEntry(0x1F22, nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   277
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   278
        if nodeDCF != None and nodeDCF != '':
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   279
            tmpnbparams = [i for i in nodeDCF[:4]]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   280
            tmpnbparams.reverse()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   281
            nbparams = int(''.join(["%2.2x"%ord(i) for i in tmpnbparams]), 16)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   282
            dataparams = nodeDCF[4:]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   283
        else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   284
            nbparams = 0
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   285
            dataparams = ""
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   286
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   287
        for pdotype in (TPDO, RPDO):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   288
            pdosize = 0
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   289
            pdomapping = []
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   290
            for name, loc_infos in locations[pdotype]:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   291
                pdosize += loc_infos["size"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   292
                # If pdo's size > 64 bits
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   293
                if pdosize > 64:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   294
                    result = GetNewCobID(nodeid, pdotype)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   295
                    if result:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   296
                        SlavesPdoNumber[nodeid][pdotype] += 1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   297
                        new_cobid, new_idx = result
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   298
                        data, nbaddedparams = GenerateMappingDCF(new_cobid, new_idx, pdomapping, False)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   299
                        dataparams += data
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   300
                        nbparams += nbaddedparams
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   301
                        DictCobID[new_cobid] = {"type" : InvertPDOType[pdotype], "mapping" : GenerateMasterMapping(pdomapping)}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   302
                    pdosize = loc_infos["size"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   303
                    pdomapping = [(name, loc_infos)]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   304
                else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   305
                    pdomapping.append((name, loc_infos))
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   306
            if len(pdomapping) > 0:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   307
                result = GetNewCobID(nodeid, pdotype)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   308
                if result:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   309
                    SlavesPdoNumber[nodeid][pdotype] += 1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   310
                    new_cobid, new_idx = result
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   311
                    data, nbaddedparams = GenerateMappingDCF(new_cobid, new_idx, pdomapping, False)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   312
                    dataparams += data
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   313
                    nbparams += nbaddedparams
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   314
                    DictCobID[new_cobid] = {"type" : InvertPDOType[pdotype], "mapping" : GenerateMasterMapping(pdomapping)}
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   315
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   316
        dcf = LE_to_BE(nbparams, 0x04) + dataparams
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   317
        masternode.SetEntry(0x1F22, nodeid, dcf)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   318
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   319
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   320
    #-------------------------------------------------------------------------------
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   321
    #                         Master Node Configuration
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   322
    #-------------------------------------------------------------------------------
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   323
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   324
    # Configure Master's SDO parameters entries
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   325
    for nodeid, SDOparams in DictSDOparams.items():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   326
        SdoClient_index = [0x1280 + nodeid]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   327
        manager.ManageEntriesOfCurrent(SdoClient_index,[], masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   328
        if SDOparams["RSDO"] != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   329
            RSDO_cobid = SDOparams["RSDO"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   330
        else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   331
            RSDO_cobid = 0x600 + nodeid 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   332
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   333
        if SDOparams["TSDO"] != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   334
            TSDO_cobid = SDOparams["TSDO"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   335
        else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   336
            TSDO_cobid = 0x580 + nodeid
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   337
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   338
        masternode.SetEntry(SdoClient_index[0], 0x01, RSDO_cobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   339
        masternode.SetEntry(SdoClient_index[0], 0x02, TSDO_cobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   340
        masternode.SetEntry(SdoClient_index[0], 0x03, nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   341
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   342
    # Configure Master's PDO parameters entries and set cobid, transmit type
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   343
    for cobid, pdo_infos in DictCobID.items():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   344
        current_idx = CurrentPDOParamsIdx[pdo_infos["type"]]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   345
        addinglist = [current_idx, current_idx + 0x200]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   346
        manager.ManageEntriesOfCurrent(addinglist, [], masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   347
        masternode.SetEntry(current_idx, 0x01, cobid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   348
        masternode.SetEntry(current_idx, 0x02, DefaultTransmitTypeMaster)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   349
        if len(pdo_infos["mapping"]) > 2:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   350
            manager.AddSubentriesToCurrent(current_idx + 0x200, len(pdo_infos["mapping"]) - 2, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   351
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   352
        # Create Master's PDO mapping
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   353
        for subindex, variable in enumerate(pdo_infos["mapping"]):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   354
            if subindex == 0:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   355
                continue
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   356
            new_index = False
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   357
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   358
            if type(variable) != IntType:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   359
                
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   360
                typeidx, varname = variable
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   361
                indexname = DictNameVariable[DictLocations[variable[1]]["pdotype"]][0] + DictLocations[variable[1]]["sizelocation"] + str(DictLocations[variable[1]]["busname"]) + "_" + str(DictLocations[variable[1]]["nodeid"])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   362
                mapvariableidx = DictNameVariable[DictLocations[variable[1]]["pdotype"]][1] +  DictNameVariable[DictLocations[variable[1]]["sizelocation"]] * DictNameVariable["increment"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   363
                
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   364
                if not masternode.IsEntry(mapvariableidx):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   365
                    manager.AddMapVariableToCurrent(mapvariableidx, indexname, 3, 1, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   366
                    new_index = True
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   367
                    nbsubentries = masternode.GetEntry(mapvariableidx, 0x00)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   368
                else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   369
                    nbsubentries = masternode.GetEntry(mapvariableidx, 0x00)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   370
                    mapvariableidxbase = mapvariableidx 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   371
                    while mapvariableidx < (mapvariableidxbase + 0x1FF) and nbsubentries == 0xFF:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   372
                        mapvariableidx += 0x800
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   373
                        if not manager.IsCurrentEntry(mapvariableidx):
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   374
                            manager.AddMapVariableToCurrent(mapvariableidx, indexname, 3, 1, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   375
                            new_index = True
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   376
                        nbsubentries = masternode.GetEntry(mapvariableidx, 0x00)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   377
                
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   378
                if mapvariableidx < 0x6000:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   379
                    if DictLocations[variable[1]]["bit"] != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   380
                        subindexname = "_" + str(DictLocations[variable[1]]["index"]) + "_" + str(DictLocations[variable[1]]["subindex"]) + "_" + str(DictLocations[variable[1]]["bit"])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   381
                    else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   382
                        subindexname = "_" + str(DictLocations[variable[1]]["index"]) + "_" + str(DictLocations[variable[1]]["subindex"])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   383
                    if not new_index:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   384
                        manager.AddSubentriesToCurrent(mapvariableidx, 1, masternode)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   385
                        nbsubentries += 1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   386
                    masternode.SetMappingEntry(mapvariableidx, nbsubentries, values = {"name" : subindexname})
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   387
                    masternode.SetMappingEntry(mapvariableidx, nbsubentries, values = {"type" : typeidx})
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   388
                    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   389
                    # Map Variable
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   390
                    typeinfos = manager.GetEntryInfos(typeidx)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   391
                    if typeinfos != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   392
                        value = (mapvariableidx << 16) + ((nbsubentries) << 8) + typeinfos["size"]
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   393
                        masternode.SetEntry(current_idx + 0x200, subindex, value)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   394
            else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   395
                masternode.SetEntry(current_idx + 0x200, subindex, TrashVariableValue[variable])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   396
        
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   397
        CurrentPDOParamsIdx[pdo_infos["type"]] += 1
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   398
    #masternode.Print()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   399
    return masternode
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   400
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   401
if __name__ == "__main__":
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   402
    from nodemanager import *
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   403
    from nodelist import *
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   404
    import sys
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   405
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   406
    manager = NodeManager(sys.path[0])
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   407
    nodelist = NodeList(manager)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   408
    result = nodelist.LoadProject("/home/deobox/Desktop/TestMapping")
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   409
   
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   410
##    if result != None:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   411
##        print result
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   412
##    else:
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   413
##        print "MasterNode :"
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   414
##        manager.CurrentNode.Print()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   415
##        for nodeid, node in nodelist.SlaveNodes.items():
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   416
##            print "SlaveNode name=%s id=0x%2.2X :"%(node["Name"], nodeid)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   417
##            node["Node"].Print()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   418
            
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   419
    #filepath = "/home/deobox/beremiz/test_nodelist/listlocations.txt"
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   420
    filepath = "/home/deobox/Desktop/TestMapping/listlocations.txt"
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   421
    
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   422
    file = open(filepath,'r')
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   423
    locations = [location.split(' ') for location in [line.strip() for line in file.readlines() if len(line) > 0]] 
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   424
    file.close()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   425
    GenerateConciseDCF(locations, 32, nodelist)
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   426
    print "MasterNode :"
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   427
    manager.CurrentNode.Print()
6e9f24fd1b98 Adding Build Method for PLC program generating
lbessard
parents:
diff changeset
   428
    #masternode.Print()