Firmware 1.0 communication structure
The input/output communication protocol follows the CiA402 design specification can be found here: dsp402.pdf
Here is a summary of the commonly used PDO structures:
- RxPDOs: some nice docs
- TxPDOs: some nice docs
Here is the chosen structure of the PDOs. They now follow relatively well the CiA4 standard. The Indexes correspond to the indexes in the standard and the sub-indexes correspond to the axis of the actuaror 2 axis for orbita2d and 3 axis for orbita 3d.
OrbitaIn
(RxPdo) - Master to SlaveOrbitaState
(TxPdo) - Slave to MasterOrbitaOut
(TxPdo) - Slave to Master
Attribute | OrbitaIn (RxPdo) | OrbitaState (TxPdo) | OrbitaOut (TxPdo) |
---|---|---|---|
sm_type | BUFFERED | MAILBOX | BUFFERED |
address | 1000 | 1200 | 1300 |
name | OrbitaIn | OrbitaState | OrbitaOut |
write frequency | 1kHz | 10Hz | 1kHz |
orbita2d size | 43 Bytes | 31 Bytes | 27 Bytes |
orbita3d size | 63 Bytes | 45 Bytes | 39 Bytes |
Some important notes
- LAN9252 limits the number of PDO objects supported to 4, so we could potentially add one more PDO object to the list.
- LAN9252 limits the number of bytes that can be written to its memory at once to 64 bytes (otherwise we need to write the data in 64B chunks). This is why the size of the PDOs is important and they are all under 64 bytes.
- Therea are two types of Sync Managers (
sm_type
) used with the firmware for EtherCAT communiction:BUFFERED
andMAILBOX
. TheBUFFERED
type is used for theOrbitaIn
PDOs, because we want to send the data as fast as possible. TheMAILBOX
type is used for theOrbitaState
andOrbitaOut
PDOs, because we want to send the data at a slower rate.BUFFERED
type buffers the data in the master and we do not see any potential data loss if the slave is not able to read/write the data in time.MAILBOX
type uses a handshake mechanism to ensure that the data is received by the master and is mostly used for punctual data that is not time sensitive.
OrbitaIn (RxPdo) - Master to Slave
Entry Name | Entry Type | Index | Sub-Index |
---|---|---|---|
controlword | UINT16 | 0x6041 | - |
mode_of_operation | UINT8 | 0x6060 | - |
target_position | REAL | 0x607A | 1, 2, … (up to orbita_type) |
target_velocity | REAL | 0x60FF | 1, 2, … (up to orbita_type) |
velocity_limit | REAL | 0x607F | 1, 2, … (up to orbita_type) |
target_torque | REAL | 0x6071 | 1, 2, … (up to orbita_type) |
torque_limit | REAL | 0x6072 | 1, 2, … (up to orbita_type) |
OrbitaState (TxPdo) - Slave to Master
Entry Name | Entry Type | Index | Sub-Index |
---|---|---|---|
error_code | UINT16 | 0x603F | 0 (homing), 1,2, .. (up to orbita_type) |
actuator_type | UINT8 | 0x6402 | - |
axis_position_zero_offset | REAL | 0x607C | 1, 2, … (up to orbita_type) |
board_temperatures | REAL | 0x6500 | 1, 2, … (up to orbita_type) |
motor_temperatures | REAL | 0x6501 | 1, 2, … (up to orbita_type) |
OrbitaOut (TxPdo) - Slave to Master
Entry Name | Entry Type | Index | Sub-Index |
---|---|---|---|
statusword | UINT16 | 0x6040 | - |
mode_of_operation_display | UINT8 | 0x6061 | - |
actual_position | REAL | 0x6064 | 1, 2, … (up to orbita_type) |
actual_velocity | REAL | 0x606C | 1, 2, … (up to orbita_type) |
actual_torque | REAL | 0x6077 | 1, 2, … (up to orbita_type) |
actual_axis_position | REAL | 0x6063 | 1, 2, … (up to orbita_type) |