diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..f86292f3438c78d1922477fa08b1bb74ee2668ca --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,16 @@ +test: + image: python:3.8-slim + script: + - python3 -m ebpfcat.ebpf_test -v Tests && python3 -m ebpfcat.ethercat_test -v + +docs: + image: sphinxdoc/sphinx + script: + - apt-get update + - apt-get install -y openssh-client + - pip3 install . --user + - sphinx-build -b html -d _build/doctrees . _build/html + - eval $(ssh-agent) + - echo "$SSHKEY" | ssh-add - + - ssh -o UserKnownHostsFile=known_hosts wp86team@exflqr30526 "./doc-prepare ec_$CI_COMMIT_REF_NAME" + - scp -o UserKnownHostsFile=known_hosts -r _build/html wp86team@exflqr30526:html/ec_$CI_COMMIT_REF_NAME diff --git a/ebpfcat/devices.py b/ebpfcat/devices.py index c61fcb2b0d78ae4931dfcf62f37317a71ae01c39..faec3e011c1aeea6e69a6f9294fcd1b96ed4af38 100644 --- a/ebpfcat/devices.py +++ b/ebpfcat/devices.py @@ -40,11 +40,16 @@ class AnalogInput(Device): self.data = data def program(self): - self.value = self.data + # it does not make much sense to copy data faster than + # we can process + return def update(self): self.value = self.data + def fast_update(self): + self.value = self.data + class AnalogOutput(Device): """Generic analog output device diff --git a/ebpfcat/ebpf.py b/ebpfcat/ebpf.py index 6fd6e5959064ccf639f23a3ac81c18e2e4df1fe3..a615bcfe783908e2a55beef1f4cca4bb99e0311e 100644 --- a/ebpfcat/ebpf.py +++ b/ebpfcat/ebpf.py @@ -902,6 +902,21 @@ class ktime(Expression): yield dst, True, False +class prandom(Expression): + """a function that returns the current ktime in ns""" + def __init__(self, ebpf): + self.ebpf = ebpf + + @contextmanager + def calculate(self, dst, long, signed, force=False): + with self.ebpf.get_free_register(dst) as dst: + with self.ebpf.save_registers([i for i in range(6) if i != dst]): + self.ebpf.call(FuncId.get_prandom_u32) + if dst != 0: + self.ebpf.r[dst] = self.ebpf.r0 + yield dst, True, False + + class RegisterDesc: def __init__(self, no, array): self.no = no diff --git a/ebpfcat/ebpf_test.py b/ebpfcat/ebpf_test.py index 6cea964a6aaf658a350f50a49024724411db091b..c6ca17d2a7603cd2d19e44feb1224249aae72728 100644 --- a/ebpfcat/ebpf_test.py +++ b/ebpfcat/ebpf_test.py @@ -704,11 +704,11 @@ class KernelTests(TestCase): class Global(EBPF): map = ArrayMap() ar = map.globalVar() - aw = map.globalVar(write=True) + aw = map.globalVar() class Sub(SubProgram): br = Global.map.globalVar() - bw = Global.map.globalVar(write=True) + bw = Global.map.globalVar() def program(self): self.br -= -33 @@ -726,32 +726,26 @@ class KernelTests(TestCase): fd, _ = e.load(log_level=1) prog_test_run(fd, 1000, 1000, 100, 100, 1) - e.map.readwrite() self.assertEqual(e.ar, 7) self.assertEqual(e.aw, 11) self.assertEqual(s1.br, 33) self.assertEqual(s1.bw, 36) - self.assertEqual(s2.br, 33) - self.assertEqual(s2.bw, 36) - e.aw = e.ar * 2 s1.br = 3 s2.br *= 5 e.ar = 1111 self.assertEqual(e.ar, 1111) - self.assertEqual(e.aw, 14) + self.assertEqual(e.aw, 11) self.assertEqual(s1.br, 3) self.assertEqual(s1.bw, 36) self.assertEqual(s2.br, 165) self.assertEqual(s2.bw, 36) - e.map.readwrite() prog_test_run(fd, 1000, 1000, 0, 0, 1) - e.map.readwrite() - self.assertEqual(e.ar, 21) - self.assertEqual(e.aw, 25) - self.assertEqual(s1.br, 66) - self.assertEqual(s1.bw, 69) - self.assertEqual(s2.br, 66) - self.assertEqual(s2.bw, 69) + self.assertEqual(e.ar, 18) + self.assertEqual(e.aw, 22) + self.assertEqual(s1.br, 36) + self.assertEqual(s1.bw, 39) + self.assertEqual(s2.br, 198) + self.assertEqual(s2.bw, 201) def test_minimal(self): class Local(EBPF): @@ -760,12 +754,11 @@ class KernelTests(TestCase): e = Local(ProgType.XDP, "GPL") e.a = 7 e.a += 3 - e.mI[e.r1] += e.r1 + e.mI[e.r10 - 4] += e.r1 e.a -= 3 e.exit() print(e.opcodes) print(e.load(log_level=1)[1]) - self.fail() if __name__ == "__main__": diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py index c3b927474d67ad34fe674b87902270aa9ac2e87c..a1590be57a35d3817690c7474b46b505df101bbe 100644 --- a/ebpfcat/ebpfcat.py +++ b/ebpfcat/ebpfcat.py @@ -16,12 +16,12 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """The high-level API for EtherCAT loops""" -from asyncio import ensure_future, gather, sleep +from asyncio import ensure_future, gather, wait_for, TimeoutError from struct import pack, unpack, calcsize, pack_into, unpack_from from time import time from .arraymap import ArrayMap, ArrayGlobalVarDesc from .ethercat import ECCmd, EtherCat, Packet, Terminal -from .ebpf import FuncId, MemoryDesc, SubProgram, ktime +from .ebpf import FuncId, MemoryDesc, SubProgram, prandom from .xdp import XDP, XDPExitCode from .bpf import ( ProgType, MapType, create_map, update_elem, prog_test_run, lookup_elem) @@ -201,13 +201,13 @@ class DeviceVar(ArrayGlobalVarDesc): def __get__(self, instance, owner): if instance is None: return self - elif instance.sync_group.current_data is None: + elif isinstance(instance.sync_group, FastSyncGroup): return super().__get__(instance, owner) else: return instance.__dict__.get(self.name, 0) def __set__(self, instance, value): - if instance.sync_group.current_data is None: + if isinstance(instance.sync_group, FastSyncGroup): super().__set__(instance, value) else: instance.__dict__[self.name] = value @@ -226,13 +226,16 @@ class Device(SubProgram): ret.add(pv.terminal) return ret + def fast_update(self): + pass + class EBPFTerminal(Terminal): compatibility = None position_offset = {2: 0, 3: 0} - async def initialize(self, relative, absolute): - await super().initialize(relative, absolute) + async def apply_eeprom(self): + await super().apply_eeprom() if (self.compatibility is not None and (self.vendorId, self.productCode) not in self.compatibility): raise RuntimeError( @@ -272,37 +275,42 @@ class EtherXDP(XDP): license = "GPL" variables = ArrayMap() + dropcounter = variables.globalVar("I") counters = variables.globalVar("64I") rate = 0 def program(self): - with self.tmp: - self.ebpf.tmp = ktime(self.ebpf) - self.ebpf.tmp = self.ebpf.tmp * 0xcf019d85 + 1 - with self.ebpf.tmp & 0xffff < self.rate: - self.ebpf.exit(XDPExitCode.DROP) - with self.packetSize > 24 as p, p.pH[12] == 0xA488, p.pB[16] == 0: - self.r3 = p.pI[18] + ETHERTYPE = 12 + CMD0 = 16 + IDX0 = 17 + ADDR0 = 18 + + with prandom(self.ebpf) & 0xffff < self.rate: + self.dropcounter += 1 + self.ebpf.exit(XDPExitCode.DROP) + with self.packetSize > 24 as p, p.pH[ETHERTYPE] == 0xA488, \ + p.pB[CMD0] == 0: + self.r3 = p.pI[ADDR0] # use r3 for tail_call with self.counters.get_address(None, False, False) as (dst, _), \ self.r3 < FastEtherCat.MAX_PROGS: - self.mH[self.r[dst] + 4 * self.r3] += 1 - p.pB[17] += 2 - with p.pB[17] & 1 as is_regular: - self.mB[self.r[dst] + 4 * self.r3 + 3] += 1 - self.mB[self.r[dst] + 4 * self.r3 + 2] = 0 - with is_regular.Else(): - self.mB[self.r[dst] + 4 * self.r3 + 2] += 1 - self.mB[self.r[dst] + 4 * self.r3 + 3] = 0 - with self.mB[self.r[dst] + 4 * self.r3 + 2] > 3 as exceed: - p.pB[17] += 1 # turn into regular package - with exceed.Else(): + self.r[dst] += 4 * self.r3 + self.r4 = self.mB[self.r[dst]] + # we lost a packet + with p.pB[IDX0] == self.r4 as cond: + self.mI[self.r[dst]] += 1 + (self.r4 & 1) + # normal case: two packets on the wire + with cond.Else(), ((p.pB[IDX0] + 1 & 0xff) == self.r4) \ + | (p.pB[IDX0] == 0) as c2: + self.mI[self.r[dst]] += 1 + with self.r4 & 1: # last one was active + p.pB[IDX0] = self.mB[self.r[dst]] self.exit(XDPExitCode.TX) - self.r2 = self.get_fd(self.programs) - for i, o in enumerate(self.opcodes): - print(i, o) - self.call(FuncId.tail_call) - + with c2.Else(): + self.exit(XDPExitCode.PASS) + p.pB[IDX0] = self.mB[self.r[dst]] + self.r2 = self.get_fd(self.programs) + self.call(FuncId.tail_call) self.exit(XDPExitCode.PASS) @@ -332,31 +340,18 @@ class FastEtherCat(SimpleEtherCat): fd, _ = sg.load(log_level=1) update_elem(self.programs, pack("<I", index), pack("<I", fd), 0) self.sync_groups[index] = sg - sg.assembled = packet.assemble(index) return index - async def watchdog(self): - lastcounts = [0] * 64 - while True: - t0 = time() - counts = self.ebpf.counters - for i, sg in self.sync_groups.items(): - if ((counts[i] ^ lastcounts[i]) & 0xffff == 0 - or (counts[i] >> 24) > 3): - self.send_packet(sg.assembled) - print("sent", i) - lastcounts[i] = counts[i] - await sleep(0.001) - async def connect(self): await super().connect() self.ebpf = EtherXDP() self.ebpf.programs = self.programs self.fd = await self.ebpf.attach(self.addr[0]) - ensure_future(self.watchdog()) class SyncGroupBase: + missed_counter = 0 + def __init__(self, ec, devices, **kwargs): super().__init__(**kwargs) self.ec = ec @@ -370,23 +365,30 @@ class SyncGroupBase: self.terminals = {t: None for t in sorted(terminals, key=lambda t: t.position)} + async def run(self): + data = self.asm_packet + while True: + self.ec.send_packet(data) + try: + data = await wait_for(self.ec.receive_index(self.packet_index), + timeout=0.01) + except TimeoutError: + self.missed_counter += 1 + print("didn't receive in time", self.missed_counter) + continue + data = self.update_devices(data) + class SyncGroup(SyncGroupBase): """A group of devices communicating at the same time""" packet_index = 1000 - current_data = False # None is used to indicate FastSyncGroup - - async def run(self): - self.current_data = self.asm_packet - while True: - self.ec.send_packet(self.current_data) - data = await self.ec.receive_index(self.packet_index) - self.current_data = bytearray(data) - for dev in self.devices: - dev.update() - await sleep(0) + def update_devices(self, data): + self.current_data = bytearray(data) + for dev in self.devices: + dev.update() + return self.current_data def start(self): self.allocate() @@ -424,9 +426,22 @@ class FastSyncGroup(SyncGroupBase, XDP): print("JMP") self.exit(XDPExitCode.TX) + async def run(self): + self.ec.send_packet(self.asm_packet) + self.ec.send_packet(self.asm_packet) + await super().run() + + def update_devices(self, data): + self.current_data = data + for dev in self.devices: + dev.fast_update() + return self.asm_packet + def start(self): self.allocate() - self.ec.register_sync_group(self, self.packet) + self.packet_index = self.ec.register_sync_group(self, self.packet) + self.asm_packet = self.packet.assemble(self.packet_index) + ensure_future(self.run()) def allocate(self): self.packet = Packet() diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py index 6a2353b64b88e174077fa99a0b34dca31d3c02dc..d626644fc3f7d8abeba4cc8a504fb47dfbe88f36 100644 --- a/ebpfcat/ethercat.py +++ b/ebpfcat/ethercat.py @@ -28,10 +28,15 @@ this modules contains the code to actually talk to EtherCAT terminals. """ from asyncio import ensure_future, Event, Future, gather, get_event_loop, Protocol, Queue, Lock from enum import Enum +from itertools import count from random import randint from socket import socket, AF_PACKET, SOCK_DGRAM from struct import pack, unpack, unpack_from, calcsize +class EtherCatError(Exception): + pass + + class ECCmd(Enum): NOP = 0 # No Operation APRD = 1 # Auto Increment Read @@ -281,7 +286,12 @@ class EtherCat(Protocol): if packet.full() or self.send_queue.empty(): data = await self.roundtrip_packet(packet) for start, stop, future in dgrams: - future.set_result(data[start:stop]) + wkc, = unpack("<H", data[stop:stop+2]) + if wkc == 0: + future.set_exception( + EtherCatError("datagram was not processed")) + else: + future.set_result(data[start:stop]) dgrams = [] packet = Packet() @@ -355,6 +365,15 @@ class EtherCat(Protocol): no, = unpack("<h", ret[16:18]) # number of terminals return no + async def find_free_address(self): + """Find an absolute address currently not in use""" + no = await self.count() + for i in count(no): + try: + await self.roundtrip(ECCmd.FPRD, i, 0x10, "H", 0) + except EtherCatError: + return i # this address is not in use + def connection_made(self, transport): """start the send loop once the connection is made""" transport.get_extra_info("socket").bind(self.addr) @@ -387,8 +406,14 @@ class Terminal: await self.set_state(0x11) await self.set_state(1) + self.mbx_cnt = 1 + self.mbx_lock = Lock() + + await self.apply_eeprom() + + async def apply_eeprom(self): async def read_eeprom(no, fmt): - return unpack(fmt, await self.eeprom_read_one(no)) + return unpack(fmt, await self._eeprom_read_one(no)) self.vendorId, self.productCode = await read_eeprom(8, "<II") self.revisionNo, self.serialNo = await read_eeprom(0xc, "<II") @@ -397,9 +422,6 @@ class Terminal: # self.mbx_in_off, self.mbx_in_sz, self.mbx_out_off, self.mbx_out_sz = \ # await read_eeprom(0x18, "<HHHH") - self.mbx_cnt = 1 - self.mbx_lock = Lock() - self.eeprom = await self.read_eeprom() if 41 not in self.eeprom: # no sync managers defined in eeprom @@ -456,7 +478,6 @@ class Terminal: async def parse(func): bitpos = 0 async for idx, subidx, sm, bits in func: - #print("k", idx, subidx, sm, bits) if idx == 0: pass elif bits < 8: @@ -534,7 +555,7 @@ class Terminal: s, error = await self.ec.roundtrip(ECCmd.FPRD, self.position, 0x0130, "H2xH") if error != 0: - raise RuntimeError(f"AL register {error}") + raise EtherCatError(f"AL register {error}") async def get_error(self): """read the error register""" @@ -555,7 +576,7 @@ class Terminal: return (await self.ec.roundtrip(ECCmd.FPWR, self.position, start, *args, **kwargs)) - async def eeprom_read_one(self, start): + async def _eeprom_read_one(self, start): """read 8 bytes from the eeprom at `start`""" while (await self.read(0x502, "H"))[0] & 0x8000: pass @@ -565,13 +586,26 @@ class Terminal: busy, data = await self.read(0x502, "H4x8s") return data + async def eeprom_write_one(self, start, data): + """read 2 bytes from the eeprom at `start`""" + while (await self.read(0x502, "H"))[0] & 0x8000: + pass + busy = 0x1000 + while busy & 0xff00: + await self.write(0x502, "HIH", 0x201, start, data) + busy = 0x8000 + while busy & 0x8000: + busy, = await self.read(0x502, "H") + print(f"busy {busy:X}") + await self.write(0x502, "H", 0) + async def read_eeprom(self): """read the entire eeprom""" async def get_data(size): nonlocal data, pos while len(data) < size: - data += await self.eeprom_read_one(pos) + data += await self._eeprom_read_one(pos) pos += 4 ret, data = data[:size], data[size:] return ret @@ -593,7 +627,7 @@ class Terminal: """send data to the mailbox""" status, = await self.read(0x805, "B") # always using mailbox 0, OK? if status & 8: - raise RuntimeError("mailbox full, read first") + raise EtherCatError("mailbox full, read first") assert self.mbx_out_off is not None, "not send mailbox defined" await self.write(self.mbx_out_off, "HHBB", datasize(args, data), @@ -626,10 +660,10 @@ class Terminal: while fragments: type, data = await self.mbx_recv() if type is not MBXType.COE: - raise RuntimeError(f"expected CoE package, got {type}") + raise EtherCatError(f"expected CoE package, got {type}") coecmd, rodcmd, fragments = unpack("<HBxH", data[:6]) if rodcmd & 0x7f != odcmd.value + 1: - raise RuntimeError(f"expected {odcmd.value}, got {odcmd}") + raise EtherCatError(f"expected {odcmd.value}, got {odcmd}") ret.append(data[offset:]) offset = 6 return b"".join(ret) @@ -643,16 +677,16 @@ class Terminal: index, 1 if subindex is None else subindex) type, data = await self.mbx_recv() if type is not MBXType.COE: - raise RuntimeError(f"expected CoE, got {type}") + raise EtherCatError(f"expected CoE, got {type}") coecmd, sdocmd, idx, subidx, size = unpack("<HBHBI", data[:10]) if coecmd >> 12 != CoECmd.SDORES.value: if subindex is None and coecmd >> 12 == CoECmd.SDOREQ.value: return b"" # if there is no data, the terminal fails - raise RuntimeError( + raise EtherCatError( f"expected CoE SDORES (3), got {coecmd>>12:x} " f"for {index:X}:{9 if subindex is None else subindex:02X}") if idx != index: - raise RuntimeError(f"requested index {index}, got {idx}") + raise EtherCatError(f"requested index {index}, got {idx}") if sdocmd & 2: return data[6 : 10 - ((sdocmd>>2) & 3)] ret = [data[10:]] @@ -666,13 +700,13 @@ class Terminal: 1 if subindex is None else subindex) type, data = await self.mbx_recv() if type is not MBXType.COE: - raise RuntimeError(f"expected CoE, got {type}") + raise EtherCatError(f"expected CoE, got {type}") coecmd, sdocmd = unpack("<HB", data[:3]) if coecmd >> 12 != CoECmd.SDORES.value: - raise RuntimeError( + raise EtherCatError( f"expected CoE cmd SDORES, got {coecmd}") if sdocmd & 0xe0 != 0: - raise RuntimeError(f"requested index {index}, got {idx}") + raise EtherCatError(f"requested index {index}, got {idx}") if sdocmd & 1 and len(data) == 7: data = data[:3 + (sdocmd >> 1) & 7] ret += data[3:] @@ -681,7 +715,7 @@ class Terminal: break toggle ^= 0x10 if retsize != size: - raise RuntimeError(f"expected {size} bytes, got {retsize}") + raise EtherCatError(f"expected {size} bytes, got {retsize}") return b"".join(ret) async def sdo_write(self, data, index, subindex=None): @@ -693,12 +727,12 @@ class Terminal: index, subindex, data) type, data = await self.mbx_recv() if type is not MBXType.COE: - raise RuntimeError(f"expected CoE, got {type}, {data} {odata} {index:x} {subindex}") + raise EtherCatError(f"expected CoE, got {type}, {data} {odata} {index:x} {subindex}") coecmd, sdocmd, idx, subidx = unpack("<HBHB", data[:6]) if idx != index or subindex != subidx: - raise RuntimeError(f"requested index {index}, got {idx}") + raise EtherCatError(f"requested index {index}, got {idx}") if coecmd >> 12 != CoECmd.SDORES.value: - raise RuntimeError(f"expected CoE SDORES, got {coecmd>>12:x}") + raise EtherCatError(f"expected CoE SDORES, got {coecmd>>12:x}") else: async with self.mbx_lock: stop = min(len(data), self.mbx_out_sz - 16) @@ -710,12 +744,12 @@ class Terminal: data=data[:stop]) type, data = await self.mbx_recv() if type is not MBXType.COE: - raise RuntimeError(f"expected CoE, got {type}") + raise EtherCatError(f"expected CoE, got {type}") coecmd, sdocmd, idx, subidx = unpack("<HBHB", data[:6]) if coecmd >> 12 != CoECmd.SDORES.value: - raise RuntimeError(f"expected CoE SDORES, got {coecmd>>12:x}") + raise EtherCatError(f"expected CoE SDORES, got {coecmd>>12:x}") if idx != index or subindex != subidx: - raise RuntimeError(f"requested index {index}, got {idx}") + raise EtherCatError(f"requested index {index}, got {idx}") toggle = 0 while stop < len(data): start = stop @@ -733,12 +767,12 @@ class Terminal: 1 if subindex is None else subindex, data=d) type, data = await self.mbx_recv() if type is not MBXType.COE: - raise RuntimeError(f"expected CoE, got {type}") + raise EtherCatError(f"expected CoE, got {type}") coecmd, sdocmd, idx, subidx = unpack("<HBHB", data[:6]) if coecmd >> 12 != CoECmd.SDORES.value: - raise RuntimeError(f"expected CoE SDORES") + raise EtherCatError(f"expected CoE SDORES") if idx != index or subindex != subidx: - raise RuntimeError(f"requested index {index}") + raise EtherCatError(f"requested index {index}") toggle ^= 0x10 async def read_ODlist(self): diff --git a/ebpfcat/ethercat_test.py b/ebpfcat/ethercat_test.py index f95f0c701ae51b3d64986a7ea01fc95bac6f1dfa..5c921c4fa139bc5ff2b4f4f8b2fb13d2e595168a 100644 --- a/ebpfcat/ethercat_test.py +++ b/ebpfcat/ethercat_test.py @@ -15,22 +15,33 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +from ast import literal_eval from asyncio import CancelledError, Future, get_event_loop, sleep, gather -from unittest import TestCase, main +from functools import wraps +from itertools import count +from struct import pack +from unittest import TestCase, main, skip from .devices import AnalogInput, AnalogOutput, Motor from .terminals import EL4104, EL3164, EK1814 -from .ethercat import ECCmd +from .ethercat import ECCmd, Terminal from .ebpfcat import ( FastSyncGroup, SyncGroup, TerminalVar, Device, EBPFTerminal, PacketDesc) from .ebpf import Instruction, Opcode as O +H = bytes.fromhex + + class MockEtherCat: def __init__(self, test): self.test = test + with open(__file__.rsplit("/", 1)[0] + "/testdata.py", "r") as fin: + self.test_data = literal_eval(fin.read()) - async def roundtrip(self, *args): + async def roundtrip(self, *args, data=None): + if data is not None: + args += data, self.test.assertEqual(args, self.expected.pop(0)) return self.results.pop(0) @@ -50,68 +61,121 @@ class MockEtherCat: return 0x33 +class MockTerminal(Terminal): + async def initialize(self, relative, absolute): + self.position = absolute + self.operational = False + data = self.ec.test_data[-relative] + self.test_eeprom = data["eeprom"] + self.test_sdo = data["sdo"] + await self.apply_eeprom() + + async def to_operational(self): + self.operational = True + + async def sdo_read(self, index, subindex=None): + assert self.operational + if subindex is None: + r = b'' + for i in count(1): + a = self.test_sdo.get((index, i)) + if a is None: + break + r += a + return r + elif subindex == 0 and (index, 0) not in self.test_sdo: + for i in count(1): + a = self.test_sdo.get((index, i)) + if a is None: + return pack("B", i - 1) + return self.test_sdo[index, subindex] + + async def _eeprom_read_one(self, pos): + if pos * 2 > len(self.test_eeprom): + return b"\xff" * 8 + return self.test_eeprom[pos*2 : pos*2 + 8] + + +def mockAsync(f): + @wraps(f) + def wrapper(self): + get_event_loop().run_until_complete(f(self)) + return wrapper + + +def mockTerminal(cls): + class Mocked(MockTerminal, cls): + pass + return Mocked() + + class Tests(TestCase): - def test_input(self): - ti = EL3164() - ti.pdo_in_sz = 4 - ti.pdo_in_off = 0xABCD - ti.position = 0x77 - ti.pdo_out_sz = 3 - ti.pdo_out_off = 0x4321 + @mockAsync + async def test_input(self): + ti = mockTerminal(EL3164) ec = MockEtherCat(self) ti.ec = ec + ec.expected = [ + (ECCmd.FPWR, 4, 0x800, 0x80), + (ECCmd.FPWR, 4, 0x800, H('00108000260001018010800022000102' + '00110000040000038011100020000104')), + ] + ec.results = [None, None] + await ti.initialize(-1, 4) ai = AnalogInput(ti.channel1.value) SyncGroup.packet_index = 1000 sg = SyncGroup(ec, [ai]) self.task = sg.start() ec.expected = [ - (ECCmd.FPRD, 0x77, 304, "H2xH"), # get state - bytes.fromhex("2d10" # EtherCAT Header, length & type - "0000e8030000008000000000" # ID datagram - "04007700cdab04800000000000000000" # in datagram - "050077002143030000000000000000"), # out datagram + H("2a10" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + # in datagram + "04000400801110000000000000000000000000000000000000000000"), 1000, # == 0x3e8, see ID datagram - bytes.fromhex("2d10" # EtherCAT Header, length & type - "0000e8030000008000000000" # ID datagram - "04007700cdab04800000123456780000" # in datagram - "050077002143030000000000000000"), # out datagram + H("2a10" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + # in datagram + "04000400801110000000123456780000000000000000000000000000"), 1000, ] ec.results = [ - (8, 0), # return state 8, no error - bytes.fromhex("2d10" # EtherCAT Header, length & type - "0000e8030000008000000000" # ID datagram - "04007700cdab04800000123456780000" # in datagram - "050077002143030000000000000000"), # out datagram + H("2a10" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + # in datagram + "04000400801110000000123456780000000000000000000000000000"), + H("2a10" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + # in datagram + "04000400801110000000123456780000000000000000000000000000"), ] self.future = Future() with self.assertRaises(CancelledError): - get_event_loop().run_until_complete( - gather(self.future, self.task)) + await gather(self.future, self.task) self.assertEqual(ai.value, 0x7856) self.task.cancel() with self.assertRaises(CancelledError): - get_event_loop().run_until_complete(self.task) + await self.task - def test_output(self): - ti = EL4104() - ti.pdo_in_sz = 4 - ti.pdo_in_off = 0xABCD - ti.position = 0x77 - ti.pdo_out_sz = 3 - ti.pdo_out_off = 0x4321 + @mockAsync + async def test_output(self): + ti = mockTerminal(EL4104) ec = MockEtherCat(self) ti.ec = ec + ec.expected = [ + (ECCmd.FPWR, 7, 0x800, 0x80), + (ECCmd.FPWR, 7, 0x800, H('0010800026000101801080002200010' + '200110800240001038011000000000004')), + ] + ec.results = [None, None] + await ti.initialize(-2, 7) ao = AnalogOutput(ti.ch1_value) SyncGroup.packet_index = 1000 sg = SyncGroup(ec, [ao]) self.task = sg.start() ec.expected = [ - (ECCmd.FPRD, 0x77, 304, "H2xH"), # get state - bytes.fromhex("2d10" # EtherCAT Header, length & type - "0000e8030000008000000000" # ID datagram - "04007700cdab04800000000000000000" # in datagram - "050077002143030000000000000000"), # out datagram + H("2210" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + "0500070000110800000000000000000000000000"), # out datagram 1000, # == 0x3e8, see ID datagram ] ec.results = [ @@ -120,48 +184,30 @@ class Tests(TestCase): self.future = Future() ao.value = 0x9876 with self.assertRaises(CancelledError): - get_event_loop().run_until_complete( - gather(self.future, self.task)) + await gather(self.future, self.task) ec.expected = [ - bytes.fromhex("2d10" # EtherCAT Header, length & type - "0000e8030000008000000000" # ID datagram - "04007700cdab04800000123456780000" # in datagram - "050077002143030000007698000000"), # out datagram + H("2210" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + "0500070000110800000076980000000000000000"), # out datagram 1000, ] ec.results = [ - bytes.fromhex("2d10" # EtherCAT Header, length & type - "0000e8030000008000000000" # ID datagram - "04007700cdab04800000123456780000" # in datagram - "050077002143030000007698000000"), # out datagram + H("2210" # EtherCAT Header, length & type + "0000e8030000008000000000" # ID datagram + "0500070000110800000076980000000000000000"), # out datagram ] self.future = Future() with self.assertRaises(CancelledError): - get_event_loop().run_until_complete( - gather(self.future, self.task)) + await gather(self.future, self.task) self.task.cancel() with self.assertRaises(CancelledError): - get_event_loop().run_until_complete(self.task) + await self.task + @skip def test_ebpf(self): - ti = EL3164() - ti.pdo_in_sz = 4 - ti.pdo_in_off = 0xABCD - ti.position = 0x77 - ti.pdo_out_sz = None - ti.pdo_out_off = None - to = EL4104() - to.pdo_in_sz = None - to.pdo_in_off = None - to.position = 0x55 - to.pdo_out_sz = 2 - to.pdo_out_off = 0x5678 - td = EK1814() - td.pdo_in_sz = 1 - td.pdo_in_off = 0x7777 - td.position = 0x44 - td.pdo_out_sz = 1 - td.pdo_out_off = 0x8888 + ti = mockTerminal(EL3164) + to = mockTerminal(EL4104) + td = mockTerminal(EK1814) class D(Device): ai = TerminalVar() diff --git a/ebpfcat/scripts.py b/ebpfcat/scripts.py index 887bcbe0ad37beaec48cf618ac14f66f1286a771..b88ce1b5f46e71f67287e4951334a56b94a48b75 100644 --- a/ebpfcat/scripts.py +++ b/ebpfcat/scripts.py @@ -1,10 +1,12 @@ from argparse import ArgumentParser import asyncio from functools import wraps +from hashlib import sha1 +from pprint import PrettyPrinter from struct import unpack import sys -from .ethercat import EtherCat, Terminal, ECCmd +from .ethercat import EtherCat, Terminal, ECCmd, EtherCatError def entrypoint(func): @wraps(func) @@ -42,17 +44,17 @@ async def info(): if args.terminal is None: terminals = range(await ec.count()) + terms = [Terminal() for t in terminals] + for t in terms: + t.ec = ec + await asyncio.gather(*(t.initialize(-i, i + 7) + for i, t in zip(terminals, terms))) else: - # former terminal: don't listen! - # this does not work with all terminals, dunno why - await ec.roundtrip(ECCmd.FPRW, 7, 0x10, "H", 0) - terminals = [args.terminal] - - terms = [Terminal() for t in terminals] - for t in terms: - t.ec = ec - await asyncio.gather(*(t.initialize(-i, i + 7) - for i, t in zip(terminals, terms))) + free = await ec.find_free_address() + term = Terminal() + term.ec = ec + await term.initialize(-args.terminal, free) + terms = [term] for i, t in enumerate(terms): print(f"terminal no {i}") @@ -72,15 +74,106 @@ async def info(): for k, v in ret.items(): print(f"{k:X}:") for kk, vv in v.entries.items(): - print(f" {kk:X}: {vv}") - if args.values: - r = await vv.read() - if isinstance(r, int): - print(f" {r:10} {r:8X}") - else: - print(f" {r}") + print(f" {kk:X}: {vv}") + if args.values: + try: + r = await vv.read() + except EtherCatError as e: + print(f" Error {e.args[0]}") + else: + if isinstance(r, int): + print(f" {r:10} {r:8X}") + else: + print(f" {r}") if args.pdo: await t.to_operational() await t.parse_pdos() for (idx, subidx), (sm, pos, fmt) in t.pdos.items(): print(f"{idx:4X}:{subidx:02X} {sm} {pos} {fmt}") + + +def encode(name): + r = int.from_bytes(sha1(name.encode("ascii")).digest(), "little") + return r % 0xffffffff + 1 + +@entrypoint +async def eeprom(): + parser = ArgumentParser( + prog = "ec-eeprom", + description = "Read and write the eeprom") + + parser.add_argument("interface") + parser.add_argument("-t", "--terminal", type=int) + parser.add_argument("-r", "--read", action="store_true") + parser.add_argument("-w", "--write", type=int) + parser.add_argument("-n", "--name", type=str) + parser.add_argument("-c", "--check", type=str) + args = parser.parse_args() + + ec = EtherCat(args.interface) + await ec.connect() + + if args.terminal is None: + return + terminals = range(await ec.count()) + else: + # former terminal: don't listen! + # this does not work with all terminals, dunno why + await ec.roundtrip(ECCmd.FPRW, 7, 0x10, "H", 0) + terminals = [args.terminal] + + t = Terminal() + t.ec = ec + await t.initialize(-args.terminal, 7) + + if args.read or args.check is not None: + r, = unpack("<4xI", await t.eeprom_read_one(0xc)) + if args.check is not None: + c = encode(args.check) + print(f"{r:8X} {c:8X} {r == c}") + else: + print(f"{r:8X} {r}") + + w = None + if args.write is not None: + w = args.write + elif args.name is not None: + w = encode(args.name) + print(f"{w:8X} {w}") + if w is not None: + await t.eeprom_write_one(0xe, w & 0xffff) + await t.eeprom_write_one(0xf, w >> 16) + + +@entrypoint +async def create_test(): + ec = EtherCat(sys.argv[1]) + await ec.connect() + no = await ec.count() + + terminals = [] + + for i in range(no): + t = Terminal() + t.ec = ec + await t.initialize(-i, await ec.find_free_address()) + sdo = {} + if t.has_mailbox(): + await t.to_operational() + odlist = await t.read_ODlist() + + for k, v in odlist.items(): + for kk, vv in v.entries.items(): + try: + ret = await t.sdo_read(v.index, vv.valueInfo) + except EtherCatError: + pass + sdo[v.index, vv.valueInfo] = ret + + ret = [] + for i in range(0, 0x400, 4): + ret.append(await t._eeprom_read_one(i)) + eeprom = b"".join(ret).rstrip(b"\xff") + terminals.append(dict(eeprom=eeprom, sdo=sdo)) + pp = PrettyPrinter(indent=4) + pp.pprint(terminals) diff --git a/ebpfcat/testdata.py b/ebpfcat/testdata.py new file mode 100644 index 0000000000000000000000000000000000000000..e05faa6777ad67568e08994e4e072f7d8e6df5a4 --- /dev/null +++ b/ebpfcat/testdata.py @@ -0,0 +1,1871 @@ +[ { 'eeprom': b'\x04\r\x00\x00\n\x000\x00\x00\x00\x00\x00\x00\x00\x1b\x00' + b'\x02\x00\x00\x00R,\x16\x07\x00\x00\x12\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00' + b'\x8d\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x01\x00\n\x00h\x00' + b'\x0e\x06EK1814\x08SystemBk\x0eSystem KopplerREK1814 Ethe' + b'rCAT-EA-Koppler (1A E-Bus, 4 K. Dig. Ein, 3ms, 4 K. Dig.' + b' Aus 24V, 0,5A)\tChannel 1\x05Input\tChannel 2\tChannel 3\t' + b'Channel 4\tChannel 5\x06Output\tChannel 6\tChannel 7\tChann' + b'el 8\x1e\x00\x10\x00\x02\x00\x01\x04\x02\x00\x00\x00' + b'\x00\x00\x00\x00\x18\xfc\x03\x001\x01\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'(\x00\x01\x00\x01\x02)\x00\x08\x00\x01\x0f\x01\x00D\x00' + b'\t\x03\x00\x10\x01\x00\x00\x00\x01\x04+\x00\x01\x00\xf0\xff' + b'2\x00 \x00\x00\x1a\x01\x01\x00\x05\x11\x00\x00`\x01\x06' + b'\x01\x01\x00\x00\x01\x1a\x01\x01\x00\x07\x11\x00' + b'\x10`\x01\x06\x01\x01\x00\x00\x02\x1a\x01\x01' + b'\x00\x08\x11\x00 `\x01\x06\x01\x01\x00\x00\x03\x1a\x01\x01' + b'\x00\t\x11\x000`\x01\x06\x01\x01\x00\x003\x00 \x00' + b'\x08\x16\x01\x00\x00\n\x11\x00\x80p\x01\x0b\x01\x01\x00\x00' + b'\t\x16\x01\x00\x00\x0c\x11\x00\x90p\x01\x0b\x01\x01\x00\x00' + b'\n\x16\x01\x00\x00\r\x11\x00\xa0p\x01\x0b\x01\x01\x00\x00' + b'\x0b\x16\x01\x00\x00\x0e\x11\x00\xb0p\x01\x0b' + b'\x01\x01\x00\x00', + 'sdo': {}}, + { 'eeprom': b'\x05\x04\x03\xcc\xd0\x07\x00\x00\x00\x00\x00\x00' + b'\x00\x00=\x00\x02\x00\x00\x00R0\\\x0c\x00\x00\x14\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x10\xf4\x00\xf4\x10\xf4\x00\x00\x10\x80\x00' + b'\x80\x10\x80\x00\x0c\x00\x00\x00\x00\x00\x00\x00' + b'\x04\x00\x0f\x00\x13\x8a\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x0f\x00\x01\x00\n\x00\xd4\x00\x19\x06EL3164\x05AnaIn Analo' + b'ge Eingangsklemmen (EL3xxx)\x1dEL3164 4K. Ana. Eingang 0-10' + b'V\x08Synchron\x02DC\x04DCIN\x15AI Standard Channel 1\x12Sta' + b'tus__Underrange\x11Status__Overrange\x0fStatus__Limit ' + b'1\x0fStatus__Limit 2\rStatus__Error\x08Status__\x12Status_' + b'_Sync error\x13Status__TxPDO State\x14Status__TxPDO Toggle' + b'\x05Value\x14AI Compact Channel 1\x15AI Standard Channel ' + b'2\x14AI Compact Channel 2\x15AI Standard Channel 3\x14AI ' + b'Compact Channel 3\x15AI Standard Channel 4\x14AI Compact C' + b'hannel 4\x1e\x00\x10\x00\x02\x00\x01\x04\x0c\x07\x01\x00' + b'\x00\x00\x00\x04\x82\x00\x03\x003\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'(\x00\x01\x00\x02\x03)\x00\x10\x00\x00\x10\x80\x00&\x00' + b'\x01\x01\x80\x10\x80\x00"\x00\x01\x02\x00\x11' + b'\x00\x00\x04\x00\x00\x03\x80\x11\x10\x00 \x00\x01\x042\x00' + b'\xe0\x00\x00\x1a\x0b\x03\x00\x08\x10\x00\x00`\x01\t\x01\x01' + b'\x00\x00\x00`\x02\n\x01\x01\x00\x00\x00`\x03\x0b1\x02' + b'\x00\x00\x00`\x05\x0c1\x02\x00\x00\x00`\x07\r\x01\x01' + b'\x00\x00\x00\x00\x00\x0e\x00\x01\x00\x00\x00\x00' + b'\x00\x0e\x00\x05\x00\x00\x00`\x0e\x0f\x01\x01\x00\x00\x00`' + b'\x0f\x10\x01\x01\x00\x00\x00`\x10\x11\x01\x01\x00\x00\x00`' + b'\x11\x12\x03\x10\x00\x00\x01\x1a\x01\xff\x00\x13' + b'\x10\x00\x00`\x11\x12\x03\x10\x00\x00\x02\x1a' + b'\x0b\x03\x00\x14\x10\x00\x10`\x01\t\x01\x01\x00\x00\x10`' + b'\x02\n\x01\x01\x00\x00\x10`\x03\x0b1\x02\x00\x00\x10`' + b'\x05\x0c1\x02\x00\x00\x10`\x07\r\x01\x01\x00\x00\x00\x00' + b'\x00\x0e\x00\x01\x00\x00\x00\x00\x00\x0e\x00\x05' + b'\x00\x00\x10`\x0e\x0f\x01\x01\x00\x00\x10`\x0f\x10\x01\x01' + b'\x00\x00\x10`\x10\x11\x01\x01\x00\x00\x10`\x11\x12\x03\x10' + b'\x00\x00\x03\x1a\x01\xff\x00\x15\x10\x00\x10`' + b'\x11\x12\x03\x10\x00\x00\x04\x1a\x0b\x03\x00\x16\x10\x00 `' + b'\x01\t\x01\x01\x00\x00 `\x02\n\x01\x01\x00\x00 `' + b'\x03\x0b1\x02\x00\x00 `\x05\x0c1\x02\x00\x00 `' + b'\x07\r\x01\x01\x00\x00\x00\x00\x00\x0e\x00\x01' + b'\x00\x00\x00\x00\x00\x0e\x00\x05\x00\x00 `\x0e\x0f\x01\x01' + b'\x00\x00 `\x0f\x10\x01\x01\x00\x00 `\x10\x11\x01\x01' + b'\x00\x00 `\x11\x12\x03\x10\x00\x00\x05\x1a\x01\xff\x00\x17' + b'\x10\x00 `\x11\x12\x03\x10\x00\x00\x06\x1a\x0b\x03\x00\x18' + b'\x10\x000`\x01\t\x01\x01\x00\x000`\x02\n\x01\x01\x00\x000`' + b'\x03\x0b1\x02\x00\x000`\x05\x0c1\x02\x00\x000`' + b'\x07\r\x01\x01\x00\x00\x00\x00\x00\x0e\x00\x01' + b'\x00\x00\x00\x00\x00\x0e\x00\x05\x00\x000`\x0e\x0f\x01\x01' + b'\x00\x000`\x0f\x10\x01\x01\x00\x000`\x10\x11\x01\x01' + b'\x00\x000`\x11\x12\x03\x10\x00\x00\x07\x1a\x01\xff\x00\x19' + b'\x10\x000`\x11\x12\x03\x10\x00\x00<\x00$\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\xa8a\x00\x00\x00\x00' + b'\x00\x07\x01\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00`y' + b'\xfe\xff\xa8a\x00\x00\x00\x00\x00\x07\x01\x00' + b'\x07\x00\x00\x00\x00\x00', + 'sdo': { (4096, 0): b'\x89\x13,\x01', + (4104, 0): b'EL3164', + (4105, 0): b'15', + (4106, 0): b'04', + (4113, 1): b'\x00\x00\x00\x00', + (4120, 1): b'\x02\x00\x00\x00', + (4120, 2): b'R0\\\x0c', + (4120, 3): b'\x00\x00\x14\x00', + (4120, 4): b'\x00\x00\x00\x00', + (4336, 1): b'\x83\xb6\x00\x00', + (6144, 6): b'\x01\x1a', + (6145, 6): b'\x00\x1a', + (6146, 6): b'\x03\x1a', + (6147, 6): b'\x02\x1a', + (6148, 6): b'\x05\x1a', + (6149, 6): b'\x04\x1a', + (6150, 6): b'\x07\x1a', + (6151, 6): b'\x06\x1a', + (6656, 1): b'\x01\x01\x00`', + (6656, 2): b'\x01\x02\x00`', + (6656, 3): b'\x02\x03\x00`', + (6656, 4): b'\x02\x05\x00`', + (6656, 5): b'\x01\x07\x00`', + (6656, 6): b'\x01\x00\x00\x00', + (6656, 7): b'\x05\x00\x00\x00', + (6656, 8): b'\x01\x0e\x00`', + (6656, 9): b'\x01\x0f\x00`', + (6656, 10): b'\x01\x10\x00`', + (6656, 11): b'\x10\x11\x00`', + (6657, 1): b'\x10\x11\x00`', + (6658, 1): b'\x01\x01\x10`', + (6658, 2): b'\x01\x02\x10`', + (6658, 3): b'\x02\x03\x10`', + (6658, 4): b'\x02\x05\x10`', + (6658, 5): b'\x01\x07\x10`', + (6658, 6): b'\x01\x00\x00\x00', + (6658, 7): b'\x05\x00\x00\x00', + (6658, 8): b'\x01\x0e\x10`', + (6658, 9): b'\x01\x0f\x10`', + (6658, 10): b'\x01\x10\x10`', + (6658, 11): b'\x10\x11\x10`', + (6659, 1): b'\x10\x11\x10`', + (6660, 1): b'\x01\x01 `', + (6660, 2): b'\x01\x02 `', + (6660, 3): b'\x02\x03 `', + (6660, 4): b'\x02\x05 `', + (6660, 5): b'\x01\x07 `', + (6660, 6): b'\x01\x00\x00\x00', + (6660, 7): b'\x05\x00\x00\x00', + (6660, 8): b'\x01\x0e `', + (6660, 9): b'\x01\x0f `', + (6660, 10): b'\x01\x10 `', + (6660, 11): b'\x10\x11 `', + (6661, 1): b'\x10\x11 `', + (6662, 1): b'\x01\x010`', + (6662, 2): b'\x01\x020`', + (6662, 3): b'\x02\x030`', + (6662, 4): b'\x02\x050`', + (6662, 5): b'\x01\x070`', + (6662, 6): b'\x01\x00\x00\x00', + (6662, 7): b'\x05\x00\x00\x00', + (6662, 8): b'\x01\x0e0`', + (6662, 9): b'\x01\x0f0`', + (6662, 10): b'\x01\x100`', + (6662, 11): b'\x10\x110`', + (6663, 1): b'\x10\x110`', + (7168, 1): b'\x01', + (7168, 2): b'\x02', + (7168, 3): b'\x03', + (7168, 4): b'\x04', + (7186, 0): b'\x00', + (7187, 1): b'\x00\x1a', + (7187, 2): b'\x02\x1a', + (7187, 3): b'\x04\x1a', + (7187, 4): b'\x06\x1a', + (7219, 1): b'\x01\x00', + (7219, 2): b'@B\x0f\x00', + (7219, 3): b'\x90_\x01\x00', + (7219, 4): b'\x0b\xd0', + (7219, 5): b'\xa0\x86\x01\x00', + (7219, 6): b"\x10'\x00\x00", + (7219, 7): b'\x00\x00\x00\x00', + (7219, 8): b'\x00\x00', + (7219, 9): b'\xa0\x86\x01\x00', + (7219, 11): b'\x00\x00', + (7219, 12): b'\x00\x00', + (7219, 13): b'\x00\x00', + (7219, 32): b'\x00', + (24576, 1): b'\x00', + (24576, 2): b'\x00', + (24576, 3): b'\x00', + (24576, 5): b'\x00', + (24576, 7): b'\x00', + (24576, 14): b'\x00', + (24576, 15): b'\x00', + (24576, 16): b'\x00', + (24576, 17): b'\x00\x00', + (24592, 1): b'\x00', + (24592, 2): b'\x00', + (24592, 3): b'\x00', + (24592, 5): b'\x00', + (24592, 7): b'\x00', + (24592, 14): b'\x00', + (24592, 15): b'\x00', + (24592, 16): b'\x00', + (24592, 17): b'\x00\x00', + (24608, 1): b'\x00', + (24608, 2): b'\x00', + (24608, 3): b'\x00', + (24608, 5): b'\x00', + (24608, 7): b'\x00', + (24608, 14): b'\x00', + (24608, 15): b'\x00', + (24608, 16): b'\x00', + (24608, 17): b'\x00\x00', + (24624, 1): b'\x00', + (24624, 2): b'\x00', + (24624, 3): b'\x00', + (24624, 5): b'\x00', + (24624, 7): b'\x00', + (24624, 14): b'\x00', + (24624, 15): b'\x00', + (24624, 16): b'\x00', + (24624, 17): b'\x00\x00', + (32768, 1): b'\x00', + (32768, 2): b'\x00', + (32768, 5): b'\x00', + (32768, 6): b'\x00', + (32768, 7): b'\x00', + (32768, 8): b'\x00', + (32768, 10): b'\x00', + (32768, 11): b'\x01', + (32768, 14): b'\x00', + (32768, 17): b'\x00\x00', + (32768, 18): b'a\x1e\x00\x00', + (32768, 19): b'\x00\x00', + (32768, 20): b'\x00\x00', + (32768, 21): b'\x00\x00', + (32768, 23): b'\x00\x00', + (32768, 24): b'\x00@', + (32782, 1): b'\xe5\xff', + (32783, 1): b'\x00\x00', + (32783, 2): b'CI', + (32784, 1): b'\x00', + (32784, 2): b'\x00', + (32784, 5): b'\x00', + (32784, 6): b'\x00', + (32784, 7): b'\x00', + (32784, 8): b'\x00', + (32784, 10): b'\x00', + (32784, 11): b'\x01', + (32784, 14): b'\x00', + (32784, 17): b'\x00\x00', + (32784, 18): b'\x00\x00\x01\x00', + (32784, 19): b'\x00\x00', + (32784, 20): b'\x00\x00', + (32784, 21): b'\x00\x00', + (32784, 23): b'\x00\x00', + (32784, 24): b'\x00@', + (32798, 1): b'\x01\x00', + (32799, 1): b'\x19\x00', + (32799, 2): b'OI', + (32800, 1): b'\x00', + (32800, 2): b'\x00', + (32800, 5): b'\x00', + (32800, 6): b'\x00', + (32800, 7): b'\x00', + (32800, 8): b'\x00', + (32800, 10): b'\x00', + (32800, 11): b'\x01', + (32800, 14): b'\x00', + (32800, 17): b'\x00\x00', + (32800, 18): b'\x00\x00\x01\x00', + (32800, 19): b'\x00\x00', + (32800, 20): b'\x00\x00', + (32800, 21): b'\x00\x00', + (32800, 23): b'\x00\x00', + (32800, 24): b'\x00@', + (32814, 1): b'\x08\x00', + (32815, 1): b'\t\x00', + (32815, 2): b'\xaaH', + (32816, 1): b'\x00', + (32816, 2): b'\x00', + (32816, 5): b'\x00', + (32816, 6): b'\x00', + (32816, 7): b'\x00', + (32816, 8): b'\x00', + (32816, 10): b'\x00', + (32816, 11): b'\x01', + (32816, 14): b'\x00', + (32816, 17): b'\x00\x00', + (32816, 18): b'\x00\x00\x01\x00', + (32816, 19): b'\x00\x00', + (32816, 20): b'\x00\x00', + (32816, 21): b'\x00\x00', + (32816, 23): b'\x00\x00', + (32816, 24): b'\x00@', + (32830, 1): b'\xfa\xff', + (32831, 1): b'\x03\x00', + (32831, 2): b'1I', + (61440, 1): b'\x10\x00', + (61440, 2): b'\x04\x00', + (61448, 0): b'\x00\x00\x00\x00', + (61449, 0): b'\x00\x00\x00\x00', + (61456, 1): b',\x01\x00\x00', + (61456, 2): b',\x01\x00\x00', + (61456, 3): b',\x01\x00\x00', + (61456, 4): b',\x01\x00\x00'}}, + { 'eeprom': b'\x05\x0c\x03\x88\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x18\x00\x02\x00\x00\x00R0\x08\x10\x00\x00\xfc\x03' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x10\xf4\x00\xf4\x10\xf4\x00\x00\x10\x80\x00' + b'\x80\x10\x80\x00\x0c\x00\x00\x00\x00\x00\x00\x00' + b'\x03\x00\n\x00\x93\xc1\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x0f\x00\x01\x00\n\x00`\x00\x0b\x06EL4104\x06AnaOut Anal' + b'oge Ausgangsklemmen (EL4xxx)%EL4104 4Ch. Ana. Ausgang 0-' + b'10V, 16bit\x08Synchron\x02DC\x13AO Output Channel 1\rAnalo' + b'g output\x13AO Output Channel 2\x13AO Output Channel 3' + b'\x13AO Output Channel 4\x1e\x00\x10\x00\x02\x00\x01\x04' + b'\x0c\x03\x01\x00\x00\x00\x00\x04\xbe\x00\x03\x00' + b'3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00(\x00\x01\x00\x01\x03)\x00\x10\x00\x00\x10' + b'\x80\x00&\x00\x01\x01\x80\x10\x80\x00"\x00\x01\x02\x00\x11' + b'\x08\x00$\x00\x01\x03\x80\x11\x00\x00\x00\x00\x00\x043\x00' + b' \x00\x00\x16\x01\x02\x00\x07\x11\x00\x00p\x11\x08\x03\x10' + b'\x00\x00\x01\x16\x01\x02\x00\t\x11\x00\x10p\x11\x08\x03\x10' + b'\x00\x00\x02\x16\x01\x02\x00\n\x11\x00 p\x11\x08\x03\x10' + b'\x00\x00\x03\x16\x01\x02\x00\x0b\x11\x000p\x11\x08\x03\x10' + b'\x00\x00<\x00\x18\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\xa0\x86\x01\x00\x00\x00\x00\x07\x01\x00' + b'\x06\x00\x00\x00\x00\x00', + 'sdo': { (4096, 0): b'\x89\x13\x90\x01', + (4104, 0): b'EL4104', + (4105, 0): b'10', + (4106, 0): b'03', + (4113, 1): b'\x00\x00\x00\x00', + (4120, 1): b'\x02\x00\x00\x00', + (4120, 2): b'R0\x08\x10', + (4120, 3): b'\x00\x00\xfc\x03', + (4120, 4): b'\x00\x00\x00\x00', + (4336, 1): b'/\xb8\x00\x00', + (5632, 1): b'\x10\x01\x00p', + (5633, 1): b'\x10\x01\x10p', + (5634, 1): b'\x10\x01 p', + (5635, 1): b'\x10\x010p', + (7168, 1): b'\x01', + (7168, 2): b'\x02', + (7168, 3): b'\x03', + (7168, 4): b'\x04', + (7186, 1): b'\x00\x16', + (7186, 2): b'\x01\x16', + (7186, 3): b'\x02\x16', + (7186, 4): b'\x03\x16', + (7187, 0): b'\x00', + (7218, 1): b'\x01\x00', + (7218, 2): b'\x00\x00\x00\x00', + (7218, 3): b'\x00\x00\x00\x00', + (7218, 4): b'\x0b\xc0', + (7218, 5): b'\x00\x00\x00\x00', + (7218, 6): b'\x00\x00\x00\x00', + (7218, 7): b'\x00\x00\x00\x00', + (7218, 8): b'\x00\x00', + (7218, 9): b'\x00\x00\x00\x00', + (7218, 11): b'\x00\x00', + (7218, 12): b'\x00\x00', + (7218, 13): b'\x00\x00', + (7218, 32): b'\x00', + (28672, 1): b'`\t', + (28688, 1): b'\x00\x00', + (28704, 1): b'\x00\x00', + (28720, 1): b'\x00\x00', + (32768, 1): b'\x00', + (32768, 2): b'\x00', + (32768, 5): b'\x00', + (32768, 7): b'\x00', + (32768, 8): b'\x01', + (32768, 17): b'd\x00', + (32768, 18): b'P\xc3\x00\x00', + (32768, 19): b'\x00\x00', + (32768, 20): b'\xff\xff', + (32768, 21): b'\x00\x00', + (32768, 22): b'\xff\xff', + (32782, 1): b'\x0e\x00', + (32783, 1): b'\x0e\x00', + (32783, 2): b'\x04\xed', + (32784, 1): b'\x00', + (32784, 2): b'\x00', + (32784, 5): b'\x00', + (32784, 7): b'\x01', + (32784, 8): b'\x01', + (32784, 17): b'\x00\x00', + (32784, 18): b'\x00\x00\x01\x00', + (32784, 19): b'\x00\x00', + (32784, 20): b'\xff\xff', + (32784, 21): b'\x00\x00', + (32784, 22): b'\xff\xff', + (32798, 1): b'\xfc\xff', + (32799, 1): b'\xfc\xff', + (32799, 2): b'j\xec', + (32800, 1): b'\x00', + (32800, 2): b'\x00', + (32800, 5): b'\x00', + (32800, 7): b'\x00', + (32800, 8): b'\x01', + (32800, 17): b'\x00\x00', + (32800, 18): b'\x00\x00\x01\x00', + (32800, 19): b'\x00\x00', + (32800, 20): b'\xff\xff', + (32800, 21): b'\x00\x00', + (32800, 22): b'\xff\xff', + (32814, 1): b'\x06\x00', + (32815, 1): b'\x06\x00', + (32815, 2): b'\xfe\xec', + (32816, 1): b'\x00', + (32816, 2): b'\x00', + (32816, 5): b'\x00', + (32816, 7): b'\x00', + (32816, 8): b'\x01', + (32816, 17): b'\x00\x00', + (32816, 18): b'\x90\x01\x00\x00', + (32816, 19): b'\x00\x00', + (32816, 20): b'\xff\xff', + (32816, 21): b'\x00\x00', + (32816, 22): b'\xff\xff', + (32830, 1): b'\xfc\xff', + (32831, 1): b'\xfc\xff', + (32831, 2): b'w\xee', + (61440, 1): b'\x10\x00', + (61440, 2): b'\x04\x00', + (61448, 0): b'\x00\x00\x00\x00', + (61456, 1): b'\x90\x01\x00\x00', + (61456, 2): b'\x90\x01\x00\x00', + (61456, 3): b'\x90\x01\x00\x00', + (61456, 4): b'\x90\x01\x00\x00'}}, + { 'eeprom': b'\x05\x04\x03\x0c\xd0\x07\x00\x00\x00\x00\x00\x00' + b'\x00\x00E\x00\x02\x00\x00\x00R0w\x1b\x00\x00\x17\x00' + b'\x99\x84\x1a\xeb\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x10\xf4\x00\xf4\x10\xf4\x00\x00\x10\x80\x00' + b'\x80\x10\x80\x00\x0c\x00\x00\x00\x00\x00\x00\x00' + b'\x0b\x00\x08\x00\x0fQ\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x0f\x00\x01\x00\n\x00<\x00\x06\x06EL7031\x12DriveAxisTe' + b'rminals"Antriebs- und Achsklemmen (EL7xxx),EL7031 1K. Sc' + b'hrittmotor-Endstufe (24V, 1.5A)\x08Synchron\x02DC\xff' + b"\x1e\x00\x10\x00\x02\x00\x01\x04\x0c'\x01\x00" + b'\x00\x00\x00\x04x\x00\x03\x003\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x02\x00' + b'\x01\x02\x03\xff)\x00\x10\x00\x00\x10\x80\x00&\x00\x01\x01' + b'\x80\x10\x80\x00"\x00\x01\x02\x00\x11\x08\x00$\x00\x01\x03' + b'\x80\x11\x08\x00 \x00\x01\x04<\x00\x18\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03' + b'\x01\x00\x06\x00\x00\x00\x00\x00', + 'sdo': { (4096, 0): b'\x89\x13\x00\x00', + (4104, 0): b'EL7031', + (4105, 0): b'08', + (4106, 0): b'11', + (4113, 1): b'\x00\x00\x00\x00', + (4120, 1): b'\x02\x00\x00\x00', + (4120, 2): b'R0w\x1b', + (4120, 3): b'\x00\x00\x17\x00', + (4120, 4): b'\xca8\x00\x00', + (4336, 1): b'.\xe3\x00\x00', + (4339, 1): b'2', + (4339, 2): b'2', + (4339, 3): b'\x00', + (4339, 4): b'\x01', + (4339, 5): b'\x00\x00', + (4339, 6): b"\x00\xe0w\x1b\x10\x005\x11\x80\x91\x9b'" + b'\xf7c\x02\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 7): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc09#\x1a' + b'AR\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 8): b'\x00\xe0w\x1b\x10\x005\x11\x00\xc4\x1a\x1c' + b'AR\x03\x00\x06\x00\xe8\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 9): b'\x00\xe0w\x1b\x10\x00\x00\x11@\xaeQ\xc1' + b'\x0bY\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 10): b'\x00\xe0w\x1b\x10\x005\x11\x808I\xc3' + b'\x0bY\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 11): b'\x00\xe0w\x1b\x10\x00\x00\x11@y\xda\xb9' + b'_Y\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 12): b'\x00\xe0w\x1b\x10\x005\x11\x80\x03\xd2\xbb' + b'_Y\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 13): b'\x00\xe0w\x1b\x10\x00\x00\x11@2\xdb\x81' + b'oY\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 14): b'\x00\xe0w\x1b\x10\x005\x11\x80\xbc\xd2\x83' + b'oY\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 15): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0\xad\x8b\xfd' + b'tY\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 16): b'\x00\xe0w\x1b\x10\x005\x11\x008\x83\xff' + b'tY\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 17): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0|\x07\x0c' + b'\xb2Y\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 18): b'\x00\xe0w\x1b\x10\x005\x11\x00\x07\xff\r' + b'\xb2Y\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 19): b'\x00\xe0w\x1b\x10\x00\x00\x11@k\x80\x12' + b'\xc4Y\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 20): b'\x00\xe0w\x1b\x10\x005\x11\xc07\x87\x14' + b'\xc4Y\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 21): b'\x00\xe0w\x1b\x10\x00\x00\x11\x00/ \xef' + b'\xd2Y\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 22): b'\x00\xe0w\x1b\x10\x005\x11@\xb9\x17\xf1' + b'\xd2Y\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 23): b'\x00\xe0w\x1b\x10\x00\x00\x11@\xc93\xe9' + b'\xe5Y\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 24): b'\x00\xe0w\x1b\x10\x005\x11\x80S+\xeb' + b'\xe5Y\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 25): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0\xb6\x14K' + b'\xeaY\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 26): b'\x00\xe0w\x1b\x10\x005\x11\x00A\x0cM' + b'\xeaY\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 27): b'\x00\xe0w\x1b\x10\x00\x00\x11@"gg\xefY\x03\x00' + b'\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 28): b'\x00\xe0w\x1b\x10\x005\x11\x80\xac^i' + b'\xefY\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 29): b'\x00\xe0w\x1b\x10\x00\x00\x11\x00V~q' + b'\x88\xa6\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 30): b'\x00\xe0w\x1b\x10\x005\x11@\xe0us' + b'\x88\xa6\x03\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 31): b'\x00\xe0w\x1b\x10\x00\x00\x11\x00%fS' + b'\x8b\xa6\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 32): b'\x00\xe0w\x1b\x10\x005\x11@\xaf]U' + b'\x8b\xa6\x03\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 33): b'\x00\xe0w\x1b\x10\x00\x00\x11\x00.\xa4\xea' + b'\x98\xa6\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 34): b'\x00\xe0w\x1b\x10\x005\x11@\xb8\x9b\xec' + b'\x98\xa6\x03\x00\x06\x00\xe8\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 35): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0\x8aFi' + b'\xc9\xa6\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 36): b'\x00\xe0w\x1b\x10\x005\x11@WMk\xc9\xa6\x03\x00' + b'\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 37): b'\x00\xe0w\x1b\x10\x00\x00\x11\x80RF\xcf' + b'\xd1\xa6\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 38): b'\x00\xe0w\x1b\x10\x005\x11\x00\x1fM\xd1' + b'\xd1\xa6\x03\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 39): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0*\xeb|' + b'\xda\xa6\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 40): b'\x00\xe0w\x1b\x10\x005\x11\x00\xb5\xe2~' + b'\xda\xa6\x03\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 41): b"\x00\xe0w\x1b\x10\x00\x00\x11\x00'\xc72" + b'\x1b\xa7\x03\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 42): b'\x00\xe0w\x1b\x10\x005\x11@\xb1\xbe4' + b'\x1b\xa7\x03\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 43): b'\x00\xe0w\x1b\x10\x00\x00\x11\x80\xd5e\xb3' + b'6\xa7\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 44): b'\x00\xe0w\x1b\x10\x005\x11\xc0_]\xb5' + b'6\xa7\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 45): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0\xf2Zk' + b'@\xa7\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 46): b'\x00\xe0w\x1b\x10\x005\x11@\xbfam@\xa7\x03\x00' + b'\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 47): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0\x8d\x85\xa7' + b'M\xa7\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 48): b'\x00\xe0w\x1b\x10\x005\x11\x00\x18}\xa9' + b'M\xa7\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 49): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0\xf7\x9b\x18' + b'W\xa7\x03\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 50): b'\x00\xe0w\x1b\x10\x005\x11\x00\x82\x93\x1a' + b'W\xa7\x03\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 51): b'\x00\xe0w\x1b\x10\x00\x00\x11\xc0L\xd6\xd0' + b'\xcd\x1c\x02\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 52): b'\x00\xe0w\x1b\x10\x005\x11\x00\xd7\xcd\xd2' + b'\xcd\x1c\x02\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 53): b'\x00\xe0w\x1b\x10\x00\x00\x11\x80\x05\xd6\xc3' + b'%\x1d\x02\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 54): b'\x00\xe0w\x1b\x10\x005\x11\xc0\x8f\xcd\xc5' + b'%\x1d\x02\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 55): b'\x00\xe0w\x1b\x10\x00\x00\x11@\x07\xa4%' + b'\xf7c\x02\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4344, 0): b'@\x0e\xc2tW\xa7\x03\x00', + (5120, 6): b'\x01\x16\x00\x00\x00\x00', + (5121, 6): b'\x00\x16\x00\x00\x00\x00', + (5123, 6): b'\x04\x16\x05\x16\x06\x16', + (5124, 6): b'\x03\x16\x05\x16\x06\x16', + (5125, 6): b'\x03\x16\x04\x16\x06\x16', + (5126, 6): b'\x03\x16\x04\x16\x05\x16', + (5632, 1): b'\x01\x00\x00\x00', + (5632, 2): b'\x01\x02\x00p', + (5632, 3): b'\x01\x03\x00p', + (5632, 4): b'\x01\x04\x00p', + (5632, 5): b'\x04\x00\x00\x00', + (5632, 6): b'\x08\x00\x00\x00', + (5632, 7): b'\x10\x11\x00p', + (5633, 1): b'\x01\x00\x00\x00', + (5633, 2): b'\x01\x02\x00p', + (5633, 3): b'\x01\x03\x00p', + (5633, 4): b'\x01\x04\x00p', + (5633, 5): b'\x04\x00\x00\x00', + (5633, 6): b'\x08\x00\x00\x00', + (5633, 7): b' \x11\x00p', + (5634, 1): b'\x01\x01\x10p', + (5634, 2): b'\x01\x02\x10p', + (5634, 3): b'\x01\x03\x10p', + (5634, 4): b'\x05\x00\x00\x00', + (5634, 5): b'\x08\x00\x00\x00', + (5635, 1): b' \x11\x10p', + (5636, 1): b'\x10!\x10p', + (5637, 1): b'\x01\x01 p', + (5637, 2): b'\x01\x02 p', + (5637, 3): b'\x06\x00\x00\x00', + (5637, 4): b'\x08\x00\x00\x00', + (5637, 5): b' \x11 p', + (5638, 1): b'\x01\x01 p', + (5638, 2): b'\x01\x02 p', + (5638, 3): b'\x06\x00\x00\x00', + (5638, 4): b'\x08\x00\x00\x00', + (5638, 5): b' \x11 p', + (5638, 6): b'\x10! p', + (5638, 7): b'\x10" p', + (5638, 8): b'\x10# p', + (5638, 9): b'\x10$ p', + (6144, 6): b'\x01\x1a', + (6145, 6): b'\x00\x1a', + (6149, 6): b'\x06\x1a', + (6150, 6): b'\x05\x1a', + (6656, 1): b'\x01\x00\x00\x00', + (6656, 2): b'\x01\x02\x00`', + (6656, 3): b'\x01\x03\x00`', + (6656, 4): b'\x01\x04\x00`', + (6656, 5): b'\x01\x05\x00`', + (6656, 6): b'\x03\x00\x00\x00', + (6656, 7): b'\x04\x00\x00\x00', + (6656, 8): b'\x01\r\x00`', + (6656, 9): b'\x01\x0e\x00`', + (6656, 10): b'\x01\x00\x00\x00', + (6656, 11): b'\x01\x10\x00`', + (6656, 12): b'\x10\x11\x00`', + (6656, 13): b'\x10\x12\x00`', + (6657, 1): b'\x01\x00\x00\x00', + (6657, 2): b'\x01\x02\x00`', + (6657, 3): b'\x01\x03\x00`', + (6657, 4): b'\x01\x04\x00`', + (6657, 5): b'\x01\x05\x00`', + (6657, 6): b'\x03\x00\x00\x00', + (6657, 7): b'\x04\x00\x00\x00', + (6657, 8): b'\x01\r\x00`', + (6657, 9): b'\x01\x0e\x00`', + (6657, 10): b'\x01\x00\x00\x00', + (6657, 11): b'\x01\x10\x00`', + (6657, 12): b' \x11\x00`', + (6657, 13): b' \x12\x00`', + (6658, 1): b' \x16\x00`', + (6659, 1): b'\x01\x01\x10`', + (6659, 2): b'\x01\x02\x10`', + (6659, 3): b'\x01\x03\x10`', + (6659, 4): b'\x01\x04\x10`', + (6659, 5): b'\x01\x05\x10`', + (6659, 6): b'\x01\x06\x10`', + (6659, 7): b'\x01\x07\x10`', + (6659, 8): b'\x01\x00\x00\x00', + (6659, 9): b'\x03\x00\x00\x00', + (6659, 10): b'\x01\x0c\x10`', + (6659, 11): b'\x01\r\x10`', + (6659, 12): b'\x01\x0e\x10`', + (6659, 13): b'\x01\x00\x00\x00', + (6659, 14): b'\x01\x10\x10`', + (6660, 1): b'\x10\x11\x10`', + (6660, 2): b'\x10\x12\x10`', + (6661, 1): b'\x01\x01 `', + (6661, 2): b'\x01\x02 `', + (6661, 3): b'\x01\x03 `', + (6661, 4): b'\x01\x04 `', + (6661, 5): b'\x01\x05 `', + (6661, 6): b'\x01\x06 `', + (6661, 7): b'\x01\x07 `', + (6661, 8): b'\x01\x00\x00\x00', + (6661, 9): b'\x08\x00\x00\x00', + (6662, 1): b'\x01\x01 `', + (6662, 2): b'\x01\x02 `', + (6662, 3): b'\x01\x03 `', + (6662, 4): b'\x01\x04 `', + (6662, 5): b'\x01\x05 `', + (6662, 6): b'\x01\x06 `', + (6662, 7): b'\x01\x07 `', + (6662, 8): b'\x01\x00\x00\x00', + (6662, 9): b'\x08\x00\x00\x00', + (6662, 10): b' \x11 `', + (6662, 11): b'\x10! `', + (6662, 12): b' " `', + (7168, 1): b'\x01', + (7168, 2): b'\x02', + (7168, 3): b'\x03', + (7168, 4): b'\x04', + (7186, 1): b'\x00\x16', + (7186, 2): b'\x02\x16', + (7186, 3): b'\x04\x16', + (7187, 1): b'\x00\x1a', + (7187, 2): b'\x03\x1a', + (7187, 3): b'\x00\x00', + (7187, 4): b'\x00\x00', + (7187, 5): b'\x00\x00', + (7218, 1): b'\x01\x00', + (7218, 2): b'@B\x0f\x00', + (7218, 3): b'\x00\x00\x00\x00', + (7218, 4): b'\x07\x08', + (7218, 5): b'\x90\xd0\x03\x00', + (7218, 6): b'\x00\x00\x00\x00', + (7218, 7): b'\x00\x00\x00\x00', + (7218, 8): b'\x00\x00', + (7218, 9): b'\x00\x00\x00\x00', + (7218, 11): b'\x00\x00', + (7218, 12): b'\x00\x00', + (7218, 13): b'\x00\x00', + (7218, 32): b'\x00', + (7219, 1): b'"\x00', + (7219, 2): b'@B\x0f\x00', + (7219, 3): b'\x00\x00\x00\x00', + (7219, 4): b'\x07\x08', + (7219, 5): b'\x90\xd0\x03\x00', + (7219, 6): b'\x90\xd0\x03\x00', + (7219, 7): b'\x00\x00\x00\x00', + (7219, 8): b'\x00\x00', + (7219, 9): b'\x00\x00\x00\x00', + (7219, 11): b'\x00\x00', + (7219, 12): b'\x00\x00', + (7219, 13): b'\x00\x00', + (7219, 32): b'\x00', + (24576, 2): b'\x00', + (24576, 3): b'\x00', + (24576, 4): b'\x00', + (24576, 5): b'\x00', + (24576, 13): b'\x00', + (24576, 14): b'\x00', + (24576, 16): b'\x01', + (24576, 17): b'\x00\x00\x00\x00', + (24576, 18): b'\x00\x00\x00\x00', + (24576, 22): b'\x00\x00\x00\x00', + (24592, 1): b'\x00', + (24592, 2): b'\x00', + (24592, 3): b'\x00', + (24592, 4): b'\x01', + (24592, 5): b'\x00', + (24592, 6): b'\x00', + (24592, 7): b'\x00', + (24592, 12): b'\x00', + (24592, 13): b'\x00', + (24592, 14): b'\x00', + (24592, 16): b'\x00', + (24592, 17): b'\x00\x00', + (24592, 18): b'\x00\x00', + (24608, 1): b'\x00', + (24608, 2): b'\x00', + (24608, 3): b'\x01', + (24608, 4): b'\x00', + (24608, 5): b'\x00', + (24608, 6): b'\x00', + (24608, 7): b'\x00', + (24608, 17): b'\x00\x00\x00\x00', + (24608, 33): b'\x00\x00', + (24608, 34): b'\x00\x00\x00\x00', + (28672, 2): b'\x00', + (28672, 3): b'\x00', + (28672, 4): b'\x00', + (28672, 17): b'\x00\x00\x00\x00', + (28688, 1): b'\x00', + (28688, 2): b'\x00', + (28688, 3): b'\x00', + (28688, 17): b'\x00\x00\x00\x00', + (28688, 33): b'\x00\x00', + (28704, 1): b'\x00', + (28704, 2): b'\x00', + (28704, 17): b'\x00\x00\x00\x00', + (28704, 33): b'\x00\x00', + (28704, 34): b'\x00\x00', + (28704, 35): b'\x00\x00', + (28704, 36): b'\x00\x00', + (32768, 14): b'\x00', + (32784, 1): b'\xdc\x05', + (32784, 2): b'\xf4\x01', + (32784, 3): b'\xc0]', + (32784, 4): b'd\x00', + (32784, 5): b'\x00\x00', + (32784, 6): b'\xc8\x00', + (32784, 9): b'\x00\x00', + (32784, 16): b'd\x00', + (32784, 17): b'\x96\x00', + (32785, 1): b'\x90\x01', + (32785, 2): b'\x04\x00', + (32785, 3): b'\x00', + (32785, 5): b'\x00', + (32785, 6): b'\x00\x00', + (32785, 7): b'd\x00', + (32785, 8): b'd\x00', + (32786, 1): b'\x00', + (32786, 5): b'\x01', + (32786, 9): b'\x00', + (32786, 17): b'\x03', + (32786, 25): b'\x04', + (32786, 48): b'\x00', + (32786, 49): b'\x00', + (32786, 50): b'\x02', + (32786, 54): b'\x02', + (32787, 1): b'\xe8\x03', + (32787, 2): b'\x00\x00', + (32787, 3): b'\x00', + (32787, 5): b'\x00', + (32787, 6): b'\x00\x00', + (32787, 7): b'\x00\x00', + (32787, 8): b'\x00\x00', + (32800, 1): b'd\x00', + (32800, 2): b"\x10'", + (32800, 3): b'\xe8\x03', + (32800, 4): b'\xe8\x03', + (32800, 5): b'\xe8\x03', + (32800, 6): b'\xe8\x03', + (32800, 7): b'd\x00', + (32800, 8): b'\x00\x00\x00\x00', + (32800, 9): b'd\x00', + (32800, 10): b'\n\x00', + (32800, 11): b'\n\x00', + (32800, 12): b'\xe8\x03', + (32800, 13): b'2\x00', + (32800, 14): b'\x00\x00\x00\x00', + (32800, 15): b'\x00\x00\x00\x00', + (32800, 16): b'\x00\x00', + (32801, 1): b'\x01\x00', + (32801, 17): b'\x00', + (32801, 19): b'\x01', + (32801, 20): b'\x00', + (32801, 21): b'\x00', + (32801, 22): b'\x00', + (36880, 1): b'\x00', + (36880, 2): b'\x00', + (36880, 3): b'\x00', + (36880, 4): b'\x00', + (36880, 5): b'\x00', + (36880, 6): b'\x00', + (36880, 7): b'\x00', + (36880, 8): b'\x00', + (36880, 9): b'\x00', + (36880, 19): b'\x00', + (36896, 1): b'\x00\x00', + (36896, 3): b'\x00\x00', + (36896, 4): b'\x00\x00\x00\x00', + (40976, 1): b'\x00', + (40976, 2): b'\x00', + (40976, 3): b'\x00', + (40976, 4): b'\x00', + (40976, 5): b'\x00', + (40976, 6): b'\x00', + (40976, 7): b'\x00', + (40976, 8): b'\x01', + (40976, 9): b'\x01', + (40976, 10): b'\x00', + (40976, 17): b'\x00', + (40992, 1): b'\x00', + (40992, 2): b'\x00', + (40992, 3): b'\x00', + (40992, 4): b'\x00', + (40992, 5): b'\x00', + (40992, 6): b'\x00', + (61440, 1): b'\x10\x00', + (61440, 2): b'\x03\x00', + (61448, 0): b'\x00\x00\x00\x00', + (61456, 1): b'\xff\x01\x00\x00', + (61456, 2): b'\xbf\x02\x00\x00', + (61456, 3): b'\xc0\x02\x00\x00', + (61569, 1): b'\x00\x00\x00\x00', + (63503, 1): b'\x00}', + (63503, 2): b'\x04\x06', + (63503, 3): b'\x14\x00', + (63503, 4): b'P', + (63503, 5): b'd', + (63503, 6): b'\n\x00', + (63503, 7): b'$\xff', + (63503, 8): b'F\x00', + (63744, 1): b'F\x00', + (63744, 2): b'F\x00', + (63744, 4): b'F\x00', + (63744, 5): b'F\x00', + (63744, 6): b'F\x00', + (64256, 1): b'\x00\x00', + (64256, 2): b'\x00', + (64256, 3): b'\x00\x00\x00\x00'}}, + { 'eeprom': b'\x05\x04\x03\xcc\xd0\x07\x00\x00\x00\x00\x00\x00' + b'\x00\x00=\x00\x02\x00\x00\x00R0\x81\x1b\x00\x00\x17\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x10\xf4\x00\xf4\x10\xf4\x00\x00\x10\x80\x00' + b'\x80\x10\x80\x00\x0c\x00\x00\x00\x00\x00\x00\x00' + b'\x0c\x00\t\x00\x8e\xbc\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x0f\x00\x01\x00\n\x00;\x00\x06\x06EL7041\x12DriveAxisTe' + b'rminals"Antriebs- und Achsklemmen (EL7xxx)*EL7041 1K. Sc' + b'hrittmotor-Endstufe (50V, 5A)\x08Synchron\x02DC\xff\x1e\x00' + b"\x10\x00\x02\x00\x01\x04\x0c'\x01\x00\x00\x00" + b'\x00\x04\x8c\x00\x03\x003\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x00' + b'\x02\x00\x01\x02\x03\xff)\x00\x10\x00\x00\x10\x80\x00&\x00' + b'\x01\x01\x80\x10\x80\x00"\x00\x01\x02\x00\x11\x08\x00$\x00' + b'\x01\x03\x80\x11\x08\x00 \x00\x01\x04<\x00\x18\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x03\x01\x00\x06\x00\x00\x00\x00\x00', + 'sdo': { (4096, 0): b'\x89\x13\x00\x00', + (4104, 0): b'EL7041', + (4105, 0): b'09', + (4106, 0): b'12', + (4113, 1): b'\x00\x00\x00\x00', + (4120, 1): b'\x02\x00\x00\x00', + (4120, 2): b'R0\x81\x1b', + (4120, 3): b'\x00\x00\x17\x00', + (4120, 4): b'|9\x00\x00', + (4336, 1): b'\xed9\x00\x00', + (4339, 1): b'2', + (4339, 2): b'\x14', + (4339, 3): b'\x00', + (4339, 4): b'\x01', + (4339, 5): b'\x00\x00', + (4339, 6): b'\x00\xe0\x81\x1b\x10\x005\x11\x80^\xda(' + b'\xbb\x89\x01\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 7): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x80=\n\xa6' + b'\x01\x8a\x01\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 8): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0\xc7\x01\xa8' + b'\x01\x8a\x01\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 9): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\x13:P' + b'\n\x8a\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 10): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0\xdf@R' + b'\n\x8a\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 11): b'\x00\xe0\x81\x1b\x10\x00\x00\x11' + b'\x00\xdc\x1c\x08K\x8a\x01\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 12): b'\x00\xe0\x81\x1b\x10\x005\x11@f\x14\n' + b'K\x8a\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 13): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x80\x95&\xa4' + b'f\x8a\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 14): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0\x1f\x1e\xa6' + b'f\x8a\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 15): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x80\xd7\xfeW' + b'p\x8a\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 16): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0a\xf6Y' + b'p\x8a\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 17): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x80r)\x94' + b'}\x8a\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 18): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0\xfc \x96' + b'}\x8a\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 19): b'\x00\xe0\x81\x1b\x10\x00\x00\x11' + b'\x80\xca\xc5\x04\x87\x8a\x01\x00' + b'\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 20): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0T\xbd\x06' + b'\x87\x8a\x01\x00\x06\x00\xe7\x03' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 21): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x80H\x0b\xff' + b';\x00\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 22): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0\xd2\x02\x01' + b'<\x00\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 23): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x00\xe1X\xae' + b'?\x00\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 24): b'\x00\xe0\x81\x1b\x10\x005\x11@kP\xb0' + b'?\x00\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 25): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x00\x13\x8fm' + b'@\x00\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 26): b'\x00\xe0\x81\x1b\x10\x005\x11@\x9d\x86o' + b'@\x00\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 27): b'\x00\xe0\x81\x1b\x10\x00\x00\x11' + b'\x00\xde\x82\xa2L\x00\x00\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 28): b'\x00\xe0\x81\x1b\x10\x005\x11@hz\xa4' + b'L\x00\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 29): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\x810\xbb' + b'M\x00\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 30): b'\x00\xe0\x81\x1b\x10\x005\x11\x80\x0b(\xbd' + b'M\x00\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 31): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\xca\xabw' + b'T\x00\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 32): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0\x96\xb2y' + b'T\x00\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 33): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\x00\xdfX\xf0' + b'\x11H\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 34): b'\x00\xe0\x81\x1b\x10\x005\x11@iP\xf2' + b'\x11H\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 35): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\xa7\x061' + b'\x16H\x00\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 36): b'\x00\xe0\x81\x1b\x10\x005\x11\xc0s\r3' + b'\x16H\x00\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 37): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@n\x9bn' + b'p5\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 38): b'\x00\xe0\x81\x1b\x10\x005\x11\x80\xf8\x92p' + b'p5\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 39): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\x94\x19\x17' + b';<\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 40): b'\x00\xe0\x81\x1b\x10\x005\x11\x80\x1e\x11\x19' + b';<\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 41): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\xc0\xc5V`' + b'\x8f<\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 42): b'\x00\xe0\x81\x1b\x10\x005\x11\x00PNb' + b'\x8f<\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 43): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\xc0\x1b\xb8%' + b'\x9f<\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 44): b"\x00\xe0\x81\x1b\x10\x005\x11\x00\xa6\xaf'" + b'\x9f<\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 45): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\xf1\xca\xa3' + b'\xa4<\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 46): b'\x00\xe0\x81\x1b\x10\x005\x11\x80{\xc2\xa5' + b'\xa4<\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 47): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\xc09\xdd\xba' + b'\x02=\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 48): b'\x00\xe0\x81\x1b\x10\x005\x11@\x06\xe4\xbc' + b'\x02=\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 49): b'\x00\xe0\x81\x1b\x10\x00\x00\x11' + b'\xc0\xb5\xd5\xb5\x15=\x01\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4339, 50): b'\x00\xe0\x81\x1b\x10\x005\x11@\x82\xdc\xb7' + b'\x15=\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 51): b'\x00\xe0\x81\x1b\x10\x00\x00\x11\xc0\xe8)\x16' + b'\x1a=\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 52): b'\x00\xe0\x81\x1b\x10\x005\x11\x00s!\x18' + b'\x1a=\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 53): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\x81\xad3' + b'\x1f=\x01\x00\x06\x00\x00\x01\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 54): b'\x00\xe0\x81\x1b\x10\x005\x11\x80\x0b\xa55' + b'\x1f=\x01\x00\x06\x00\xe7\x03\x06\x00\x00\x00' + b'\x06\x00\x00\x00', + (4339, 55): b'\x00\xe0\x81\x1b\x10\x00\x00\x11@\xd4\xe2&' + b'\xbb\x89\x01\x00\x06\x00\x00\x01' + b'\x06\x00\x00\x00\x06\x00\x00\x00', + (4344, 0): b'\x80\xe3`d\x87\x8a\x01\x00', + (5120, 6): b'\x01\x16\x00\x00\x00\x00', + (5121, 6): b'\x00\x16\x00\x00\x00\x00', + (5123, 6): b'\x04\x16\x05\x16\x06\x16', + (5124, 6): b'\x03\x16\x05\x16\x06\x16', + (5125, 6): b'\x03\x16\x04\x16\x06\x16', + (5126, 6): b'\x03\x16\x04\x16\x05\x16', + (5632, 1): b'\x01\x01\x00p', + (5632, 2): b'\x01\x02\x00p', + (5632, 3): b'\x01\x03\x00p', + (5632, 4): b'\x01\x04\x00p', + (5632, 5): b'\x04\x00\x00\x00', + (5632, 6): b'\x08\x00\x00\x00', + (5632, 7): b'\x10\x11\x00p', + (5633, 1): b'\x01\x01\x00p', + (5633, 2): b'\x01\x02\x00p', + (5633, 3): b'\x01\x03\x00p', + (5633, 4): b'\x01\x04\x00p', + (5633, 5): b'\x04\x00\x00\x00', + (5633, 6): b'\x08\x00\x00\x00', + (5633, 7): b' \x11\x00p', + (5634, 1): b'\x01\x01\x10p', + (5634, 2): b'\x01\x02\x10p', + (5634, 3): b'\x01\x03\x10p', + (5634, 4): b'\x05\x00\x00\x00', + (5634, 5): b'\x08\x00\x00\x00', + (5635, 1): b' \x11\x10p', + (5636, 1): b'\x10!\x10p', + (5637, 1): b'\x01\x01 p', + (5637, 2): b'\x01\x02 p', + (5637, 3): b'\x06\x00\x00\x00', + (5637, 4): b'\x08\x00\x00\x00', + (5637, 5): b' \x11 p', + (5638, 1): b'\x01\x01 p', + (5638, 2): b'\x01\x02 p', + (5638, 3): b'\x06\x00\x00\x00', + (5638, 4): b'\x08\x00\x00\x00', + (5638, 5): b' \x11 p', + (5638, 6): b'\x10! p', + (5638, 7): b'\x10" p', + (5638, 8): b'\x10# p', + (5638, 9): b'\x10$ p', + (6144, 6): b'\x01\x1a', + (6145, 6): b'\x00\x1a', + (6149, 6): b'\x06\x1a', + (6150, 6): b'\x05\x1a', + (6656, 1): b'\x01\x01\x00`', + (6656, 2): b'\x01\x02\x00`', + (6656, 3): b'\x01\x03\x00`', + (6656, 4): b'\x01\x04\x00`', + (6656, 5): b'\x01\x05\x00`', + (6656, 6): b'\x02\x00\x00\x00', + (6656, 7): b'\x01\x08\x00`', + (6656, 8): b'\x01\t\x00`', + (6656, 9): b'\x01\n\x00`', + (6656, 10): b'\x01\x0b\x00`', + (6656, 11): b'\x01\x00\x00\x00', + (6656, 12): b'\x01\r\x00`', + (6656, 13): b'\x01\x0e\x00`', + (6656, 14): b'\x01\x00\x00\x00', + (6656, 15): b'\x01\x10\x00`', + (6656, 16): b'\x10\x11\x00`', + (6656, 17): b'\x10\x12\x00`', + (6657, 1): b'\x01\x01\x00`', + (6657, 2): b'\x01\x02\x00`', + (6657, 3): b'\x01\x03\x00`', + (6657, 4): b'\x01\x04\x00`', + (6657, 5): b'\x01\x05\x00`', + (6657, 6): b'\x02\x00\x00\x00', + (6657, 7): b'\x01\x08\x00`', + (6657, 8): b'\x01\t\x00`', + (6657, 9): b'\x01\n\x00`', + (6657, 10): b'\x01\x0b\x00`', + (6657, 11): b'\x01\x00\x00\x00', + (6657, 12): b'\x01\r\x00`', + (6657, 13): b'\x01\x0e\x00`', + (6657, 14): b'\x01\x00\x00\x00', + (6657, 15): b'\x01\x10\x00`', + (6657, 16): b' \x11\x00`', + (6657, 17): b' \x12\x00`', + (6658, 1): b' \x16\x00`', + (6659, 1): b'\x01\x01\x10`', + (6659, 2): b'\x01\x02\x10`', + (6659, 3): b'\x01\x03\x10`', + (6659, 4): b'\x01\x04\x10`', + (6659, 5): b'\x01\x05\x10`', + (6659, 6): b'\x01\x06\x10`', + (6659, 7): b'\x01\x07\x10`', + (6659, 8): b'\x01\x00\x00\x00', + (6659, 9): b'\x03\x00\x00\x00', + (6659, 10): b'\x01\x0c\x10`', + (6659, 11): b'\x01\r\x10`', + (6659, 12): b'\x01\x0e\x10`', + (6659, 13): b'\x01\x00\x00\x00', + (6659, 14): b'\x01\x10\x10`', + (6660, 1): b'\x10\x11\x10`', + (6660, 2): b'\x10\x12\x10`', + (6661, 1): b'\x01\x01 `', + (6661, 2): b'\x01\x02 `', + (6661, 3): b'\x01\x03 `', + (6661, 4): b'\x01\x04 `', + (6661, 5): b'\x01\x05 `', + (6661, 6): b'\x01\x06 `', + (6661, 7): b'\x01\x07 `', + (6661, 8): b'\x01\x00\x00\x00', + (6661, 9): b'\x08\x00\x00\x00', + (6662, 1): b'\x01\x01 `', + (6662, 2): b'\x01\x02 `', + (6662, 3): b'\x01\x03 `', + (6662, 4): b'\x01\x04 `', + (6662, 5): b'\x01\x05 `', + (6662, 6): b'\x01\x06 `', + (6662, 7): b'\x01\x07 `', + (6662, 8): b'\x01\x00\x00\x00', + (6662, 9): b'\x08\x00\x00\x00', + (6662, 10): b' \x11 `', + (6662, 11): b'\x10! `', + (6662, 12): b' " `', + (7168, 1): b'\x01', + (7168, 2): b'\x02', + (7168, 3): b'\x03', + (7168, 4): b'\x04', + (7186, 1): b'\x00\x16', + (7186, 2): b'\x02\x16', + (7186, 3): b'\x04\x16', + (7187, 1): b'\x00\x1a', + (7187, 2): b'\x03\x1a', + (7187, 3): b'\x00\x00', + (7187, 4): b'\x00\x00', + (7187, 5): b'\x00\x00', + (7218, 1): b'\x01\x00', + (7218, 2): b'@B\x0f\x00', + (7218, 3): b'\x00\x00\x00\x00', + (7218, 4): b'\x07\x08', + (7218, 5): b'\x90\xd0\x03\x00', + (7218, 6): b'\x00\x00\x00\x00', + (7218, 7): b'\x00\x00\x00\x00', + (7218, 8): b'\x00\x00', + (7218, 9): b'\x00\x00\x00\x00', + (7218, 11): b'\x00\x00', + (7218, 12): b'\x00\x00', + (7218, 13): b'\x00\x00', + (7218, 32): b'\x00', + (7219, 1): b'"\x00', + (7219, 2): b'@B\x0f\x00', + (7219, 3): b'\x00\x00\x00\x00', + (7219, 4): b'\x07\x08', + (7219, 5): b'\x90\xd0\x03\x00', + (7219, 6): b'\x90\xd0\x03\x00', + (7219, 7): b'\x00\x00\x00\x00', + (7219, 8): b'\x00\x00', + (7219, 9): b'\x00\x00\x00\x00', + (7219, 11): b'\x00\x00', + (7219, 12): b'\x00\x00', + (7219, 13): b'\x00\x00', + (7219, 32): b'\x00', + (24576, 1): b'\x00', + (24576, 2): b'\x00', + (24576, 3): b'\x00', + (24576, 4): b'\x00', + (24576, 5): b'\x00', + (24576, 8): b'\x00', + (24576, 9): b'\x00', + (24576, 10): b'\x00', + (24576, 11): b'\x00', + (24576, 13): b'\x00', + (24576, 14): b'\x00', + (24576, 16): b'\x00', + (24576, 17): b'\x00\x00\x00\x00', + (24576, 18): b'\x00\x00\x00\x00', + (24576, 22): b'\x00\x00\x00\x00', + (24592, 1): b'\x00', + (24592, 2): b'\x00', + (24592, 3): b'\x00', + (24592, 4): b'\x01', + (24592, 5): b'\x00', + (24592, 6): b'\x00', + (24592, 7): b'\x00', + (24592, 12): b'\x01', + (24592, 13): b'\x01', + (24592, 14): b'\x00', + (24592, 16): b'\x00', + (24592, 17): b'\x00\x00', + (24592, 18): b'\x00\x00', + (24608, 1): b'\x00', + (24608, 2): b'\x00', + (24608, 3): b'\x01', + (24608, 4): b'\x00', + (24608, 5): b'\x00', + (24608, 6): b'\x00', + (24608, 7): b'\x00', + (24608, 17): b'\x00\x00\x00\x00', + (24608, 33): b'\x00\x00', + (24608, 34): b'\x00\x00\x00\x00', + (28672, 1): b'\x00', + (28672, 2): b'\x00', + (28672, 3): b'\x00', + (28672, 4): b'\x00', + (28672, 17): b'\x00\x00\x00\x00', + (28688, 1): b'\x00', + (28688, 2): b'\x00', + (28688, 3): b'\x00', + (28688, 17): b'\x00\x00\x00\x00', + (28688, 33): b'\x00\x00', + (28704, 1): b'\x00', + (28704, 2): b'\x00', + (28704, 17): b'\x00\x00\x00\x00', + (28704, 33): b'\x00\x00', + (28704, 34): b'\x00\x00', + (28704, 35): b'\x00\x00', + (28704, 36): b'\x00\x00', + (32768, 8): b'\x00', + (32768, 10): b'\x00', + (32768, 14): b'\x00', + (32784, 1): b'\xf4\x01', + (32784, 2): b'\xfa\x00', + (32784, 3): b'P\xc3', + (32784, 4): b'd\x00', + (32784, 5): b'\x00\x00', + (32784, 6): b'\xc8\x00', + (32784, 7): b'\x01\x00', + (32784, 9): b'\x00\x00', + (32784, 16): b'd\x00', + (32784, 17): b'\x96\x00', + (32785, 1): b'\x90\x01', + (32785, 2): b'\x04\x00', + (32785, 3): b'\x00', + (32785, 5): b'\x00', + (32785, 6): b'\x00\x00', + (32785, 7): b'd\x00', + (32785, 8): b'd\x00', + (32786, 1): b'\x00', + (32786, 5): b'\x01', + (32786, 8): b'\x01', + (32786, 9): b'\x00', + (32786, 17): b'\x03', + (32786, 25): b'\x04', + (32786, 48): b'\x01', + (32786, 49): b'\x01', + (32786, 50): b'\x00', + (32786, 54): b'\x00', + (32787, 1): b'\xe8\x03', + (32787, 2): b'\x00\x00', + (32787, 3): b'\x00', + (32787, 5): b'\x00', + (32787, 6): b'\x00\x00', + (32787, 7): b'\x00\x00', + (32787, 8): b'\x00\x00', + (32800, 1): b'd\x00', + (32800, 2): b"\x10'", + (32800, 3): b'\xe8\x03', + (32800, 4): b'\xe8\x03', + (32800, 5): b'\xe8\x03', + (32800, 6): b'\xe8\x03', + (32800, 7): b'd\x00', + (32800, 8): b'\x00\x00\x00\x00', + (32800, 9): b'd\x00', + (32800, 10): b'\n\x00', + (32800, 11): b'\n\x00', + (32800, 12): b'\xe8\x03', + (32800, 13): b'2\x00', + (32800, 14): b'\x00\x00\x00\x00', + (32800, 15): b'\x00\x00\x00\x00', + (32800, 16): b'\x00\x00', + (32801, 1): b'\x01\x00', + (32801, 17): b'\x00', + (32801, 19): b'\x01', + (32801, 20): b'\x00', + (32801, 21): b'\x00', + (32801, 22): b'\x00', + (36880, 1): b'\x00', + (36880, 2): b'\x00', + (36880, 3): b'\x00', + (36880, 4): b'\x00', + (36880, 5): b'\x00', + (36880, 6): b'\x00', + (36880, 7): b'\x00', + (36880, 8): b'\x00', + (36880, 9): b'\x00', + (36880, 19): b'\x00', + (36896, 1): b'\x00\x00', + (36896, 3): b'\x00\x00', + (36896, 4): b'\x00\x00\x00\x00', + (40976, 1): b'\x00', + (40976, 2): b'\x00', + (40976, 3): b'\x00', + (40976, 4): b'\x00', + (40976, 5): b'\x00', + (40976, 6): b'\x00', + (40976, 7): b'\x00', + (40976, 8): b'\x01', + (40976, 9): b'\x01', + (40976, 10): b'\x00', + (40976, 17): b'\x00', + (40992, 1): b'\x00', + (40992, 2): b'\x00', + (40992, 3): b'\x00', + (40992, 4): b'\x00', + (40992, 5): b'\x00', + (40992, 6): b'\x00', + (61440, 1): b'\x10\x00', + (61440, 2): b'\x03\x00', + (61448, 0): b'\x00\x00\x00\x00', + (61456, 1): b'\xff\x01\x00\x00', + (61456, 2): b'\xbf\x02\x00\x00', + (61456, 3): b'\xc0\x02\x00\x00', + (61569, 1): b'\x00\x00\x00\x00', + (63503, 1): b'\x00}', + (63503, 2): b'\x02\x01', + (63503, 3): b'\x14\x00', + (63503, 4): b'P', + (63503, 5): b'd', + (63503, 6): b'\n\x00', + (63503, 7): b'r\xe8', + (63503, 8): b'J\xe8', + (63744, 1): b'J\xe8', + (63744, 2): b'J\xe8', + (63744, 4): b'J\xe8', + (63744, 5): b'J\xe8', + (63744, 6): b'J\xe8', + (64256, 1): b'\x00\x00', + (64256, 2): b'\x00', + (64256, 3): b'\x00\x00\x00\x00'}}, + { 'eeprom': b'\x05\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\xaf\x00\x02\x00\x00\x00R0\x86\x17\x00\x00\x13\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x10\xf4\x00\xf4\x10\xf4\x00\x00\x10\x80\x00' + b'\x80\x10\x80\x00\x0c\x00\x00\x00\x00\x00\x00\x00' + b'\x03\x00\x08\x00\x8fa\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x0f\x00\x01\x00\n\x00-\x00\x04\x06EL6022\rCommunicati' + b'on\x1eKommunikationsklemmen (EL6xxx)$EL6022 Schnittstelle 2' + b"K. (RS422/485)\x1e\x00\x10\x00\x02\x00\x01\x04\x0c'" + b'\x01\x00\x00\x00\r\x04\x0e\x01\x03\x003\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x00' + b'\x02\x00\x01\x02\x03\xff)\x00\x10\x00\x00\x10\x80\x00&\x00' + b'\x01\x01\x80\x10\x80\x00"\x00\x01\x02\x00\x110\x00$\x00' + b'\x01\x03 \x120\x00 \x00\x01\x04', + 'sdo': { (4096, 0): b'\x89\x13X\x02', + (4104, 0): b'EL6022', + (4105, 0): b'08', + (4106, 0): b'03', + (4113, 1): b'\x00\x00\x00\x00', + (4120, 1): b'\x02\x00\x00\x00', + (4120, 2): b'R0\x86\x17', + (4120, 3): b'\x00\x00\x10\x00', + (4120, 4): b'\x00\x00\x00\x00', + (4336, 1): b'\xbeK\x00\x00', + (5120, 6): b'\x04\x16', + (5121, 6): b'\x05\x16', + (5124, 6): b'\x00\x16', + (5125, 6): b'\x01\x16', + (5632, 1): b'\x01\x01\x00p', + (5632, 2): b'\x01\x02\x00p', + (5632, 3): b'\x01\x03\x00p', + (5632, 4): b'\x01\x04\x00p', + (5632, 5): b'\x04\x00\x00\x00', + (5632, 6): b'\x08\t\x00p', + (5632, 7): b'\x08\x11\x00p', + (5632, 8): b'\x08\x12\x00p', + (5632, 9): b'\x08\x13\x00p', + (5632, 10): b'\x08\x14\x00p', + (5632, 11): b'\x08\x15\x00p', + (5632, 12): b'\x08\x16\x00p', + (5632, 13): b'\x08\x17\x00p', + (5632, 14): b'\x08\x18\x00p', + (5632, 15): b'\x08\x19\x00p', + (5632, 16): b'\x08\x1a\x00p', + (5632, 17): b'\x08\x1b\x00p', + (5632, 18): b'\x08\x1c\x00p', + (5632, 19): b'\x08\x1d\x00p', + (5632, 20): b'\x08\x1e\x00p', + (5632, 21): b'\x08\x1f\x00p', + (5632, 22): b'\x08 \x00p', + (5632, 23): b'\x08!\x00p', + (5632, 24): b'\x08"\x00p', + (5632, 25): b'\x08#\x00p', + (5632, 26): b'\x08$\x00p', + (5632, 27): b'\x08%\x00p', + (5632, 28): b'\x08&\x00p', + (5633, 1): b'\x01\x01\x10p', + (5633, 2): b'\x01\x02\x10p', + (5633, 3): b'\x01\x03\x10p', + (5633, 4): b'\x01\x04\x10p', + (5633, 5): b'\x04\x00\x00\x00', + (5633, 6): b'\x08\t\x10p', + (5633, 7): b'\x08\x11\x10p', + (5633, 8): b'\x08\x12\x10p', + (5633, 9): b'\x08\x13\x10p', + (5633, 10): b'\x08\x14\x10p', + (5633, 11): b'\x08\x15\x10p', + (5633, 12): b'\x08\x16\x10p', + (5633, 13): b'\x08\x17\x10p', + (5633, 14): b'\x08\x18\x10p', + (5633, 15): b'\x08\x19\x10p', + (5633, 16): b'\x08\x1a\x10p', + (5633, 17): b'\x08\x1b\x10p', + (5633, 18): b'\x08\x1c\x10p', + (5633, 19): b'\x08\x1d\x10p', + (5633, 20): b'\x08\x1e\x10p', + (5633, 21): b'\x08\x1f\x10p', + (5633, 22): b'\x08 \x10p', + (5633, 23): b'\x08!\x10p', + (5633, 24): b'\x08"\x10p', + (5633, 25): b'\x08#\x10p', + (5633, 26): b'\x08$\x10p', + (5633, 27): b'\x08%\x10p', + (5633, 28): b'\x08&\x10p', + (5636, 1): b'\x10\x01\x01p', + (5636, 2): b'\x08\x11\x00p', + (5636, 3): b'\x08\x12\x00p', + (5636, 4): b'\x08\x13\x00p', + (5636, 5): b'\x08\x14\x00p', + (5636, 6): b'\x08\x15\x00p', + (5636, 7): b'\x08\x16\x00p', + (5636, 8): b'\x08\x17\x00p', + (5636, 9): b'\x08\x18\x00p', + (5636, 10): b'\x08\x19\x00p', + (5636, 11): b'\x08\x1a\x00p', + (5636, 12): b'\x08\x1b\x00p', + (5636, 13): b'\x08\x1c\x00p', + (5636, 14): b'\x08\x1d\x00p', + (5636, 15): b'\x08\x1e\x00p', + (5636, 16): b'\x08\x1f\x00p', + (5636, 17): b'\x08 \x00p', + (5636, 18): b'\x08!\x00p', + (5636, 19): b'\x08"\x00p', + (5636, 20): b'\x08#\x00p', + (5636, 21): b'\x08$\x00p', + (5636, 22): b'\x08%\x00p', + (5636, 23): b'\x08&\x00p', + (5637, 1): b'\x10\x01\x11p', + (5637, 2): b'\x08\x11\x10p', + (5637, 3): b'\x08\x12\x10p', + (5637, 4): b'\x08\x13\x10p', + (5637, 5): b'\x08\x14\x10p', + (5637, 6): b'\x08\x15\x10p', + (5637, 7): b'\x08\x16\x10p', + (5637, 8): b'\x08\x17\x10p', + (5637, 9): b'\x08\x18\x10p', + (5637, 10): b'\x08\x19\x10p', + (5637, 11): b'\x08\x1a\x10p', + (5637, 12): b'\x08\x1b\x10p', + (5637, 13): b'\x08\x1c\x10p', + (5637, 14): b'\x08\x1d\x10p', + (5637, 15): b'\x08\x1e\x10p', + (5637, 16): b'\x08\x1f\x10p', + (5637, 17): b'\x08 \x10p', + (5637, 18): b'\x08!\x10p', + (5637, 19): b'\x08"\x10p', + (5637, 20): b'\x08#\x10p', + (5637, 21): b'\x08$\x10p', + (5637, 22): b'\x08%\x10p', + (5637, 23): b'\x08&\x10p', + (6144, 6): b'\x04\x1a', + (6145, 6): b'\x05\x1a', + (6148, 6): b'\x00\x1a', + (6149, 6): b'\x01\x1a', + (6656, 1): b'\x01\x01\x00`', + (6656, 2): b'\x01\x02\x00`', + (6656, 3): b'\x01\x03\x00`', + (6656, 4): b'\x01\x04\x00`', + (6656, 5): b'\x01\x05\x00`', + (6656, 6): b'\x01\x06\x00`', + (6656, 7): b'\x01\x07\x00`', + (6656, 8): b'\x01\x00\x00\x00', + (6656, 9): b'\x08\t\x00`', + (6656, 10): b'\x08\x11\x00`', + (6656, 11): b'\x08\x12\x00`', + (6656, 12): b'\x08\x13\x00`', + (6656, 13): b'\x08\x14\x00`', + (6656, 14): b'\x08\x15\x00`', + (6656, 15): b'\x08\x16\x00`', + (6656, 16): b'\x08\x17\x00`', + (6656, 17): b'\x08\x18\x00`', + (6656, 18): b'\x08\x19\x00`', + (6656, 19): b'\x08\x1a\x00`', + (6656, 20): b'\x08\x1b\x00`', + (6656, 21): b'\x08\x1c\x00`', + (6656, 22): b'\x08\x1d\x00`', + (6656, 23): b'\x08\x1e\x00`', + (6656, 24): b'\x08\x1f\x00`', + (6656, 25): b'\x08 \x00`', + (6656, 26): b'\x08!\x00`', + (6656, 27): b'\x08"\x00`', + (6656, 28): b'\x08#\x00`', + (6656, 29): b'\x08$\x00`', + (6656, 30): b'\x08%\x00`', + (6656, 31): b'\x08&\x00`', + (6657, 1): b'\x01\x01\x10`', + (6657, 2): b'\x01\x02\x10`', + (6657, 3): b'\x01\x03\x10`', + (6657, 4): b'\x01\x04\x10`', + (6657, 5): b'\x01\x05\x10`', + (6657, 6): b'\x01\x06\x10`', + (6657, 7): b'\x01\x07\x10`', + (6657, 8): b'\x01\x00\x00\x00', + (6657, 9): b'\x08\t\x10`', + (6657, 10): b'\x08\x11\x10`', + (6657, 11): b'\x08\x12\x10`', + (6657, 12): b'\x08\x13\x10`', + (6657, 13): b'\x08\x14\x10`', + (6657, 14): b'\x08\x15\x10`', + (6657, 15): b'\x08\x16\x10`', + (6657, 16): b'\x08\x17\x10`', + (6657, 17): b'\x08\x18\x10`', + (6657, 18): b'\x08\x19\x10`', + (6657, 19): b'\x08\x1a\x10`', + (6657, 20): b'\x08\x1b\x10`', + (6657, 21): b'\x08\x1c\x10`', + (6657, 22): b'\x08\x1d\x10`', + (6657, 23): b'\x08\x1e\x10`', + (6657, 24): b'\x08\x1f\x10`', + (6657, 25): b'\x08 \x10`', + (6657, 26): b'\x08!\x10`', + (6657, 27): b'\x08"\x10`', + (6657, 28): b'\x08#\x10`', + (6657, 29): b'\x08$\x10`', + (6657, 30): b'\x08%\x10`', + (6657, 31): b'\x08&\x10`', + (6660, 1): b'\x10\x01\x01`', + (6660, 2): b'\x08\x11\x00`', + (6660, 3): b'\x08\x12\x00`', + (6660, 4): b'\x08\x13\x00`', + (6660, 5): b'\x08\x14\x00`', + (6660, 6): b'\x08\x15\x00`', + (6660, 7): b'\x08\x16\x00`', + (6660, 8): b'\x08\x17\x00`', + (6660, 9): b'\x08\x18\x00`', + (6660, 10): b'\x08\x19\x00`', + (6660, 11): b'\x08\x1a\x00`', + (6660, 12): b'\x08\x1b\x00`', + (6660, 13): b'\x08\x1c\x00`', + (6660, 14): b'\x08\x1d\x00`', + (6660, 15): b'\x08\x1e\x00`', + (6660, 16): b'\x08\x1f\x00`', + (6660, 17): b'\x08 \x00`', + (6660, 18): b'\x08!\x00`', + (6660, 19): b'\x08"\x00`', + (6660, 20): b'\x08#\x00`', + (6660, 21): b'\x08$\x00`', + (6660, 22): b'\x08%\x00`', + (6660, 23): b'\x08&\x00`', + (6661, 1): b'\x10\x01\x11`', + (6661, 2): b'\x08\x11\x10`', + (6661, 3): b'\x08\x12\x10`', + (6661, 4): b'\x08\x13\x10`', + (6661, 5): b'\x08\x14\x10`', + (6661, 6): b'\x08\x15\x10`', + (6661, 7): b'\x08\x16\x10`', + (6661, 8): b'\x08\x17\x10`', + (6661, 9): b'\x08\x18\x10`', + (6661, 10): b'\x08\x19\x10`', + (6661, 11): b'\x08\x1a\x10`', + (6661, 12): b'\x08\x1b\x10`', + (6661, 13): b'\x08\x1c\x10`', + (6661, 14): b'\x08\x1d\x10`', + (6661, 15): b'\x08\x1e\x10`', + (6661, 16): b'\x08\x1f\x10`', + (6661, 17): b'\x08 \x10`', + (6661, 18): b'\x08!\x10`', + (6661, 19): b'\x08"\x10`', + (6661, 20): b'\x08#\x10`', + (6661, 21): b'\x08$\x10`', + (6661, 22): b'\x08%\x10`', + (6661, 23): b'\x08&\x10`', + (7168, 1): b'\x01', + (7168, 2): b'\x02', + (7168, 3): b'\x03', + (7168, 4): b'\x04', + (7186, 1): b'\x04\x16', + (7186, 2): b'\x05\x16', + (7187, 1): b'\x04\x1a', + (7187, 2): b'\x05\x1a', + (7218, 1): b'\x00\x00', + (7218, 2): b'\x00\xe2\x04\x00', + (7218, 3): b'\x00\x00\x00\x00', + (7218, 4): b'\x01\x00', + (7218, 5): b'\x80M\x00\x00', + (7218, 6): b'\x00\x00\x00\x00', + (7218, 7): b'\x00\x00\x00\x00', + (7218, 8): b'\x00\x00', + (7218, 9): b'\x00\x00\x00\x00', + (7218, 11): b'\x00\x00', + (7218, 12): b'\x00\x00', + (7218, 13): b'\x00\x00', + (7218, 32): b'\x00', + (7219, 1): b'\x00\x00', + (7219, 2): b'\x00\xe2\x04\x00', + (7219, 3): b'\x00\x00\x00\x00', + (7219, 4): b'\x01\x00', + (7219, 5): b'\x80M\x00\x00', + (7219, 6): b'\x00\x00\x00\x00', + (7219, 7): b'\x00\x00\x00\x00', + (7219, 8): b'\x00\x00', + (7219, 9): b'\x00\x00\x00\x00', + (7219, 11): b'\x00\x00', + (7219, 12): b'\x00\x00', + (7219, 13): b'\x00\x00', + (7219, 32): b'\x00', + (24576, 1): b'\x00', + (24576, 2): b'\x00', + (24576, 3): b'\x00', + (24576, 4): b'\x00', + (24576, 5): b'\x00', + (24576, 6): b'\x00', + (24576, 7): b'\x00', + (24576, 9): b'\x00', + (24576, 17): b'\x00', + (24576, 18): b'\x00', + (24576, 19): b'\x00', + (24576, 20): b'\x00', + (24576, 21): b'\x00', + (24576, 22): b'\x00', + (24576, 23): b'\x00', + (24576, 24): b'\x00', + (24576, 25): b'\x00', + (24576, 26): b'\x00', + (24576, 27): b'\x00', + (24576, 28): b'\x00', + (24576, 29): b'\x00', + (24576, 30): b'\x00', + (24576, 31): b'\x00', + (24576, 32): b'\x00', + (24576, 33): b'\x00', + (24576, 34): b'\x00', + (24576, 35): b'\x00', + (24576, 36): b'\x00', + (24576, 37): b'\x00', + (24576, 38): b'\x00', + (24577, 1): b'\x00\x00', + (24592, 1): b'\x00', + (24592, 2): b'\x00', + (24592, 3): b'\x00', + (24592, 4): b'\x00', + (24592, 5): b'\x00', + (24592, 6): b'\x00', + (24592, 7): b'\x00', + (24592, 9): b'\x00', + (24592, 17): b'\x00', + (24592, 18): b'\x00', + (24592, 19): b'\x00', + (24592, 20): b'\x00', + (24592, 21): b'\x00', + (24592, 22): b'\x00', + (24592, 23): b'\x00', + (24592, 24): b'\x00', + (24592, 25): b'\x00', + (24592, 26): b'\x00', + (24592, 27): b'\x00', + (24592, 28): b'\x00', + (24592, 29): b'\x00', + (24592, 30): b'\x00', + (24592, 31): b'\x00', + (24592, 32): b'\x00', + (24592, 33): b'\x00', + (24592, 34): b'\x00', + (24592, 35): b'\x00', + (24592, 36): b'\x00', + (24592, 37): b'\x00', + (24592, 38): b'\x00', + (24593, 1): b'\x00\x00', + (28672, 1): b'\x00', + (28672, 2): b'\x00', + (28672, 3): b'\x00', + (28672, 4): b'\x00', + (28672, 9): b'\x00', + (28672, 17): b'\x00', + (28672, 18): b'\x00', + (28672, 19): b'\x00', + (28672, 20): b'\x00', + (28672, 21): b'\x00', + (28672, 22): b'\x00', + (28672, 23): b'\x00', + (28672, 24): b'\x00', + (28672, 25): b'\x00', + (28672, 26): b'\x00', + (28672, 27): b'\x00', + (28672, 28): b'\x00', + (28672, 29): b'\x00', + (28672, 30): b'\x00', + (28672, 31): b'\x00', + (28672, 32): b'\x00', + (28672, 33): b'\x00', + (28672, 34): b'\x00', + (28672, 35): b'\x00', + (28672, 36): b'\x00', + (28672, 37): b'\x00', + (28672, 38): b'\x00', + (28673, 1): b'\x00\x00', + (28688, 1): b'\x00', + (28688, 2): b'\x00', + (28688, 3): b'\x00', + (28688, 4): b'\x00', + (28688, 9): b'\x00', + (28688, 17): b'\x00', + (28688, 18): b'\x00', + (28688, 19): b'\x00', + (28688, 20): b'\x00', + (28688, 21): b'\x00', + (28688, 22): b'\x00', + (28688, 23): b'\x00', + (28688, 24): b'\x00', + (28688, 25): b'\x00', + (28688, 26): b'\x00', + (28688, 27): b'\x00', + (28688, 28): b'\x00', + (28688, 29): b'\x00', + (28688, 30): b'\x00', + (28688, 31): b'\x00', + (28688, 32): b'\x00', + (28688, 33): b'\x00', + (28688, 34): b'\x00', + (28688, 35): b'\x00', + (28688, 36): b'\x00', + (28688, 37): b'\x00', + (28688, 38): b'\x00', + (28689, 1): b'\x00\x00', + (32768, 2): b'\x00', + (32768, 3): b'\x00', + (32768, 4): b'\x00', + (32768, 5): b'\x01', + (32768, 6): b'\x01', + (32768, 7): b'\x01', + (32768, 17): b'\x06', + (32768, 21): b'\x03', + (32768, 26): b'P\x03', + (32784, 2): b'\x00', + (32784, 3): b'\x00', + (32784, 4): b'\x00', + (32784, 5): b'\x01', + (32784, 6): b'\x01', + (32784, 7): b'\x01', + (32784, 17): b'\x06', + (32784, 21): b'\x03', + (32784, 26): b'P\x03', + (40960, 1): b'\x00', + (40960, 2): b'\x00', + (40960, 3): b'\x00', + (40960, 4): b'\x00', + (40960, 5): b'\x00', + (40960, 17): b'\x00\x00', + (40960, 18): b'\x00\x00', + (40976, 1): b'\x00', + (40976, 2): b'\x00', + (40976, 3): b'\x00', + (40976, 4): b'\x00', + (40976, 5): b'\x00', + (40976, 17): b'\x00\x00', + (40976, 18): b'\x00\x00', + (61440, 1): b'\x10\x00', + (61440, 2): b'\x02\x00', + (61448, 0): b'\x00\x00\x00\x00', + (61456, 1): b'X\x02\x00\x00', + (61456, 2): b'X\x02\x00\x00'}}] diff --git a/pyproject.toml b/pyproject.toml index 995d3a93148669770bc8c9e9a5789b7200803e19..f415737a218c7d92bcc31cbe3db6af37892620f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,3 +6,5 @@ dependencies = [] [project.scripts] ec-scanbus = "ebpfcat.scripts:scanbus" ec-info = "ebpfcat.scripts:info" +ec-eeprom = "ebpfcat.scripts:eeprom" +ec-create-test = "ebpfcat.scripts:create_test"