# CANopen Extensive Guide: [YouTube: CANopen Course - EmSA CANopen](https://youtube.com/playlist?list=PLXc1T5NMSXQufsSlsN6unfDxT6ojiK_sn&si=6XUcZh8HnZZHbiwL) Practical Guide: [YouTube: CANOpen Node STM32 From basics to coding ](https://youtu.be/R-r5qIOTjOo?si=hjjJt6-FHXHmk5BB) CANOpen is a Higher Layer Protocol (HLP) that is built on top of CAN Protocol to enable a standardisation and advance features over traditional CAN Protocol. ## Why is it needed? - How do you detect device connectivity (Heartbeat in CANOpen) - How do you figure out configuration change? (Configuration of Frequency in CANOpen) - Standardisation to connect to any device off-market without requiring special configurations. - Supports Device ID (Node ID) which allows P2P Communication (SDO) - Allows One to Many Communication (PDO) - Network Managament: Device Detection, Operational states, reset - Service Access: Point to Point, any data size - Data Access: Multicast, various trigger options - Standard Documentation for various applications like Motors, Drives, etc. --- ## Important Concepts - **Network Management (NMT)** - Used to execute NMT Services which are used for device initialization, started, monitored or stopped - Works in Master/Slave Structure with Node being NMT Master. - Bootup: Transmitted upon device initialisation to inform other nodes about its existence. - Master can control operating states of nodes: - Request state change - Request Reset - **Synchronization (SYNC)** - **Emergency (EMCY)** - Emergency: Triggered by the occurrence of CANopen device internal error and are transmitted once for each error - **TimeStamp (TIME) (PDO)** - **Process Data Objects (PDO)** - Real-time data transfer from single node to other nodes - No protocol overhead - Max 4 bytes - Use Case: Transmit/Receive real time value to and from other nodes - Allows mapping to specific variables in node for automatic transmission or reception of stack - Can be triggered by Event, Timer, Remote node or Sync Object - **(Universal) Service Data Object (SDO)** - Provides access to all params of a object Dictionary - Used to Request changes/data and response is a confirmation to change or response to a data request. - Used to change configurations and run diagnostics - Can be of any parameter size. - Max 4 byte single request - Max 7 bytes per segment - Single Master/Client - Use Case: - Peer to Peer reliable communication - Configuring a device at startup - Transferring large amount of data with acknowledgement - **Node Monitoring (Heartbeat) (SDO)** - Heartbeat: Transmitted cyclically by node. Informs other node about connection status of the current producer node. **CANOpen Initialisation Process on Node** ![[01_CANOpen_Init_Process.png]] **Implementation Link**: [GitHub: C Implement for CANOpenNode](https://github.com/CANopenNode/CANopenNode) --- ## Data Definition - CANOpen uses "Little Endian" - Datatypes: - Unsignedxx(8,16,24,32) - Integerxx(8,16,24,32) - Floating, Time, Strings - Domain ## Node Monitoring (Heartbeat) **Heartbeat / Node Guard State Codes** These are the **1-byte values** you receive in the data field of a heartbeat message (`COB-ID = 0x700 + NodeID`): | **Hex** | **Binary** | **NMT State** | **Description** | | ------- | ---------- | ---------------------- | ---------------------------------------------------- | | `00` | `00000000` | **Initializing** | Power-on or reset; node not yet booted | | `04` | `00000100` | **Stopped** | Node is stopped (doesn’t process PDOs, only SDO/NMT) | | `05` | `00000101` | **Operational** | Fully active – sends/receives PDO, SDO, SYNC, etc. | | `7F` | `01111111` | **Boot-Up** | Node just booted – waiting for NMT command | | `7E` | `01111110` | **Pre-Operational** | Accepts SDOs, but does not process PDOs or SYNC | | `7D` | `01111101` | **Unknown** (reserved) | Not standard – may indicate vendor-specific state | --- ## Object Dictionary: Data Addressing - Object dictionary is a look-up table type structure which contains the index and subindex which links to the datatype and the description for the object. - It is predefined during the design of a component and follows ISO Standards. Can be generated using EDS Softwares. - Index: 16 bits, SubIndex: 8 bits which allows upto 24bit addresses for objects. - There are some predefined ranges: - 1000h - 1fffh: CANOpen Parameters to configure the CANOpen - 2000h - 5fffh: Manufacturer Specfic data - 6000h - Afffh: Profile defined data --- ## Process Data Object (PDO) - Generally in Producer/Consumer format. - Node is considered as server/producer with the client being considered as consumer. - This is a predetermined table which is used to communicate data at a higher frequency as it allows to club multiple data objects in response/requests and also does not require feedback on successful requests. --- ## Nodes and Networks Each device can be referred with Device ID: `<net id><node id>` - Nodes: - Supports upto 127 nodes - No duplicate node ID allowed - Networks: - Upto 255 networks can be connected via bridges --- ## Selected Profiles Available Readily available standards are available. CiA Device Profiles: - CiA401 Generic I/O - CiA402 Dives and motion control - CiA406 Encoders - CiA410 Inclinometer - CiA418/419 Batteries/Charger - CiA420 Extruder - CiA450 Pumps CiA Application Profiles: - CiA417 Lift Control Systems - CiA420/423/424/426/430/433 Train/Rail Vehicle ## Resources ### Theory [YouTube: CANopen Course - EmSA CANopen](https://youtube.com/playlist?list=PLXc1T5NMSXQufsSlsN6unfDxT6ojiK_sn&si=6XUcZh8HnZZHbiwL) ### Practical Implementation Guide - [YouTube: CANOpen Node STM32 From basics to coding ](https://youtu.be/R-r5qIOTjOo?si=hjjJt6-FHXHmk5BB) - [GitHub: C Implement for CANOpenNode](https://github.com/CANopenNode/CANopenNode)