Laurent@2086: import subprocess,sys,ctypes Laurent@2086: from threading import Thread Laurent@2086: Laurent@2086: SDOAnswered = PLCBinary.SDOAnswered Laurent@2086: SDOAnswered.restype = None Laurent@2086: SDOAnswered.argtypes = [] Laurent@2086: Laurent@2086: SDOThread = None Laurent@2086: Result = None Laurent@2086: Laurent@2086: def SDOThreadProc(*params): Laurent@2086: global Result Laurent@2086: if params[0] == "upload": Laurent@2086: command = "ethercat upload -p %d -t %s 0x%.4x 0x%.2x" Laurent@2086: else: Laurent@2086: command = "ethercat download -p %d -t %s 0x%.4x 0x%.2x %s" Laurent@2086: Laurent@2086: proc = subprocess.Popen(command % params[1:], stdout=subprocess.PIPE, shell=True) Laurent@2086: res = proc.wait() Laurent@2086: output = proc.communicate()[0] Laurent@2086: Laurent@2086: if params[0] == "upload": Laurent@2086: Result = None Laurent@2086: if res == 0: Laurent@2086: if params[2] in ["float", "double"]: Laurent@2086: Result = float(output) Laurent@2086: elif params[2] in ["string", "octet_string", "unicode_string"]: Laurent@2086: Result = output Laurent@2086: else: Laurent@2086: hex_value, dec_value = output.split() Laurent@2086: if int(hex_value, 16) == int(dec_value): Laurent@2086: Result = int(dec_value) Laurent@2086: else: Laurent@2086: Result = res == 0 Laurent@2086: Laurent@2086: SDOAnswered() Laurent@2086: Laurent@2086: def EthercatSDOUpload(pos, index, subindex, var_type): Laurent@2086: global SDOThread Laurent@2086: SDOThread = Thread(target=SDOThreadProc, args=["upload", pos, var_type, index, subindex]) Laurent@2086: SDOThread.start() Laurent@2086: Laurent@2086: def EthercatSDODownload(pos, index, subindex, var_type, value): Laurent@2086: global SDOThread Laurent@2086: SDOThread = Thread(target=SDOThreadProc, args=["download", pos, var_type, index, subindex, value]) Laurent@2086: SDOThread.start() Laurent@2086: Laurent@2086: def GetResult(): Laurent@2086: global Result Laurent@2086: return Result