diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py index 78bc8eee10f1911693a963d478e0d62d756c0920..f25f0ae9a4b7dbe4f8de73134cf8fc88946faa66 100644 --- a/ebpfcat/ebpfcat.py +++ b/ebpfcat/ebpfcat.py @@ -271,10 +271,12 @@ class EBPFTerminal(Terminal): if self.pdo_in_sz: bases[SyncManager.IN] = (BaseType.FMMU_IN, packet.fmmu_in_size) packet.fmmu_in_size += self.pdo_in_sz + packet.fmmu_in_count += 1 if readwrite and self.pdo_out_sz: bases[SyncManager.OUT] = (BaseType.FMMU_OUT, packet.fmmu_out_size) packet.fmmu_out_size += self.pdo_out_sz + packet.fmmu_out_count += 1 else: if self.pdo_in_sz: bases[SyncManager.IN] = (BaseType.NO_FMMU, packet.size) @@ -389,10 +391,16 @@ class SterilePacket(Packet): super().__init__() self.on_the_fly = [] # list of sterilized positions self.fmmu_out_size = self.fmmu_in_size = 0 + self.fmmu_out_count = self.fmmu_in_count = 0 + self.counters = {} - def append_writer(self, cmd, *args): + def append_writer(self, cmd, *args, **kwargs): self.on_the_fly.append((self.size, cmd)) + self.append(cmd, *args, **kwargs) + + def append(self, cmd, *args, counter=1): super().append(cmd, *args) + self.counters[self.size - 2] = counter def sterile(self, index): ret = bytearray(self.assemble(index)) @@ -405,11 +413,12 @@ class SterilePacket(Packet): fmmu_in_pos = self.size if self.fmmu_in_size: self.append(ECCmd.LRD, b"\0" * self.fmmu_in_size, 0, - self.next_logical_addr) + self.next_logical_addr, counter=self.fmmu_in_count) fmmu_out_pos = self.size if self.fmmu_out_size: self.append_writer(ECCmd.LWR, b"\0" * self.fmmu_out_size, 0, - self.next_logical_addr + self.logical_addr_inc) + self.next_logical_addr + self.logical_addr_inc, + counter=self.fmmu_out_count) return (fmmu_in_pos, fmmu_out_pos, self.next_logical_addr, self.next_logical_addr + self.logical_addr_inc) @@ -417,11 +426,13 @@ class SterilePacket(Packet): for pos, cmd in self.on_the_fly: ebpf.pB[pos + self.ETHERNET_HEADER] = cmd.value + class BaseType(Enum): NO_FMMU = 0 FMMU_IN = 1 FMMU_OUT = 2 + class SyncGroupBase: missed_counter = 0 @@ -508,6 +519,10 @@ class SyncGroup(SyncGroupBase): def update_devices(self, data): self.current_data = bytearray(data) + for pos, count in self.packet.counters.items(): + if data[pos] != count: + print('count wrong!', self, pos, count, data[pos]) + self.current_data[pos] = 0 for dev in self.devices: dev.update() return self.current_data diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py index 35eb1b78780dd9d8e31ed6758cad9280cc2da996..ff6798fefe96963f84f2f8b794c8555b13389b89 100644 --- a/ebpfcat/ethercat.py +++ b/ebpfcat/ethercat.py @@ -437,7 +437,11 @@ class Terminal: await self.set_state(0x11) await self.set_state(1) - self.fmmu_used = [None] * (await self.read(4, "B"))[0] + fmmu_no, = await self.read(4, "B") + self.fmmu_used = [None] * fmmu_no + # switch off all fmmus + for i in range(fmmu_no): + await self.write(0x60c + 0x10 * i, "B", 0) self.mbx_cnt = 1 self.mbx_lock = Lock()