# This file is part of Beremiz
# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
# RTES Lab : CRKim, JBLee, youcu
# Higen Motor : Donggu Kang
# See COPYING file for copyrights details.
import os,subprocess,sys,ctypes
from threading import Thread
from targets.typemapping import LogLevelsDict
SDOAnswered = PLCBinary.SDOAnswered
SDOAnswered.restype = None
SDOAnswered.argtypes = []
def SDOThreadProc(*params):
if params[0] == "upload":
cmdfmt = "ethercat upload -p %d -t %s 0x%.4x 0x%.2x"
cmdfmt = "ethercat download -p %d -t %s 0x%.4x 0x%.2x %s"
command = cmdfmt % params[1:]
SDOProc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
output = SDOProc.communicate()[0]
if params[0] == "upload":
if params[2] in ["float", "double"]:
elif params[2] in ["string", "octet_string", "unicode_string"]:
hex_value, dec_value = output.split()
if int(hex_value, 16) == int(dec_value):
LogLevelsDict["WARNING"],
"%s : %s"%(command,output))
def EthercatSDOUpload(pos, index, subindex, var_type):
SDOThread = Thread(target=SDOThreadProc, args=["upload", pos, var_type, index, subindex])
def EthercatSDODownload(pos, index, subindex, var_type, value):
SDOThread = Thread(target=SDOThreadProc, args=["download", pos, var_type, index, subindex, value])
def KMSGPollThreadProc():
Logs Kernel messages starting with EtherCAT
Uses GLibc wrapper to Linux syscall "klogctl"
Last 4 KB are polled, and lines compared to last
captured line to detect new lines
libc=ctypes.CDLL("libc.so.6")
klog.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int]
klog.restype = ctypes.c_int
s=ctypes.create_string_buffer(4*1024)
while not StopKMSGThread:
log = log.rpartition(last)[2]
last = log.rpartition('\n')[2]
for lvl,msg in re.findall(
r'<(\d)>\[\s*\d*\.\d*\]\s*(EtherCAT\s*.*)$',
"3":"CRITICAL"}.get(lvl,"DEBUG")],
def _runtime_etherlab_init():
global KMSGPollThread, StopKMSGThread
KMSGPollThread = Thread(target = KMSGPollThreadProc)
def _runtime_etherlab_cleanup():
global KMSGPollThread, StopKMSGThread, SDOProc, SDOThread
os.kill(SDOProc.pid, SIGTERM)