Beckhoff TwinCAT Nodes
Read and write Beckhoff TwinCAT 2/3 PLCs directly from pipelines over the ADS protocol. Each function type authored on a TwinCAT connection is available as a matching node in the Pipeline Designer.
For connection setup, AMS routing, the symbolic addressing model, data types, and per-function configuration fields, see the Beckhoff TwinCAT connection guide.
For the event-driven trigger (ADS device notifications), see the TwinCAT Trigger node.
Configuration Quick Reference
| Field | What you choose | Details |
|---|---|---|
| Parameters | Connection, Function, Function Parameters, Timeout Override | Select the TwinCAT connection profile, pick a function, bind 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 behaviour on timeout or failure, and error strategy. All execution settings default to pipeline-level values. |
TwinCAT Read Nodes
Read PLC variables by symbol path. There are three read node types, one per read function:
Supported Function Types:
| Node | Function | Purpose | Common Use Cases |
|---|---|---|---|
| TwinCAT Read Symbol | twincat.read.symbol | Read one typed value by symbol path (or a 1-D scalar array as a list) | Setpoint readback, status/alarm flag, single process value |
| TwinCAT Read Block | twincat.read.block | Read many named symbols in one ADS sum-up request | Dashboard snapshots, historian logging, mixed-type process blocks |
| TwinCAT Read Struct | twincat.read.struct | Read a whole struct, decoded field-by-field into a nested object | Machine-status structs, recipe structs |
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | TwinCAT connection profile to use |
| Function | Selection | Yes | A read function of the matching type from the selected connection |
| Function Parameters | Dynamic | Varies | Auto-populated from the function schema (symbol/dataType for Read Symbol and Read Struct, or the dataPoints array for Read Block). See the TwinCAT connection functions for field-level 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, and ((paramName)) template placeholders where the function defines them.
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
Read Symbol — a single decoded value:
{
"result": {
"symbol": "MAIN.fbMotor.Speed",
"dataType": "LREAL",
"value": 72.5
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 9, "timestamp": "2026-06-05T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.symbol | string | Echoes the resolved symbol path (a raw path, or the path a tag alias resolved to) |
result.dataType | string | Data type used to decode the value |
result.value | any | The decoded value — BOOL → boolean, integer types → number, REAL/LREAL → number, STRING/WSTRING → string, a 1-D scalar array → list |
Read Block — a map of decoded values keyed by datapoint name:
{
"result": {
"values": {
"speed": 72.5,
"running": true,
"count": 100000,
"estop": false
}
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 12, "timestamp": "2026-06-05T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.values | object | Map keyed by datapoint name — every point that decoded successfully appears here. |
result.errors | object | (present only if some points failed) Map keyed by datapoint name → error message. Successful points still appear under values. |
Read Struct — a nested object keyed by member name:
{
"result": {
"symbol": "MAIN.stStatus",
"dataType": "ST_Status",
"value": {
"running": true,
"speed": 72.5,
"mode": 2,
"fault": { "code": 0, "active": false }
}
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 14, "timestamp": "2026-06-05T08:30:00Z" }
}
Access pattern in downstream nodes:
{{ $node["TwinCAT Read Symbol"].result.value }}
{{ $node["TwinCAT Read Block"].result.values.speed }}
{{ $node["TwinCAT Read Struct"].result.value.fault.code }}
A Read Block reads all of its data points in a single ADS sum-up request, regardless of how many points it carries — one round-trip instead of one per tag. A point that fails to resolve or decode is reported under result.errors and does not fail the rest of the batch.
TwinCAT Write Nodes
Write PLC variables by symbol path. There are two write node types:
Supported Function Types:
| Node | Function | Purpose | Common Use Cases |
|---|---|---|---|
| TwinCAT Write Symbol | twincat.write.symbol | Write one typed value to a writable variable | Setpoints, command/start flags, mode changes |
| TwinCAT Write Struct | twincat.write.struct | Write selected struct members in one atomic write, with optional field-merge | Recipe/config updates, partial struct download |
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | TwinCAT connection profile to use |
| Function | Selection | Yes | A twincat.write.symbol or twincat.write.struct function from the selected connection |
| Function Parameters | Dynamic | Varies | Auto-populated from the function schema (symbol, value, dataType for Write Symbol; symbol, fields, autoFill for Write Struct). The value and fields parameters support ((paramName)) templates — see the TwinCAT connection functions. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
All function parameters support expression syntax ({{ expression }}) and template placeholders (((paramName))). Use expressions like {{ $input[0].result.value }} (an upstream Read Symbol) to feed dynamic values into the value parameter.
Input
The node receives the output of the previous node as input.
Output Structure
Write Symbol — on success:
{
"result": {
"symbol": "MAIN.fSetpoint",
"dataType": "LREAL",
"value": "42.5"
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 11, "timestamp": "2026-06-05T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.symbol | string | The resolved symbol path that was written |
result.dataType | string | Data type used to encode the value |
result.value | any | Echo of the value that was written (after parameter substitution) |
Write Struct — on success:
{
"result": {
"symbol": "MAIN.stConfig",
"written": ["setpoint", "enabled", "mode"],
"autoFill": true
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 16, "timestamp": "2026-06-05T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.symbol | string | The struct that was written |
result.written | array | The struct members that were written |
result.autoFill | boolean | Whether unspecified members were preserved (true) or zeroed (false) |
A write to a read-only variable, or a Write Symbol against a struct, returns success: false with a descriptive error and the value is not changed on the PLC.
Always validate values in a Condition node before writing to industrial equipment. A setpoint or command flag can move a motor, valve, or actuator immediately. With Write Struct, remember that autoFill = false zeroes every member you didn't list — keep it on (the default) unless you intend to reset the whole struct.
Settings Tab
All TwinCAT 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: Pipeline Default (the pipeline's Error Handling setting), Stop Pipeline or Continue Execution |
When left at their defaults, these settings inherit from the pipeline-level execution configuration.
Use the Test Function button in the function form (on the connection page) to validate every TwinCAT read/write/struct function against the live PLC before wiring it into a pipeline. It is the fastest way to catch a wrong symbol path, wrong data type, or a read-only target — and the Symbol Browser confirms exact paths and types.