CANopen Nodes
Communicate with CANopen PLCs, motor drives, and sensors over CAN bus from inside your pipelines. MaestroHub provides three CANopen connector nodes (SDO Read, SDO Write, and NMT Command) backed by a shared connection profile. For event-driven TPDO subscriptions, see the CANopen Trigger node.
Configuration Quick Reference
| Field | What you choose | Details |
|---|---|---|
| Parameters | Connection, Function, Function Parameters, Timeout Override | Select the CANopen connection profile, choose a function from that connection, configure function parameters with expression support, and optionally override the timeout. |
| Settings | Description, Timeout (seconds), Retry on Timeout, Retry on Fail, On Error | Node description, maximum execution time, retry behavior on timeout or failure, and error handling strategy. All execution settings default to pipeline-level values. |

CANopen SDO Read Node
CANopen SDO Read Node
Read a single Object Dictionary entry over SDO. The node issues a real SDO upload against the remote node and decodes the response bytes locally according to the configured data type.
Supported Function Types:
| Function Name | Purpose | Common Use Cases |
|---|---|---|
SDO Read (canopen.sdo.read) | Read an OD entry by (index, sub-index) | Statuswords, identity objects, vendor-specific configuration |
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | CANopen connection profile to use |
| Function | Selection | Yes | SDO Read function from the selected connection |
| Function Parameters | Dynamic | Varies | Auto-populated from the function schema (index, subIndex, dataType). See your CANopen connection functions for full parameter details. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
All function parameters support expression syntax ({{ expression }}) for dynamic values from the pipeline context.
Input
The node receives the output of the previous node as input. Input data can be referenced in function parameter expressions using $input.
Output Structure
On success the node produces:
{
"success": true,
"functionId": "<function-id>",
"data": {
"index": "0x1000",
"subIndex": 0,
"dataType": "uint32",
"value": 401
},
"durationMs": 12,
"timestamp": "2026-05-20T08:30:00Z"
}
| Field | Type | Description |
|---|---|---|
success | boolean | true when the SDO upload completed without an abort |
functionId | string | ID of the executed function |
data.index | string | OD index of the entry read, formatted as 0xNNNN |
data.subIndex | number | OD sub-index of the entry read |
data.dataType | string | Data type used to decode the response (see Data Types) |
data.value | any | The decoded value. Type matches dataType: bool returns a boolean, uint16 a number, string a string, etc. |
durationMs | number | Execution time in milliseconds |
timestamp | string | ISO 8601 / RFC 3339 UTC timestamp |
On an SDO abort, success is false, error contains the abort message (e.g. SDO abort 0x06020000: object does not exist in the object dictionary), and the per-call metadata includes the raw abortCode. See SDO Abort Codes for the table.

CANopen SDO Write Node
CANopen SDO Write Node
Write a value to an Object Dictionary entry via SDO. The connector encodes the value to the wire width implied by the data type, then issues a real SDO download.
Supported Function Types:
| Function Name | Purpose | Common Use Cases |
|---|---|---|
SDO Write (canopen.sdo.write) | Write an OD entry by (index, sub-index) | Setpoints, controlwords, mode changes, recipe parameters |
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | CANopen connection profile to use |
| Function | Selection | Yes | SDO Write function from the selected connection |
| Function Parameters | Dynamic | Varies | Auto-populated from the function schema (index, subIndex, dataType, value). The value field supports ((paramName)) templates; see your CANopen connection functions. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
All function parameters support expression syntax ({{ expression }}) for dynamic values. Use expressions like {{ $input.payload.target }} to feed dynamic values into the value parameter.
Input
The node receives the output of the previous node as input.
Output Structure
{
"success": true,
"functionId": "<function-id>",
"data": {
"index": "0x6040",
"subIndex": 0,
"dataType": "uint16",
"value": 15
},
"durationMs": 14,
"timestamp": "2026-05-20T08:30:00Z"
}
| Field | Type | Description |
|---|---|---|
data.index | string | OD index of the written entry, formatted as 0xNNNN |
data.subIndex | number | OD sub-index of the written entry |
data.dataType | string | Data type used to encode the value |
data.value | any | Echo of the value that was written (after parameter substitution and type coercion) |
On an SDO abort, success is false and error contains the abort message; see SDO Abort Codes.
Always implement validation and safety checks before writing to industrial equipment. CANopen Controlwords and target setpoints can put a motor, valve, or actuator into motion immediately. Use a Condition node upstream to bound the value, or gate the write behind an explicit operator action.

CANopen NMT Command Node
CANopen NMT Command Node
Send a Network Management command to drive a CANopen node through its CiA 301 state machine. Pass nodeId=0 to broadcast to every node on the bus.
Supported Function Types:
| Function Name | Purpose | Common Use Cases |
|---|---|---|
NMT Command (canopen.nmt.command) | Send an NMT command to one or all nodes | Drive startup, controlled shutdown, hung-node recovery |
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | CANopen connection profile to use |
| Function | Selection | Yes | NMT Command function from the selected connection |
| Function Parameters | Dynamic | Varies | Auto-populated from the function schema (command, nodeId). See NMT Commands. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
Input
The node receives the output of the previous node as input.
Output Structure
{
"success": true,
"functionId": "<function-id>",
"data": {
"command": "start",
"nodeId": 16
},
"durationMs": 3,
"timestamp": "2026-05-20T08:30:00Z"
}
| Field | Type | Description |
|---|---|---|
data.command | string | The NMT command that was sent (start, stop, preOperational, resetNode, resetCommunication) |
data.nodeId | number | The target node ID. 0 indicates a broadcast to every node on the bus. |
Setting Target Node ID to 0 broadcasts the command to every node on the CAN segment. A broadcast resetNode will hard-reset every device on the bus simultaneously. Use with care on shared segments.
Settings Tab
All three CANopen node types share the same Settings tab:
| Setting | Type | Default | Description |
|---|---|---|---|
| Description | Text | - | Optional description displayed on the node |
| Timeout (seconds) | Number | Pipeline default | Maximum time the node may run before timing out |
| Retry on Timeout | Toggle | Pipeline default | Automatically retry the node if it times out |
| Retry on Fail | Toggle | Pipeline default | Automatically retry the node if it fails |
| On Error | Selection | Pipeline default | Error strategy: stop the pipeline, continue to the next node, or follow the error output path |
When left at their defaults, these settings inherit from the pipeline-level execution configuration.