Hi,

We ran into some problems using ethercat_mbg together with the TwinSAFE
loader and found some stuff that may be of interest to others aswell:

This setup does work:
0  0:0  PREOP  +  EK1100
1  0:1  PREOP  +  EL6910, TwinSAFE PLC
while this setup does NOT work (fails with a timeout when using loader with
--list):
0  0:0  PREOP  +  EK1100
1  0:1  PREOP  +  EL6910, TwinSAFE PLC
2  0:2  PREOP  +  EK1110 EtherCAT-Verl�ngerung

I checked what was happening with wireshark when using the twincat
master+mbg, and compared it to what I saw whilst using the ethercat
master+mbg for etherlab.

1. With twincat I see that when a request is done to the master via the mbg
it responds with a Cnt value (bits [4-6] of last byte of the mailbox
header) of 0. With etherlab mbg this value is increasing with each next
message, which also seems to be fine. I could not find in the spec Graeme
used (
https://www.ethercat.org/memberarea/download/ETG8200_V1i0i0_G_R_MailboxGateway.pdf)
what it should do.

2. When a request is done to the master via the mbg a response shorter than
16 bytes will be zero padded to make it equal to 16 bytes with twincat mbg,
etherlab mbg simply sends a shorter message, which also seems to be fine.

3. A difference of more importance: There is a discrepancy between the way
the Cnt value is updated for the two different master+mbg combinations. In
some situations this causes a timeout because the request Cnt (coming from
the loader) is equal to the slave Cnt value, which the slave will ignore
and thus a timeout occurs. I have added the raw data tracing for both the
master+mbg combinations if anybody is interested.

I'm not quite sure where to properly fix this, and am thus asking for some
advice/help.

For now I made a retry work-around in the CommandMbg class which simply
retires once with a different Cnt value in the request (Cnt-1 and wrapped
to 1-7) which "solves" the problem. I have attached it as a patch.

I myself would like a clean fix however. If somebody could point me in the
right direction I would be grateful.

Kind regards,
Mark
 Device   Dir   Data

 master   ->   10 50 0a 00 00 00 00 33 00 20 41 20 f0 00 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4f 20 f0 00 03 00 00 00
 master   ->   10 50 0a 00 00 00 00 43 00 20 41 00 a0 01 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 00 a0 01 08 5c 00 00
 master   ->   10 50 0a 00 00 00 00 53 00 20 41 00 80 01 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 00 80 01 e8 03 00 00
 master   ->   10 50 0a 00 00 00 00 63 00 20 41 00 80 21 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 00 80 21 00 01 00 00
 master   ->   10 50 0a 00 00 00 00 73 00 20 41 00 80 22 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 00 80 22 00 01 00 00
 master   ->   10 50 0a 00 00 00 00 13 00 20 41 00 80 02 00 00 00 00
 master   <-   20 50 1a 00 00 00 00 03 00 30 41 00 80 02 10 00 00 00 45 4b 31 
39 31 34 00 00 00 00 00 00 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 23 00 20 41 00 80 03 00 00 00 00
 master   <-   30 50 2a 00 00 00 00 03 00 30 41 00 80 03 20 00 00 00 54 65 72 
6d 20 31 20 28 45 4b 31 39 31 34 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
 master   ->   10 50 0a 00 00 00 00 33 00 20 41 01 a0 01 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 01 a0 01 08 00 00 00
 master   ->   10 50 0a 00 00 00 00 43 00 20 41 01 80 01 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 01 80 01 e9 03 00 00
 master   ->   10 50 0a 00 00 00 00 53 00 20 41 01 80 21 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 01 80 21 00 01 00 00
 master   ->   10 50 0a 00 00 00 00 63 00 20 41 01 80 22 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 01 80 22 00 01 00 00
 master   ->   10 50 0a 00 00 00 00 73 00 20 41 01 80 02 00 00 00 00
 master   <-   20 50 1a 00 00 00 00 03 00 30 41 01 80 02 10 00 00 00 45 4c 36 
39 31 30 00 00 00 00 00 00 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 13 00 20 41 01 80 03 00 00 00 00
 master   <-   30 50 2a 00 00 00 00 03 00 30 41 01 80 03 20 00 00 00 54 65 72 
6d 20 32 20 28 45 4c 36 39 31 30 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 23 00 20 41 80 f9 02 00 00 00 00
   1001   <-   10 50 0a 00 e9 03 00 33 00 30 43 80 f9 02 45 9b 21 00
   1001   ->   10 50 0a 00 e9 03 00 33 00 20 41 80 f9 01 00 00 00 00
   1001   <-   10 50 0a 00 e9 03 00 43 00 30 4b 80 f9 01 01 00 00 00
 master   ->   10 50 0a 00 00 00 00 43 00 20 41 02 a0 01 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 02 a0 01 08 00 00 00
 master   ->   10 50 0a 00 00 00 00 53 00 20 41 02 80 01 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 02 80 01 ea 03 00 00
 master   ->   10 50 0a 00 00 00 00 63 00 20 41 02 80 21 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 02 80 21 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 73 00 20 41 02 80 22 00 00 00 00
 master   <-   10 50 0a 00 00 00 00 03 00 30 4b 02 80 22 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 13 00 20 41 02 80 02 00 00 00 00
 master   <-   20 50 1a 00 00 00 00 03 00 30 41 02 80 02 10 00 00 00 45 4b 31 
31 31 30 00 00 00 00 00 00 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 23 00 20 41 02 80 03 00 00 00 00
 master   <-   30 50 2a 00 00 00 00 03 00 30 41 02 80 03 20 00 00 00 54 65 72 
6d 20 33 20 28 45 4b 31 31 31 30 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 33 00 20 41 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 53 00 30 41 01 fe 00 00 08 00 00 de c0 d7 
80 2c 8a 7f 91 a6 91 01 00 a5 a5 59 60 00 00 00 00 01 00 08 00 05 00 41 64 6d 
69 6e 69 73 74 72 61 74 6f 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 43 00 20 61 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 63 00 30 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 53 00 20 71 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 73 00 30 10 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 63 00 20 61 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 13 00 30 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 73 00 20 71 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 23 00 30 10 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 13 00 20 61 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 33 00 30 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 23 00 20 71 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 43 00 30 10 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 33 00 20 61 01 fe 00 00 00 00 00
   1001   <-   00 51 fa 00 e9 03 00 53 00 30 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 43 00 20 71 01 fe 00 00 00 00 00
   1001   <-   58 50 52 00 e9 03 00 63 00 30 11 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 34 a4 00 00 00 00 00 00           
 Device   Dir   Data

 master   ->   10 50 0a 00 00 00 00 33 00 20 41 20 f0 00 00 00 00 00
 master   <-   0d 50 07 00 00 00 00 33 00 30 4f 20 f0 00 03
 master   ->   10 50 0a 00 00 00 00 43 00 20 41 00 a0 01 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 43 00 30 4b 00 a0 01 02 00
 master   ->   10 50 0a 00 00 00 00 53 00 20 41 00 80 01 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 53 00 30 4b 00 80 01 e8 03
 master   ->   10 50 0a 00 00 00 00 63 00 20 41 00 80 21 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 63 00 30 4b 00 80 21 00 01
 master   ->   10 50 0a 00 00 00 00 73 00 20 41 00 80 22 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 73 00 30 4b 00 80 22 00 01
 master   ->   10 50 0a 00 00 00 00 13 00 20 41 00 80 02 00 00 00 00
 master   <-   20 50 1a 00 00 00 00 13 00 30 41 00 80 02 10 00 00 00 45 4b 31 
39 31 34 00 00 00 00 00 00 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 23 00 20 41 00 80 03 00 00 00 00
 master   <-   30 50 2a 00 00 00 00 23 00 30 41 00 80 03 20 00 00 00 45 4b 31 
39 31 34 2c 20 32 20 4b 2e 20 53 61 66 65 74 79 20 45 69 6e 67 61 6e 67 2f 41 
75 73 00
 master   ->   10 50 0a 00 00 00 00 33 00 20 41 01 a0 01 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 33 00 30 4b 01 a0 01 02 00
 master   ->   10 50 0a 00 00 00 00 43 00 20 41 01 80 01 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 43 00 30 4b 01 80 01 e9 03
 master   ->   10 50 0a 00 00 00 00 53 00 20 41 01 80 21 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 53 00 30 4b 01 80 21 00 01
 master   ->   10 50 0a 00 00 00 00 63 00 20 41 01 80 22 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 63 00 30 4b 01 80 22 00 01
 master   ->   10 50 0a 00 00 00 00 73 00 20 41 01 80 02 00 00 00 00
 master   <-   20 50 1a 00 00 00 00 73 00 30 41 01 80 02 10 00 00 00 45 4c 36 
39 31 30 00 00 00 00 00 00 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 13 00 20 41 01 80 03 00 00 00 00
 master   <-   30 50 2a 00 00 00 00 13 00 30 41 01 80 03 20 00 00 00 45 4c 36 
39 31 30 2c 20 54 77 69 6e 53 41 46 45 20 50 4c 43 00 00 00 00 00 00 00 00 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 23 00 20 41 80 f9 02 00 00 00 00
   1001   <-   10 50 0a 00 e9 03 00 13 00 30 43 80 f9 02 45 9b 21 00
   1001   ->   10 50 0a 00 e9 03 00 33 00 20 41 80 f9 01 00 00 00 00
   1001   <-   10 50 0a 00 e9 03 00 23 00 30 4b 80 f9 01 01 00 00 00
 master   ->   10 50 0a 00 00 00 00 43 00 20 41 02 a0 01 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 43 00 30 4b 02 a0 01 02 00
 master   ->   10 50 0a 00 00 00 00 53 00 20 41 02 80 01 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 53 00 30 4b 02 80 01 ea 03
 master   ->   10 50 0a 00 00 00 00 63 00 20 41 02 80 21 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 63 00 30 4b 02 80 21 00 00
 master   ->   10 50 0a 00 00 00 00 73 00 20 41 02 80 22 00 00 00 00
 master   <-   0e 50 08 00 00 00 00 73 00 30 4b 02 80 22 00 00
 master   ->   10 50 0a 00 00 00 00 13 00 20 41 02 80 02 00 00 00 00
 master   <-   20 50 1a 00 00 00 00 13 00 30 41 02 80 02 10 00 00 00 45 4b 31 
31 31 30 00 00 00 00 00 00 00 00 00 00
 master   ->   10 50 0a 00 00 00 00 23 00 20 41 02 80 03 00 00 00 00
 master   <-   30 50 2a 00 00 00 00 23 00 30 41 02 80 03 20 00 00 00 45 4b 31 
31 31 30 20 45 74 68 65 72 43 41 54 2d 56 65 72 6c 61 6e 67 65 72 75 6e 67 00 
00 00 00
   1001   ->   10 50 0a 00 e9 03 00 33 00 20 41 01 fe 00 00 00 00 00
   1001   <-   Message failed with code: Input/output error, Check ethercat 
logs for more information

dmesg:
[24971.349100] EtherCAT DEBUG: 0A 00 E9 03 00 33 00 20 41 01 FE 00 00 00 00 00
[24972.352705] EtherCAT ERROR 0-main-1: Timeout after 1000 ms while waiting for 
MBox Gateway response.
[24972.362848] EtherCAT ERROR 0-main-1: Failed to process MBox Gateway request.
From 1d3708a5f0ba1c76323ef152ff823238946bfa04 Mon Sep 17 00:00:00 2001
From: Mark <mark@pop-os.localdomain>
Date: Fri, 26 Mar 2021 17:04:31 +0100
Subject: [PATCH 1/1] workaround mbg single retry with different counter

---
 mailbox_gateway/CommandMbg.cpp | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/mailbox_gateway/CommandMbg.cpp b/mailbox_gateway/CommandMbg.cpp
index f28591c..4885e9d 100644
--- a/mailbox_gateway/CommandMbg.cpp
+++ b/mailbox_gateway/CommandMbg.cpp
@@ -245,7 +245,28 @@ int CommandMbg::processMessage(uint8_t *in_buffer, size_t &inout_nbytes)
             cout << "Message failed with code: " << strerror(errno)
                  << ", Check ethercat logs for more information" << endl;
         }
-        return -1;
+        if (EC_READ_U16(ioctl.data + 2) == 0) {
+            return -1;
+        }
+        // counter retry only for non-master requests (slave_pos != 0)
+        static const uint8_t cntrMask = 0x70;
+        uint8_t cntr = (EC_READ_U8(ioctl.data + 5) & cntrMask) >> 4; // get cntr as value 0-7
+        cntr = cntr < 2 ? cntr * 7 : (((cntr - 2) % 7) + 1); // cntr-1 (with wrapping 1 to 7) when cntr > 0
+        // just in case: no retry when cntr = 0 (master responds on mbox with cntr = 0 in twincat [wireshark])
+        if (cntr) {
+            if (m_verbosity >= CommandMbg::Normal) {
+                cout << "Retrying message with different counter value (" << unsigned(cntr)
+                     << ")" << endl;
+            }
+            EC_WRITE_U8(ioctl.data + 5, (EC_READ_U8(ioctl.data + 5) & (~cntrMask)) | (cntr << 4));
+            if (m_masterDev->processMessage(&ioctl) < 0) {
+                if (m_verbosity >= CommandMbg::Normal) {
+                    cout << "Retry message failed with code: " << strerror(errno)
+                         << ", Check ethercat logs for more information" << endl;
+                }
+                return -1;
+            }
+        }
     }
 
     m_masterDev->close();
-- 
2.25.1

-- 
Etherlab-dev mailing list
Etherlab-dev@etherlab.org
https://lists.etherlab.org/mailman/listinfo/etherlab-dev

Reply via email to