Skip to content

Comparison of ethercat SDOs with ArmarX

We experienced occasional failures with the initialization of the PDO IO map. With the test setup of one Sensor Actuator Unit consisting of an Elmo Gold and a Sensor board, the size of the PDO IO map should be 90 Bytes. The size of the IO map is sometimes smaller. This seems to happen more frequently if the unit was not shut down gracefully in the previous execution.

To approach this problem we compare the setup SDO writes with the working ethercat integration of ArmarX. The following Tables lists these setup procedures for each platform.

Robot Control working execution:

Time since first Time between last R/W Address Data
0 0 W Ox16'07.0 [7,0,32,0,255,96,32,0,122,96,32,0,132,96,32,0,131,96,16,0,115,96,16,0,64,96,16,0,113,96,0,0,0,0]
1706 1706 W 0x16'08.0 [1,0,8,0,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
3157 1451 W 0x1c'12.0 [2,0,7,22,8,22,0,0,0,0]
5065 1908 W 0x1a'07.0 [7,0,32,0,100,96,32,0,108,96,32,0,2,16,32,0,253,96,16,0,65,96,16,0,119,96,16,0,120,96,0,0,0,0]
6474 1409 W 0x1a'08.0 [1,0,8,0,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
7921 1447 W 0x1c'13.0 [2,0,7,26,8,26,0,0,0,0]
10322 2401 W 0x60'60.0 [8]
12217 1895 W 0x60'7a.0 [0,0,0,0]
14371 2154 W 0x60'ff.0 [0,0,0,0]
16280 1909 W 0x60'71.0 [0,0]
18203 1923 W 0x60'c2.1 [2]
20379 2176 W 0x60'f2.0 [34,0]
22300 1921 W 0x60'5a.0 [5,0]
24230 1930 W 0x60'5d.0 [1,0]
26421 2191 W 0x60'7e.0 [0]
28817 2396 W 0x60'7b.1 [0,0,0,0]
30731 1914 W 0x60'7b.2 [0,0,0,0]
32934 2203 W 0x60'7d.1 [0,0,0,128]
35319 2385 W 0x60'7d.2 [255,255,255,127]
37219 1900 W 0x60'81.0 [255,255,255,127]
39385 2166 W 0x60'73.0 [80,195]
41282 1897 W 0x60'75.0 [172,13,0,0]
43181 1899 W 0x60'72.0 [80,195]
45817 2636 W 0x60'76.0 [184,11,0,0]
47987 2170 R 0x60'41.0 [80,2]

Robot Control fault execution: IO map size is 48 bytes. [Error][17:50:45.822098][realtime loop] _pdo_to_master of slave with index index: 2, vendor id: 0x00'00'07'bc, product code: 0x00'00'31'00, serial number: 0x10'00'00'06, revision number: 0x00'00'00'02 is nullptr.

Time since first Time between last R/W Address Data
0 0 W 0x16'07.0 [7,0,32,0,255,96,32,0,122,96,32,0,132,96,32,0,131,96,16,0,115,96,16,0,64,96,16,0,113,96,0,0,0,0]
1736 1736 W 0x16'08.0 [1,0,8,0,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
3223 1487 W 0x1c'12.0 [2,0,7,22,8,22,0,0,0,0]
4974 1751 W 0x1a'07.0 [7,0,32,0,100,96,32,0,108,96,32,0,2,16,32,0,253,96,16,0,65,96,16,0,119,96,16,0,120,96,0,0,0,0]
6214 1240 W 0x1a'08.0 [1,0,8,0,97,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
7432 1218 W 0x1c'13.0 [2,0,7,26,8,26,0,0,0,0]
9409 1977 W 0x60'60.0 [8]
11391 1982 W 0x60'7a.0 [0,0,0,0]
13372 1981 W 0x60'ff.0 [0,0,0,0]
15352 1980 W 0x60'71.0 [0,0]
17606 2254 W 0x60'c2.1 [2]
19865 2259 W 0x60'f2.0 [34,0]
21888 2023 W 0x60'5a.0 [5,0]
23865 1977 W 0x60'5d.0 [1,0]
26131 2266 W 0x60'7e.0 [0]
28153 2022 W 0x60'7b.1 [0,0,0,0]
30179 2026 W 0x60'7b.2 [0,0,0,0]
32247 2068 W 0x60'7d.1 [0,0,0,128]
34566 2319 W 0x60'7d.2 [255,255,255,127]
36843 2277 W 0x60'81.0 [255,255,255,127]
39120 2277 W 0x60'73.0 [80,195]
41184 2064 W 0x60'75.0 [172,13,0,0]
42995 1811 W 0x60'72.0 [80,195]
45296 2301 W 0x60'76.0 [184,11,0,0]
47839 2543 R 0x60'41.0 [80,2]

TODO: Check if armarx io map size changes

ArmarX working execution:

Time since first Time between last R/W Address Data
0 0 R 0x100a.0 [1,0,0,0,0,0,0,0,186,85,100,43,235,120,0,0,74,66,11,44,235,120,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]
1000 1000 W 0x1a08.0 [0,0,]
3000 2000 W 0x1608.0 [0,0,]
10000 7000 W 0x1607.0 [7,0,32,0,255,96,32,0,122,96,32,0,132,96,32,0,131,96,16,0,115,96,16,0,64,96,16,0,113,96,0,0,0,0,]
12000 2000 W 0x1608.0 [2,0,8,0,96,96,8,0,126,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]
14000 2000 W 0x1c12.0 [2,0,7,22,8,22,]
15000 1000 W 0x1a07.0 [7,0,32,0,100,96,32,0,108,96,32,0,2,16,32,0,253,96,16,0,65,96,16,0,119,96,16,0,120,96,0,0,0,0,]
17000 2000 W 0x1a08.0 [2,0,8,0,97,96,8,0,97,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,]
19000 2000 W 0x1c13.0 [2,0,7,26,8,26,]
24000 5000 W 0x6060.0 [8,]
30000 6000 W 0x60ff.0 [0,0,0,0,]
32000 2000 W 0x607a.0 [0,0,0,0,]
34000 2000 W 0x6071.0 [0,0,]
36000 2000 W 0x60c2.1 [2,]
38000 2000 W 0x605d.0 [1,0,]
40000 2000 W 0x605a.0 [5,0,]
43000 3000 W 0x6076.0 [232,3,0,0,]
45000 2000 W 0x6075.0 [88,27,0,0,]
47000 2000 W 0x6073.0 [184,11,]
49000 2000 W 0x607b.1 [192,189,240,255,]
51000 2000 W 0x607b.2 [64,66,15,0,]
54000 3000 W 0x607d.1 [192,189,240,255,]
56000 2000 W 0x607d.2 [64,66,15,0,]
58000 2000 W 0x607f.0 [0,202,154,59,]
61000 3000 W 0x6080.0 [255,255,255,127,]
63000 2000 W 0x60f2.0 [34,0,]
65000 2000 R 0x1003.0 [0,]
68000 3000 R 0x6041.0 [58,58,]
70000 2000 W 0x8000.1 [118,]
71000 1000 W 0x8000.3 [10,0,]
72000 1000 W 0x8000.4 [0,]
73000 1000 W 0x8000.5 [0,]
75000 2000 W 0x8000.6 [0,]
76000 1000 W 0x8000.7 [1,]

Comparison ArmarX and robot_control ethercat setup

Register descriptions:

Register Description
0x100a (ds301) manufacture software version
0x16XX PDO optput mapping
0x1AXX PDO input mapping
0x1c12 SM2 Outputs PDO assignment
0x1c13 SM3 Inputs PDO assignment
0x6060 Modes of operation value 8...127 Reserved
0x60FF Target Velocity int32
0x607A Profile target position int32 (set position if profile position mode is selected)
0x6071 Target torque int16
0x60c2 Interpolation time period (object 0x80) (between two positions)
.1 Interpolation time unit 1..255 msec
0x605D Halt option code int16 (value 1: Slow down on slow-down ramp)
0x605A Quick stop option code int16 (value 5: Slow down on slow-down ramp and stay in QUICK STOP)
0x6076 Motor Rate Torque uint32 in mNm
0x6075 Motor Rate Current uint32
0x6073 Max current int16
0x607B Position range limit int32
.1 Min position range limit int32 (SimplIQ Command Reference Manual XM[1])
.2 Max position range limit int32
0x607D Software position limit
.1 Min position limit
.2 Max position limit
0x607E Polarity
0x607F Max profile velocity uint32
0x6080 ?
0x6081 Profile velocity uint32 (SimplIQ Command Reference Manual SP command)
0x60f2 ?
0x8000 (ds301) standardised device profile area. Describes device parameters and the device functionality.
0x1003 predefined error field uint32
0x603f Error Code
0x6041 Statusword (present state of the driver)
CANopen DSP 402 Implementation Guide S.29 Statusword flags:
[58,58] = 1110100011101000b
Ready to switch on = 1
Switched on = 1
Operation enabled = 1
Fault = 0
Voltage enabled = 1
Quick Stop = 0
Switch on disabled = 0
Warning = 0
Manufacterer specific = 1
Remote = 1
Target reached = 1
Internal limit active = 0
Operation mode specific = 10
Manufacturer specific = 00

[80,2] (little endian)= 0x250 = 0b0000001001010000
Ready to switch on = 0
Switched on = 0
Operation enabled = 0
Fault = 0
Voltage enabled = 1
Quick Stop = 0
Switch on disabled = 1
Warning = 0
Manufacterer specific = 0
Remote = 1
Target reached = 0
Internal limit active = 0
Operation mode specific = 00
Manufacturer specific = 00 |

[80,18] (little endian)= 0x1250 = 0b0001001001010000
Ready to switch on = 0
Switched on = 0
Operation enabled = 0
Fault = 0
Voltage enabled = 1
Quick Stop = 0
Switch on disabled = 1
Warning = 0
Manufacterer specific = 0
Remote = 1
Target reached = 0
Internal limit active = 0
Operation mode specific = 00
Manufacturer specific = 00 |

Compare robot_control fail and robot_control success: All data fields match exactly. Even the status word 0x6041.

The overall execution time is almost equal. The send time varies less than 1ns for each sdo_write.

Compare ArmarX and robot_control success: ArmarX took 20ns (41%) longer than robot_control.

ArmarX sets 0x1a08 0v1608 to 0 before setting the PDO mappings The PDO mappings differ slightly. That shouldn’t be relevant.

robot_control writes 32bit (each 0) more into 0x1c13 (SM3 inputs PDO assignment). According to BECKHOF Standard Objects for all EtherCAT 0x1c13 is type uint8

  • 0x6076 has different data: ArmarX [232,3,0,0] robot_control [184,11,0,0]
  • 0x6075 has different data: ArmarX [88,27,0,0] robot_control [172,13,0,0]
  • 0x6073 has different data: ArmarX [184,11] robot_control [80,195]
  • 0x607b.1 has different data: ArmarX [192,189,240,255] robot_control [0,0,0,0]
  • 0x607b.2 has different data: ArmarX [64,66,15,0] robot_control [0,0,0,0]
  • 0x607d.1 has different data: ArmarX [192,189,240,255] robot_control [0,0,0,128]
  • 0x607d.2 has different data: ArmarX [64,66,15,0] robot_control [255,255,255,127]
  • 0x607f is only set with ArmarX
  • 0x6080 is only set with ArmarX
  • 0x6081 is only set with robot_control but to the same value as 0x6080 with ArmarX
  • The status word read differs: ArmarX [58,58] robot_control [80,2]
  • 0x8000 is only set with ArmarX

Some commands are sent in a different order.

Edited by Tobias Hogh