--- a/etherlab/CommonEtherCATFunction.py Fri Sep 28 17:15:53 2018 +0300
+++ b/etherlab/CommonEtherCATFunction.py Fri Sep 28 17:20:11 2018 +0300
@@ -25,7 +25,7 @@
pass
try:
return int(value.replace("#", "0"), 16)
-
+
except Exception:
raise ValueError, "Invalid value for HexDecValue \"%s\"" % value
@@ -52,7 +52,7 @@
MASTER_STATE = """
import commands
result = commands.getoutput("ethercat master")
-returnVal =result
+returnVal =result
"""
# --------------------- for slave ----------------------------
@@ -60,84 +60,84 @@
SLAVE_STATE = """
import commands
result = commands.getoutput("ethercat state -p %d %s")
-returnVal = result
+returnVal = result
"""
# ethercat slave
GET_SLAVE = """
import commands
result = commands.getoutput("ethercat slaves")
-returnVal =result
+returnVal =result
"""
# ethercat xml -p (slave position)
SLAVE_XML = """
import commands
result = commands.getoutput("ethercat xml -p %d")
-returnVal = result
+returnVal = result
"""
# ethercat sdos -p (slave position)
SLAVE_SDO = """
import commands
result = commands.getoutput("ethercat sdos -p %d")
-returnVal =result
+returnVal =result
"""
# ethercat upload -p (slave position) (main index) (sub index)
GET_SLOW_SDO = """
import commands
result = commands.getoutput("ethercat upload -p %d %s %s")
-returnVal =result
+returnVal =result
"""
# ethercat download -p (slave position) (main index) (sub index) (value)
SDO_DOWNLOAD = """
import commands
result = commands.getoutput("ethercat download --type %s -p %d %s %s %s")
-returnVal =result
+returnVal =result
"""
# ethercat sii_read -p (slave position)
SII_READ = """
import commands
result = commands.getoutput("ethercat sii_read -p %d")
-returnVal =result
+returnVal =result
"""
# ethercat reg_read -p (slave position) (address) (size)
REG_READ = """
import commands
result = commands.getoutput("ethercat reg_read -p %d %s %s")
-returnVal =result
+returnVal =result
"""
# ethercat sii_write -p (slave position) - (contents)
-SII_WRITE = """
-import subprocess
+SII_WRITE = """
+import subprocess
process = subprocess.Popen(
["ethercat", "-f", "sii_write", "-p", "%d", "-"],
stdin=subprocess.PIPE)
process.communicate(sii_data)
-returnVal = process.returncode
+returnVal = process.returncode
"""
# ethercat reg_write -p (slave position) -t (uinit16) (address) (data)
-REG_WRITE = """
+REG_WRITE = """
import commands
result = commands.getoutput("ethercat reg_write -p %d -t uint16 %s %s")
-returnVal =result
-"""
+returnVal =result
+"""
# ethercat rescan -p (slave position)
-RESCAN = """
+RESCAN = """
import commands
result = commands.getoutput("ethercat rescan -p %d")
-returnVal =result
+returnVal =result
"""
#--------------------------------------------------
-# Common Method For EtherCAT Management
+# Common Method For EtherCAT Management
#--------------------------------------------------
class _CommonSlave:
@@ -147,11 +147,11 @@
# category of SDO data
DatatypeDescription, CommunicationObject, ManufacturerSpecific, \
ProfileSpecific, Reserved, AllSDOData = range(6)
-
+
# store the execution result of "ethercat sdos" command into SaveSDOData.
SaveSDOData = []
-
- # Flags for checking "write" permission of OD entries
+
+ # Flags for checking "write" permission of OD entries
CheckPREOP = False
CheckSAFEOP = False
CheckOP = False
@@ -161,7 +161,7 @@
TxPDOCategory = []
RxPDOInfo = []
RxPDOCategory = []
-
+
# Save EEPROM Data
SiiData = ""
@@ -171,26 +171,26 @@
"FMMUNumber": "",
"SMNumber": "",
"PDIType": ""}
-
+
def __init__(self, controler):
"""
Constructor
@param controler: _EthercatSlaveCTN class in EthercatSlave.py
"""
self.Controler = controler
-
+
self.ClearSDODataSet()
-
+
#-------------------------------------------------------------------------------
# Used Master State
#-------------------------------------------------------------------------------
def GetMasterState(self):
"""
Execute "ethercat master" command and parse the execution result
- @return MasterState
- """
-
- # exectute "ethercat master" command
+ @return MasterState
+ """
+
+ # exectute "ethercat master" command
error, return_val = self.Controler.RemoteExec(MASTER_STATE, return_val = None)
master_state = {}
# parse the reslut
@@ -204,9 +204,9 @@
if '(attached)' in value:
value.remove('(attached)')
master_state[key] = value
-
- return master_state
-
+
+ return master_state
+
#-------------------------------------------------------------------------------
# Used Slave State
#-------------------------------------------------------------------------------
@@ -214,19 +214,19 @@
"""
Set slave state to the specified one using "ethercat states -p %d %s" command.
Command example : "ethercat states -p 0 PREOP" (target slave position and target state are given.)
- @param command : target slave state
+ @param command : target slave state
"""
error, return_val = self.Controler.RemoteExec(SLAVE_STATE%(self.Controler.GetSlavePos(), command), return_val = None)
-
- def GetSlaveStateFromSlave(self):
- """
- Get slave information using "ethercat slaves" command and store the information into internal data structure
- (self.SlaveState) for "Slave State"
+
+ def GetSlaveStateFromSlave(self):
+ """
+ Get slave information using "ethercat slaves" command and store the information into internal data structure
+ (self.SlaveState) for "Slave State"
return_val example : 0 0:0 PREOP + EL9800 (V4.30) (PIC24, SPI, ET1100)
- """
+ """
error, return_val = self.Controler.RemoteExec(GET_SLAVE, return_val = None)
self.SlaveState = return_val
- return return_val
+ return return_val
#-------------------------------------------------------------------------------
# Used SDO Management
@@ -236,10 +236,10 @@
Get SDO objects information of current slave using "ethercat sdos -p %d" command.
Command example : "ethercat sdos -p 0"
@return return_val : execution results of "ethercat sdos" command (need to be parsed later)
- """
+ """
error, return_val = self.Controler.RemoteExec(SLAVE_SDO%(self.Controler.GetSlavePos()), return_val = None)
- return return_val
-
+ return return_val
+
def SDODownload(self, data_type, idx, sub_idx, value):
"""
Set an SDO object value to user-specified value using "ethercat download" command.
@@ -248,64 +248,64 @@
@param idx : index of the SDO entry
@param sub_idx : subindex of the SDO entry
@param value : value of SDO entry
- """
+ """
error, return_val = self.Controler.RemoteExec(SDO_DOWNLOAD%(data_type, self.Controler.GetSlavePos(), idx, sub_idx, value), return_val = None)
-
+
def BackupSDODataSet(self):
"""
- Back-up current SDO entry information to restore the SDO data
+ Back-up current SDO entry information to restore the SDO data
in case that the user cancels SDO update operation.
- """
+ """
self.BackupDatatypeDescription = self.SaveDatatypeDescription
self.BackupCommunicationObject = self.SaveCommunicationObject
self.BackupManufacturerSpecific = self.SaveManufacturerSpecific
self.BackupProfileSpecific = self.SaveProfileSpecific
self.BackupReserved = self.SaveReserved
self.BackupAllSDOData = self.SaveAllSDOData
-
+
def ClearSDODataSet(self):
"""
Clear the specified SDO entry information.
- """
+ """
for count in range(6):
self.SaveSDOData.append([])
-
+
#-------------------------------------------------------------------------------
# Used PDO Monitoring
#-------------------------------------------------------------------------------
def RequestPDOInfo(self):
"""
Load slave information from RootClass (XML data) and parse the information (calling SlavePDOData() method).
- """
+ """
# Load slave information from ESI XML file (def EthercatMaster.py)
slave = self.Controler.CTNParent.GetSlave(self.Controler.GetSlavePos())
-
+
type_infos = slave.getType()
device, alignment = self.Controler.CTNParent.GetModuleInfos(type_infos)
# Initialize PDO data set
self.ClearDataSet()
-
- # if 'device' object is valid, call SavePDOData() to parse PDO data
+
+ # if 'device' object is valid, call SavePDOData() to parse PDO data
if device is not None :
self.SavePDOData(device)
-
+
def SavePDOData(self, device):
"""
Parse PDO data and store the results in TXPDOCategory and RXPDOCategory
Tx(Rx)PDOCategory : index, name, entry number
Tx(Rx)Info : entry index, sub index, name, length, type
@param device : Slave information extracted from ESI XML file
- """
+ """
# Parsing TXPDO entries
for pdo, pdo_info in ([(pdo, "Inputs") for pdo in device.getTxPdo()]):
# Save pdo_index, entry, and name of each entry
pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
entries = pdo.getEntry()
pdo_name = ExtractName(pdo.getName())
-
+
# Initialize entry number count
count = 0
-
+
# Parse entries
for entry in entries:
# Save index and subindex
@@ -322,8 +322,8 @@
}
self.TxPDOInfo.append(entry_infos)
count += 1
-
- categorys = {"pdo_index" : pdo_index, "name" : pdo_name, "number_of_entry" : count}
+
+ categorys = {"pdo_index" : pdo_index, "name" : pdo_name, "number_of_entry" : count}
self.TxPDOCategory.append(categorys)
# Parsing RxPDO entries
@@ -332,11 +332,11 @@
pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
entries = pdo.getEntry()
pdo_name = ExtractName(pdo.getName())
-
+
# Initialize entry number count
- count = 0
-
- # Parse entries
+ count = 0
+
+ # Parse entries
for entry in entries:
# Save index and subindex
index = ExtractHexDecValue(entry.getIndex().getcontent())
@@ -352,51 +352,51 @@
}
self.RxPDOInfo.append(entry_infos)
count += 1
-
- categorys = {"pdo_index" : pdo_index, "name" : pdo_name, "number_of_entry" : count}
- self.RxPDOCategory.append(categorys)
+
+ categorys = {"pdo_index" : pdo_index, "name" : pdo_name, "number_of_entry" : count}
+ self.RxPDOCategory.append(categorys)
def GetTxPDOCategory(self):
"""
Get TxPDOCategory data structure (Meta informaton of TxPDO).
TxPDOCategorys : index, name, number of entries
@return TxPDOCategorys
- """
+ """
return self.TxPDOCategory
-
+
def GetRxPDOCategory(self):
"""
Get RxPDOCategory data structure (Meta information of RxPDO).
RxPDOCategorys : index, name, number of entries
@return RxPDOCategorys
- """
+ """
return self.RxPDOCategory
-
+
def GetTxPDOInfo(self):
"""
- Get TxPDOInfo data structure (Detailed information on TxPDO entries).
+ Get TxPDOInfo data structure (Detailed information on TxPDO entries).
TxPDOInfos : entry index, sub index, name, length, type
@return TxPDOInfos
- """
+ """
return self.TxPDOInfo
-
+
def GetRxPDOInfo(self):
"""
- Get RxPDOInfo data structure (Detailed information on RxPDO entries).
+ Get RxPDOInfo data structure (Detailed information on RxPDO entries).
RxPDOInfos : entry index, sub index, name, length, type
@return RxPDOInfos
- """
+ """
return self.RxPDOInfo
-
+
def ClearDataSet(self):
"""
Initialize PDO management data structure.
- """
+ """
self.TxPDOInfos = []
self.TxPDOCategorys = []
self.RxPDOInfos = []
self.RxPDOCategorys = []
-
+
#-------------------------------------------------------------------------------
# Used EEPROM Management
#-------------------------------------------------------------------------------
@@ -431,13 +431,13 @@
"BIT5": "34",
"BIT6": "35",
"BIT7": "36",
- "BIT8": "37"}
-
+ "BIT8": "37"}
+
def GetSmartViewInfos(self):
"""
Parse XML data for "Smart View" of EEPROM contents.
@return smartview_infos : EEPROM contents dictionary
- """
+ """
smartview_infos = {"eeprom_size": 128,
"pdi_type": 0,
@@ -455,7 +455,7 @@
"mailbox_standardconf_outlength": '0',
"mailbox_standardconf_instart": '0',
"mailbox_standardconf_inlength": '0'}
-
+
slave = self.Controler.CTNParent.GetSlave(self.Controler.GetSlavePos())
type_infos = slave.getType()
device, alignment = self.Controler.CTNParent.GetModuleInfos(type_infos)
@@ -466,7 +466,7 @@
# get EEPROM size; <Device>-<Eeprom>-<ByteSize>
if eeprom_element["name"] == "ByteSize":
smartview_infos["eeprom_size"] = eeprom_element
-
+
elif eeprom_element["name"] == "ConfigData":
configData_data = self.DecimalToHex(eeprom_element)
# get PDI type; <Device>-<Eeprom>-<ConfigData> address 0x00
@@ -478,12 +478,12 @@
elif eeprom_element["name"] == "BootStrap":
bootstrap_data = "{:0>16x}".format(eeprom_element)
# get bootstrap configuration; <Device>-<Eeprom>-<BootStrap>
- for cfg, iter in [("mailbox_bootstrapconf_outstart", 0),
+ for cfg, iter in [("mailbox_bootstrapconf_outstart", 0),
("mailbox_bootstrapconf_outlength", 1),
("mailbox_bootstrapconf_instart", 2),
("mailbox_bootstrapconf_inlength", 3)]:
smartview_infos[cfg] = str(int(bootstrap_data[4*iter+2:4*(iter+1)]+bootstrap_data[4*iter:4*iter+2], 16))
-
+
# get protocol (profile) types supported by mailbox; <Device>-<Mailbox>
mb = device.getMailbox()
if mb is not None:
@@ -491,7 +491,7 @@
if getattr(mb,"get%s"%mailbox_protocol)() is not None:
smartview_infos["supported_mailbox"] += "%s, "%mailbox_protocol
smartview_infos["supported_mailbox"] = smartview_infos["supported_mailbox"].strip(", ")
-
+
# get standard configuration of mailbox; <Device>-<Sm>
for sm_element in device.getSm():
if sm_element.getcontent() == "MBoxOut":
@@ -510,42 +510,42 @@
for available_device in vendor["groups"][vendor["groups"].keys()[0]]["devices"]:
if available_device[0] == type_infos["device_type"]:
smartview_infos["vendor_id"] = "0x" + "{:0>8x}".format(vendor_id)
-
- # product code;
+
+ # product code;
if device.getType().getProductCode() is not None:
product_code = device.getType().getProductCode()
smartview_infos["product_code"] = "0x"+"{:0>8x}".format(ExtractHexDecValue(product_code))
-
- # revision number;
+
+ # revision number;
if device.getType().getRevisionNo() is not None:
revision_no = device.getType().getRevisionNo()
smartview_infos["revision_no"] = "0x"+"{:0>8x}".format(ExtractHexDecValue(revision_no))
-
+
# serial number;
if device.getType().getSerialNo() is not None:
serial_no = device.getType().getSerialNo()
smartview_infos["serial_no"] = "0x"+"{:0>8x}".format(ExtractHexDecValue(serial_no))
-
+
return smartview_infos
-
+
else:
return None
-
+
def DecimalToHex(self, decnum):
"""
- Convert decimal value into hexadecimal representation.
+ Convert decimal value into hexadecimal representation.
@param decnum : decimal value
@return hex_data : hexadecimal representation of input value in decimal
- """
+ """
value = "%x" % decnum
value_len = len(value)
if (value_len % 2) == 0:
hex_len = value_len
else:
hex_len = (value_len / 2) * 2 + 2
-
+
hex_data = ("{:0>"+str(hex_len)+"x}").format(decnum)
-
+
return hex_data
def SiiRead(self):
@@ -553,7 +553,7 @@
Get slave EEPROM contents maintained by master device using "ethercat sii_read -p %d" command.
Command example : "ethercat sii_read -p 0"
@return return_val : result of "ethercat sii_read" (binary data)
- """
+ """
error, return_val = self.Controler.RemoteExec(SII_READ%(self.Controler.GetSlavePos()), return_val = None)
self.SiiData = return_val
return return_val
@@ -564,15 +564,15 @@
Command example : "ethercat sii_write -p 0 - (binary contents)"
@param binary : EEPROM contents in binary data format
@return return_val : result of "ethercat sii_write" (If it succeeds, the return value is NULL.)
- """
+ """
error, return_val = self.Controler.RemoteExec(SII_WRITE%(self.Controler.GetSlavePos()), return_val = None, sii_data = binary)
- return return_val
+ return return_val
def LoadData(self):
"""
Loading data from EEPROM use Sii_Read Method
@return self.BinaryCode : slave EEPROM data in binary format (zero-padded)
- """
+ """
return_val = self.Controler.CommonMethod.SiiRead()
self.BinaryCode = return_val
self.Controler.SiiData = self.BinaryCode
@@ -580,7 +580,7 @@
# append zero-filled padding data up to EEPROM size
for index in range(self.SmartViewInfosFromXML["eeprom_size"] - len(self.BinaryCode)):
self.BinaryCode = self.BinaryCode +'ff'.decode('hex')
-
+
return self.BinaryCode
def HexRead(self, binary):
@@ -589,42 +589,42 @@
@param binary : binary digits
@return hexCode : hexadecimal digits
@return hexview_table_row, hexview_table_col : Grid size for "Hex View" UI
- """
+ """
row_code = []
row_text = ""
row = 0
hex_code = []
hexview_table_col = 17
-
+
for index in range(0, len(binary)) :
if len(binary[index]) != 1:
break
else:
- digithexstr = hex(ord(binary[index]))
+ digithexstr = hex(ord(binary[index]))
tempvar2 = digithexstr[2:4]
if len(tempvar2) == 1:
tempvar2 = "0" + tempvar2
- row_code.append(tempvar2)
-
+ row_code.append(tempvar2)
+
if int(digithexstr, 16)>=32 and int(digithexstr, 16)<=126:
row_text = row_text + chr(int(digithexstr, 16))
else:
row_text = row_text + "."
-
- if index != 0 :
+
+ if index != 0 :
if len(row_code) == (hexview_table_col - 1):
row_code.append(row_text)
hex_code.append(row_code)
row_text = ""
row_code = []
- row = row + 1
-
+ row = row + 1
+
hexview_table_row = row
-
+
return hex_code, hexview_table_row, hexview_table_col
-
+
def GenerateEEPROMList(self, data, direction, length):
"""
Generate EEPROM data list by reconstructing 'data' string.
@@ -634,7 +634,7 @@
@param direction : endianness
@param length : data length
@return eeprom_list : reconstructed list data structure
- """
+ """
eeprom_list = []
if direction is 0 or 1:
@@ -646,7 +646,7 @@
data = data[(1-direction)*2:length-direction*2]
length -= 2
return eeprom_list
-
+
def XmlToEeprom(self):
"""
Extract slave EEPROM contents using slave ESI XML file.
@@ -657,8 +657,8 @@
- SyncM category : ExtractEEPROMSyncMCategory()
- Tx/RxPDO category : ExtractEEPROMPDOCategory()
- DC category : ExtractEEPROMDCCategory()
- @return eeprom_binary
- """
+ @return eeprom_binary
+ """
eeprom = []
data = ""
eeprom_size = 0
@@ -668,14 +668,14 @@
slave = self.Controler.CTNParent.GetSlave(self.Controler.GetSlavePos())
type_infos = slave.getType()
device, alignment = self.Controler.CTNParent.GetModuleInfos(type_infos)
-
+
if device is not None:
# get ConfigData for EEPROM offset 0x0000-0x000d; <Device>-<Eeprom>-<ConfigData>
for eeprom_element in device.getEeprom().getcontent():
if eeprom_element["name"] == "ConfigData":
data = self.DecimalToHex(eeprom_element)
eeprom += self.GenerateEEPROMList(data, 0, 28)
-
+
# calculate CRC for EEPROM offset 0x000e-0x000f
crc = 0x48
for segment in eeprom:
@@ -683,15 +683,15 @@
bit = crc & 0x80
crc = (crc << 1) | ((int(segment, 16) >> (7 - i)) & 0x01)
if bit:
- crc ^= 0x07
+ crc ^= 0x07
for k in range(8):
bit = crc & 0x80
crc <<= 1
if bit:
- crc ^= 0x07
+ crc ^= 0x07
eeprom.append(hex(crc)[len(hex(crc))-3:len(hex(crc))-1])
eeprom.append("00")
-
+
# get VendorID for EEPROM offset 0x0010-0x0013;
data = ""
for vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
@@ -699,35 +699,35 @@
if available_device[0] == type_infos["device_type"]:
data = "{:0>8x}".format(vendor_id)
eeprom += self.GenerateEEPROMList(data, 1, 8)
-
+
# get Product Code for EEPROM offset 0x0014-0x0017;
data = ""
if device.getType().getProductCode() is not None:
data = "{:0>8x}".format(ExtractHexDecValue(device.getType().getProductCode()))
eeprom += self.GenerateEEPROMList(data, 1, 8)
-
+
# get Revision Number for EEPROM offset 0x0018-0x001b;
data = ""
if device.getType().getRevisionNo() is not None:
data = "{:0>8x}".format(ExtractHexDecValue(device.getType().getRevisionNo()))
- eeprom += self.GenerateEEPROMList(data, 1, 8)
-
+ eeprom += self.GenerateEEPROMList(data, 1, 8)
+
# get Serial Number for EEPROM 0x001c-0x001f;
data = ""
if device.getType().getSerialNo() is not None:
data = "{:0>8x}".format(ExtractHexDecValue(device.getType().getSerialNo()))
eeprom += self.GenerateEEPROMList(data, 1, 8)
-
+
# get Execution Delay for EEPROM 0x0020-0x0021; not analyzed yet
eeprom.append("00")
eeprom.append("00")
-
+
# get Port0/1 Delay for EEPROM offset 0x0022-0x0025; not analyzed yet
eeprom.append("00")
eeprom.append("00")
eeprom.append("00")
eeprom.append("00")
-
+
# reserved for EEPROM offset 0x0026-0x0027;
eeprom.append("00")
eeprom.append("00")
@@ -738,7 +738,7 @@
if eeprom_element["name"] == "BootStrap":
data = "{:0>16x}".format(eeprom_element)
eeprom += self.GenerateEEPROMList(data, 0, 16)
-
+
# get Standard Mailbox for EEPROM offset 0x0030-0x0037; <Device>-<sm>
data = ""
standard_send_mailbox_offset = None
@@ -752,7 +752,7 @@
elif sm_element.getcontent() == "MBoxIn":
standard_send_mailbox_offset = "{:0>4x}".format(ExtractHexDecValue(sm_element.getStartAddress()))
standard_send_mailbox_size = "{:0>4x}".format(ExtractHexDecValue(sm_element.getDefaultSize()))
-
+
if standard_receive_mailbox_offset is None:
eeprom.append("00")
eeprom.append("00")
@@ -777,7 +777,7 @@
else:
eeprom.append(standard_send_mailbox_size[2:4])
eeprom.append(standard_send_mailbox_size[0:2])
-
+
# get supported mailbox protocols for EEPROM offset 0x0038-0x0039;
data = 0
mb = device.getMailbox()
@@ -788,11 +788,11 @@
data = "{:0>4x}".format(data)
eeprom.append(data[2:4])
eeprom.append(data[0:2])
-
+
# resereved for EEPROM offset 0x003a-0x007b;
for i in range(0x007b-0x003a+0x0001):
eeprom.append("00")
-
+
# get EEPROM size for EEPROM offset 0x007c-0x007d;
data = ""
for eeprom_element in device.getEeprom().getcontent():
@@ -806,76 +806,76 @@
else:
eeprom.append(data[2:4])
eeprom.append(data[0:2])
-
- # Version for EEPROM 0x007e-0x007f;
+
+ # Version for EEPROM 0x007e-0x007f;
# According to "EtherCAT Slave Device Description(V0.3.0)"
eeprom.append("01")
eeprom.append("00")
-
+
# append String Category data
for data in self.ExtractEEPROMStringCategory(device):
eeprom.append(data)
-
+
# append General Category data
for data in self.ExtractEEPROMGeneralCategory(device):
eeprom.append(data)
-
+
# append FMMU Category data
for data in self.ExtractEEPROMFMMUCategory(device):
eeprom.append(data)
-
+
# append SyncM Category data
for data in self.ExtractEEPROMSyncMCategory(device):
eeprom.append(data)
-
+
# append TxPDO Category data
for data in self.ExtractEEPROMPDOCategory(device, "TxPdo"):
eeprom.append(data)
-
+
# append RxPDO Category data
for data in self.ExtractEEPROMPDOCategory(device, "RxPdo"):
eeprom.append(data)
-
+
# append DC Category data
for data in self.ExtractEEPROMDCCategory(device):
eeprom.append(data)
-
+
# append padding
padding = eeprom_size-len(eeprom)
for i in range(padding):
eeprom.append("ff")
-
+
# convert binary code
for index in range(eeprom_size):
eeprom_binary = eeprom_binary + eeprom[index].decode('hex')
-
+
return eeprom_binary
-
+
def ExtractEEPROMStringCategory(self, device):
"""
Extract "Strings" category data from slave ESI XML and generate EEPROM image data.
@param device : 'device' object in the slave ESI XML
@return eeprom : "Strings" category EEPROM image data
- """
+ """
eeprom = []
self.Strings = []
- data = ""
+ data = ""
count = 0 # string counter
padflag = False # padding flag if category length is odd
-
+
# index information for General Category in EEPROM
self.GroupIdx = 0
self.ImgIdx = 0
self.OrderIdx = 0
self.NameIdx = 0
-
- # flag for preventing duplicated vendor specific data
+
+ # flag for preventing duplicated vendor specific data
typeflag = False
grouptypeflag = False
groupnameflag = False
devnameflag = False
imageflag = False
-
+
# vendor specific data
# element1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Type>
# vendor_specific_data : vendor specific data (binary type)
@@ -885,7 +885,7 @@
for element in device.getType().getcontent():
data += element
if data is not "" and type(data) == unicode:
- for vendor_spec_string in vendor_spec_strings:
+ for vendor_spec_string in vendor_spec_strings:
if data == vendor_spec_string:
self.OrderIdx = vendor_spec_strings.index(data)+1
typeflag = True
@@ -900,7 +900,7 @@
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# element2-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<GroupType>
data = device.getGroupType()
if data is not None and type(data) == unicode:
@@ -919,14 +919,14 @@
vendor_specific_data += "{:0>2x}".format(len(data))
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
-
- # element2-2; <EtherCATInfo>-<Groups>-<Group>-<Type>
- if grouptypeflag is False:
+
+ # element2-2; <EtherCATInfo>-<Groups>-<Group>-<Type>
+ if grouptypeflag is False:
if self.Controler.CTNParent.CTNParent.ModulesLibrary.Library is not None:
for vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
for group_type, group_etc in vendor["groups"].iteritems():
for device_item in group_etc["devices"]:
- if device == device_item[1]:
+ if device == device_item[1]:
data = group_type
if data is not None and type(data) == unicode:
for vendor_spec_string in vendor_spec_strings:
@@ -945,7 +945,7 @@
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# element3; <EtherCATInfo>-<Descriptions>-<Groups>-<Group>-<Name(LcId is "1033")>
if self.Controler.CTNParent.CTNParent.ModulesLibrary.Library is not None:
for vendorId, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
@@ -967,7 +967,7 @@
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# element4; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Name(LcId is "1033" or "1"?)>
for element in device.getName():
if element.getLcId() == 1 or element.getLcId()==1033:
@@ -988,7 +988,7 @@
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# element5-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Image16x14>
if device.getcontent() is not None:
data = device.getcontent()
@@ -1007,7 +1007,7 @@
vendor_specific_data += "{:0>2x}".format(len(data))
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
-
+
# element5-2; <EtherCATInfo>-<Descriptions>-<Groups>-<Group>-<Image16x14>
if imageflag is False:
if self.Controler.CTNParent.CTNParent.ModulesLibrary.Library is not None:
@@ -1032,7 +1032,7 @@
for character in range(len(data)):
vendor_specific_data += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# DC related elements
# <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Dc>-<OpMode>-<Name>
dc_related_elements = ""
@@ -1046,7 +1046,7 @@
for character in range(len(data)):
dc_related_elements += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# Input elements(TxPDO)
# <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<TxPdo>; Name
input_elements = ""
@@ -1055,7 +1055,7 @@
for name in element.getName():
data = name.getcontent()
for input in inputs:
- if data == input:
+ if data == input:
data = ""
if data is not "":
count += 1
@@ -1064,12 +1064,12 @@
input_elements += "{:0>2x}".format(len(data))
for character in range(len(data)):
input_elements += "{:0>2x}".format(ord(data[character]))
- data = ""
+ data = ""
for entry in element.getEntry():
for name in entry.getName():
data = name.getcontent()
for input in inputs:
- if data == input:
+ if data == input:
data = ""
if data is not "":
count += 1
@@ -1079,7 +1079,7 @@
for character in range(len(data)):
input_elements += "{:0>2x}".format(ord(data[character]))
data = ""
-
+
# Output elements(RxPDO)
# <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<RxPdo>; Name
output_elements = ""
@@ -1088,7 +1088,7 @@
for name in element.getName():
data = name.getcontent()
for output in outputs:
- if data == output:
+ if data == output:
data = ""
if data is not "":
count += 1
@@ -1097,12 +1097,12 @@
output_elements += "{:0>2x}".format(len(data))
for character in range(len(data)):
output_elements += "{:0>2x}".format(ord(data[character]))
- data = ""
+ data = ""
for entry in element.getEntry():
for name in entry.getName():
data = name.getcontent()
for output in outputs:
- if data == output:
+ if data == output:
data = ""
if data is not "":
count += 1
@@ -1111,8 +1111,8 @@
output_elements += "{:0>2x}".format(len(data))
for character in range(len(data)):
output_elements += "{:0>2x}".format(ord(data[character]))
- data = ""
-
+ data = ""
+
# form eeprom data
# category header
eeprom.append("0a")
@@ -1137,38 +1137,38 @@
eeprom.append("00")
else:
eeprom.append(element[0:2])
- element = element[2:len(element)]
- # padding if length is odd bytes
+ element = element[2:len(element)]
+ # padding if length is odd bytes
if padflag is True:
eeprom.append("ff")
-
+
return eeprom
-
+
def ExtractEEPROMGeneralCategory(self, device):
"""
Extract "General" category data from slave ESI XML and generate EEPROM image data.
@param device : 'device' object in the slave ESI XML
@return eeprom : "Strings" category EEPROM image data
- """
+ """
eeprom = []
data = ""
-
+
# category header
eeprom.append("1e")
eeprom.append("00")
-
+
# category length
eeprom.append("10")
eeprom.append("00")
-
+
# word 1 : Group Type index and Image index in STRINGS Category
eeprom.append("{:0>2x}".format(self.GroupIdx))
eeprom.append("{:0>2x}".format(self.ImgIdx))
-
+
# word 2 : Device Type index and Device Name index in STRINGS Category
eeprom.append("{:0>2x}".format(self.OrderIdx))
eeprom.append("{:0>2x}".format(self.NameIdx))
-
+
# word 3 : Physical Layer Port info. and CoE Details
eeprom.append("01") # Physical Layer Port info - assume 01
# CoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<CoE>
@@ -1178,12 +1178,12 @@
if mb is not None :
coe = mb.getCoE()
if coe is not None:
- for bit,flag in enumerate(["SdoInfo", "PdoAssign", "PdoConfig",
+ for bit,flag in enumerate(["SdoInfo", "PdoAssign", "PdoConfig",
"PdoUpload", "CompleteAccess"]):
if getattr(coe,"get%s"%flag)() is not None:
- coe_details += 1<<bit
+ coe_details += 1<<bit
eeprom.append("{:0>2x}".format(coe_details))
-
+
# word 4 : FoE Details and EoE Details
# FoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<FoE>
if mb is not None and mb.getFoE() is not None:
@@ -1195,7 +1195,7 @@
eeprom.append("01")
else:
eeprom.append("00")
-
+
# word 5 : SoE Channels(reserved) and DS402 Channels
# SoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<SoE>
if mb is not None and mb.getSoE() is not None:
@@ -1209,10 +1209,10 @@
if coe is not None :
ds402ch = coe.getDS402Channels()
eeprom.append("01" if ds402ch in [True,1] else "00")
-
+
# word 6 : SysmanClass(reserved) and Flags
eeprom.append("00") # reserved
- # Flags
+ # Flags
en_safeop = False
en_lrw = False
if device.getType().getTcCfgModeSafeOp() == True \
@@ -1221,10 +1221,10 @@
if device.getType().getUseLrdLwr() == True \
or device.getType().getUseLrdLwr() == 1:
en_lrw = True
-
+
flags = "0b"+"000000"+str(int(en_lrw))+str(int(en_safeop))
eeprom.append("{:0>2x}".format(int(flags, 2)))
-
+
# word 7 : Current On EBus (assume 0x0000)
eeprom.append("00")
eeprom.append("00")
@@ -1247,20 +1247,20 @@
eeprom.append("00")
eeprom.append("00")
eeprom.append("00")
-
+
return eeprom
-
+
def ExtractEEPROMFMMUCategory(self, device):
"""
Extract "FMMU" category data from slave ESI XML and generate EEPROM image data.
@param device : 'device' object in the slave ESI XML
@return eeprom : "Strings" category EEPROM image data
- """
+ """
eeprom = []
data = ""
count = 0 # number of FMMU
padflag = False
-
+
for fmmu in device.getFmmu():
count += 1
if fmmu.getcontent() == "Outputs":
@@ -1269,7 +1269,7 @@
data += "02"
if fmmu.getcontent() == "MBoxState":
data += "03"
-
+
# construct of EEPROM data
if data is not "":
# category header
@@ -1280,7 +1280,7 @@
padflag = True
eeprom.append("{:0>4x}".format((count+1)/2)[2:4])
eeprom.append("{:0>4x}".format((count+1)/2)[0:2])
- else:
+ else:
eeprom.append("{:0>4x}".format((count)/2)[2:4])
eeprom.append("{:0>4x}".format((count)/2)[0:2])
for i in range(count):
@@ -1289,22 +1289,22 @@
else:
eeprom.append(data[0:2])
data = data[2:len(data)]
- # padding if length is odd bytes
+ # padding if length is odd bytes
if padflag is True:
- eeprom.append("ff")
-
+ eeprom.append("ff")
+
return eeprom
-
+
def ExtractEEPROMSyncMCategory(self, device):
"""
Extract "SyncM" category data from slave ESI XML and generate EEPROM image data.
@param device : 'device' object in the slave ESI XML
@return eeprom : "Strings" category EEPROM image data
- """
+ """
eeprom = []
data = ""
number = {"MBoxOut":"01", "MBoxIn":"02", "Outputs":"03", "Inputs":"04"}
-
+
for sm in device.getSm():
for attr in [sm.getStartAddress(),
sm.getDefaultSize(),
@@ -1313,18 +1313,18 @@
data += "{:0>4x}".format(ExtractHexDecValue(attr))[2:4]
data += "{:0>4x}".format(ExtractHexDecValue(attr))[0:2]
else:
- data += "0000"
+ data += "0000"
if sm.getEnable() == "1" or sm.getEnable() == True:
data += "01"
else:
data += "00"
data += number[sm.getcontent()]
-
+
if data is not "":
# category header
eeprom.append("29")
eeprom.append("00")
- # category length
+ # category length
eeprom.append("{:0>4x}".format(len(data)/4)[2:4])
eeprom.append("{:0>4x}".format(len(data)/4)[0:2])
for i in range(len(data)/2):
@@ -1335,21 +1335,21 @@
data = data[2:len(data)]
return eeprom
-
+
def ExtractEEPROMPDOCategory(self, device, pdotype):
"""
Extract ""PDO (Tx, Rx)"" category data from slave ESI XML and generate EEPROM image data.
@param device : 'device' object in the slave ESI XML
@param pdotype : identifier whether "TxPDO" or "RxPDO".
@return eeprom : "Strings" category EEPROM image data
- """
+ """
eeprom = []
data = ""
count = 0
en_fixed = False
en_mandatory = False
en_virtual = False
-
+
for element in eval("device.get%s()"%pdotype):
# PDO Index
data += "{:0>4x}".format(ExtractHexDecValue(element.getIndex().getcontent()))[2:4]
@@ -1384,7 +1384,7 @@
if element.getVirtual() == True or element.getVirtual():
en_virtual = True
data += str(int(en_fixed)) + str(int(en_mandatory)) + str(int(en_virtual)) + "0"
-
+
for entry in element.getEntry():
# Entry Index
data += "{:0>4x}".format(ExtractHexDecValue(entry.getIndex().getcontent()))[2:4]
@@ -1422,7 +1422,7 @@
if entry.getFixed() == True or entry.getFixed() == 1:
en_fixed = True
data += str(int(en_fixed)) + "000"
-
+
if data is not "":
# category header
if pdotype == "TxPdo":
@@ -1432,7 +1432,7 @@
else:
eeprom.append("00")
eeprom.append("00")
- # category length
+ # category length
eeprom.append("{:0>4x}".format(len(data)/4)[2:4])
eeprom.append("{:0>4x}".format(len(data)/4)[0:2])
data = str(data.lower())
@@ -1442,20 +1442,20 @@
else:
eeprom.append(data[0:2])
data = data[2:len(data)]
-
+
return eeprom
-
+
def ExtractEEPROMDCCategory(self, device):
"""
Extract "DC(Distributed Clock)" category data from slave ESI XML and generate EEPROM image data.
@param device : 'device' object in the slave ESI XML
@return eeprom : "Strings" category EEPROM image data
- """
+ """
eeprom = []
data = ""
count = 0
namecount = 0
-
+
if device.getDc() is not None:
for element in device.getDc().getOpMode():
count += 1
@@ -1501,12 +1501,12 @@
# assume that word 11-12 are 0x0000
data += "0000"
data += "0000"
-
+
if data is not "":
# category header
eeprom.append("3c")
eeprom.append("00")
- # category length
+ # category length
eeprom.append("{:0>4x}".format(len(data)/4)[2:4])
eeprom.append("{:0>4x}".format(len(data)/4)[0:2])
data = str(data.lower())
@@ -1516,9 +1516,9 @@
else:
eeprom.append(data[0:2])
data = data[2:len(data)]
-
+
return eeprom
-
+
#-------------------------------------------------------------------------------
# Used Register Access
#-------------------------------------------------------------------------------
@@ -1529,10 +1529,10 @@
@param offset : register address
@param length : register length
@return return_val : register data
- """
+ """
error, return_val = self.Controler.RemoteExec(REG_READ%(self.Controler.GetSlavePos(), offset, length), return_val = None)
- return return_val
-
+ return return_val
+
def RegWrite(self, address, data):
"""
Write data to slave ESC register using "ethercat reg_write -p %d %s %s" command.
@@ -1540,28 +1540,28 @@
@param address : register address
@param data : data to write
@return return_val : the execution result of "ethercat reg_write" (for error check)
- """
+ """
error, return_val = self.Controler.RemoteExec(REG_WRITE%(self.Controler.GetSlavePos(), address, data), return_val = None)
- return return_val
-
+ return return_val
+
def Rescan(self):
"""
Synchronize EEPROM data in master controller with the data in slave device after EEPROM write.
Command example : "ethercat rescan -p 0"
- """
+ """
error, return_val = self.Controler.RemoteExec(RESCAN%(self.Controler.GetSlavePos()), return_val = None)
-
+
#-------------------------------------------------------------------------------
# Common Use Methods
#-------------------------------------------------------------------------------
def CheckConnect(self, cyclic_flag):
"""
- Check connection status (1) between Beremiz and the master (2) between the master and the slave.
+ Check connection status (1) between Beremiz and the master (2) between the master and the slave.
@param cyclic_flag: 0 - one shot, 1 - periodic
@return True or False
- """
+ """
if self.Controler.GetCTRoot()._connector is not None:
- # Check connection between the master and the slave.
+ # Check connection between the master and the slave.
# Command example : "ethercat xml -p 0"
error, return_val = self.Controler.RemoteExec(SLAVE_XML%(self.Controler.GetSlavePos()), return_val = None)
number_of_lines = return_val.split("\n")
@@ -1569,23 +1569,23 @@
if not cyclic_flag :
self.CreateErrorDialog('No connected slaves')
return False
-
+
elif len(number_of_lines) > 2 :
return True
- else:
+ else:
# The master controller is not connected to Beremiz host
if not cyclic_flag :
self.CreateErrorDialog('PLC not connected!')
return False
-
+
def CreateErrorDialog(self, mention):
"""
Create a dialog to indicate error or warning.
@param mention : Error String
- """
+ """
app_frame = self.Controler.GetCTRoot().AppFrame
- dlg = wx.MessageDialog (app_frame, mention,
- ' Warning...',
+ dlg = wx.MessageDialog (app_frame, mention,
+ ' Warning...',
wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
- dlg.Destroy()
+ dlg.Destroy()