CANopen Basics: The Object Dictionary and the PDO/SDO Division of Labour
All CANopen communication behaviour can be reduced to one sentence: every accessible item of data sits in the “object dictionary”; PDOs move process data at high speed, and SDOs read and write parameters slowly. A fieldbus magnetostrictive displacement sensor follows the CiA DSP 406 encoder profile. The position value sits in the 0x6000 region of the object dictionary and is reported cyclically as INT32 via a TPDO; configuration parameters such as node address, resolution and zero offset are read and written via SDO. Understanding the division of labour between these two channels is the prerequisite for connecting the sensor to a CAN network. This article follows the fieldbus-wiring basics in the practical CANopen and EtherCAT guide; the corresponding product is Series 194 CANopen.
The object dictionary: CANopen’s data map
The object dictionary (OD) is a standardised data table inside every CANopen slave. Each entry is uniquely located by an index and a sub-index. Index ranges are divided by the CiA specification: a communication-parameter region, a manufacturer-specific region, and a standard device-parameter region defined by the particular device profile.
For a displacement sensor the key point is that it follows the DSP 406 encoder profile. That means CANopen displacement sensors from different manufacturers and of different models place the position-value object in the same region (0x6000), with the data type unified as a 32-bit signed integer. The master can therefore parse in a standard way, without writing parse code for each brand — which is the point of a profile. The position value is absolute position; after a power-loss restart, homing is unnecessary. The principle is given in absolute vs. incremental position.
Note: what INT32 returns is a “count”, not millimetres. Actual displacement = count × resolution step. Resolution grades are supplied as 1 / 2 / 5 / 10 / 20 / 50 / 100 μm. If the master does not convert according to the actual grade, the reading is wrong by a whole factor — the most common source of “the number looks wrong” for a newcomer. The relation between resolution grade and accuracy is given in the distinction among resolution, repeatability and non-linearity.
PDO: the high-speed channel that cyclically carries the position value
A PDO (Process Data Object) is used to transfer real-time process data. Its character is no protocol overhead, a single frame delivered directly, and a producer–consumer model. The sensor sends the position value to the master using a TPDO (Transmit PDO — “transmit” from the slave’s viewpoint).
A PDO has three key configuration dimensions:
- PDO mapping: specifies which objects this frame contains and how many bytes each occupies. A position-value INT32 occupies 4 bytes. A standard CAN data-frame payload is at most 8 bytes, so a single TPDO can hold at most two INT32 position values — hence the configuration constraint in a multi-magnet scene; see configuring CANopen multi-magnet reading.
- Transmission type: common options are event-triggered (send on a position change), cyclic timed send, and SYNC-triggered (send together after receiving the master’s SYNC telegram). A multi-axis system should prefer SYNC triggering so that the sampling instants of the axes are aligned.
- Telegram identifier (COB-ID): the CANopen predefined connection set allocates automatically as “base address + node address”, so when the node address changes, the telegram ID changes with it. Receive filters on the master side must be updated in step.
SDO: the point-to-point channel that reads and writes parameters
An SDO (Service Data Object) is a confirmed client–server access: the master sends a request (stating index/sub-index and data) and the slave returns a response. It can access any entry in the object dictionary and supports data of any length, but every access is a question-and-answer, so efficiency is low and latency is indeterminate.
The correct use of SDO is the configuration phase: writing node address and baud rate, setting the resolution grade, writing the zero offset, configuring PDO mapping and transmission type, and executing a parameter-store command. Never poll the position value with SDO — one SDO exchange is at least two frames; multi-axis polling rapidly fills bus bandwidth and makes the timestamp of the position data lose determinism. This is the number-one cause of CANopen site load running out of control.
PDO versus SDO
| Dimension | PDO (Process Data Object) | SDO (Service Data Object) |
|---|---|---|
| Communication model | Producer–consumer, broadcast | Client–server, point-to-point |
| Acknowledged? | Not acknowledged; send and go | Every read and write is answered |
| Data volume per transfer | ≤ 8 bytes (single frame) | Unlimited length; can be segmented |
| Real-time performance | High; latency determinate | Low; latency indeterminate |
| Typical use | Cyclic reporting of position value (0x6000 region INT32) | Node address, resolution, zero offset, PDO-mapping configuration |
| Trigger | Event / timed / SYNC | Master initiates on demand |
| Phase of use | Run phase | Configuration phase |
| Consequence of misuse | Wrong mapping puts data in the wrong place | Polling position with it overloads the bus |
The NMT state machine: why no data are received after power-up
A CANopen slave has an NMT (network management) state machine: after power-up it enters initialisation, then automatically moves to the Pre-Operational state. In this state SDO is available and PDOs are not sent. Only after the master issues the NMT start command and the slave enters the Operational state does the TPDO begin reporting the position value.
On site, “SDO can read position but the PDO never has data” is, nine times out of ten, because the master has not switched the node to Operational, or the master’s auto-start option is not enabled. Two further cyclic telegrams should be understood: the heartbeat is used for node-alive monitoring, from which the master judges a dropped station; an EMCY emergency telegram is issued by the slave on its own initiative when it detects an internal error (for example magnet lost, internal self-test abnormal). It is the most valuable diagnostic entry; the master side should log it, not discard it.
Standard sequence for connecting one sensor
- Get the physical layer right first: CAN_H / CAN_L differential pair + screen, linear topology, one 120 Ω terminating resistor at each end of the segment, none on intermediate nodes. The principle is given in terminating resistors and bus length: why it has to be 120 Ω.
- Set node address and baud rate: node-address range 1–127, unique on the whole network; baud rates supported are 10 / 20 / 50 / 125 / 250 / 500 / 800 / 1000 kbps, and the whole network must be the same. The configuration method is given in CANopen node address and baud rate configuration in practice.
- Import the EDS file: the master uses it to recognise object-dictionary entries, avoiding filling indexes by hand.
- Configure PDO mapping and transmission type: confirm that the position value is mapped into a TPDO; on a multi-axis system select SYNC triggering.
- Switch to Operational: confirm cyclic TPDO reporting, and check that count × resolution agrees with the actual stroke.
How to choose among protocols is covered in comparing the whole fieldbus range; the mapping of master systems to protocols is in selection guide: which fieldbus does my PLC support?; product parameters and pin-out are in Series 194 CANopen explained.
Frequently Asked Questions
Q: What is the difference between a CANopen PDO and an SDO?
A PDO is a producer–consumer process-data channel: a single unacknowledged frame with determinate latency, used for cyclic reporting of the position value. An SDO is a confirmed client–server access that can read and write any object-dictionary entry but with indeterminate latency, used to write parameters in the configuration phase. The position value must go via PDO; polling position with SDO will run bus load out of control.
Q: Is the INT32 read from a CANopen displacement sensor a millimetre value?
No. What is read is a count; actual displacement equals count multiplied by the resolution step. Resolution grades are supplied as 1/2/5/10/20/50/100 μm. If the master does not convert according to the actual grade, the reading is wrong by a whole factor.
Q: Why can SDO read data after power-up but no PDO is received?
After power-up a CANopen slave enters the Pre-Operational state, in which SDO is available but PDOs are not sent. The master must issue the NMT start command so that the node enters the Operational state before the TPDO begins reporting the position value.
Q: Why can the master no longer read data after the node address is changed?
The CANopen predefined connection set generates telegram identifiers from a function-code base address plus the node address. When the node address changes, all telegram IDs change with it. Receive filters and mapping tables on the master side must be updated in step, otherwise the device appears on-line but has no data.
Q: What does the DSP 406 profile mean for a displacement sensor?
DSP 406 is CiA’s encoder profile. It places the position-value object uniformly in the 0x6000 region as INT32. CANopen displacement sensors from different manufacturers can therefore be parsed by the master in a standard way, without writing parse logic for each brand.







