Skip to main content
Version: 3.0 (next)

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​

FieldWhat you chooseDetails
ParametersConnection, Function, Function Parameters, Timeout OverrideSelect the TwinCAT connection profile, pick a function, bind parameters with expression support, and optionally override the timeout.
SettingsDescription, Timeout (seconds), Retry on Timeout, Retry on Fail, On ErrorNode 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:

NodeFunctionPurposeCommon Use Cases
TwinCAT Read Symboltwincat.read.symbolRead 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 Blocktwincat.read.blockRead many named symbols in one ADS sum-up requestDashboard snapshots, historian logging, mixed-type process blocks
TwinCAT Read Structtwincat.read.structRead a whole struct, decoded field-by-field into a nested objectMachine-status structs, recipe structs

Node Configuration​

ParameterTypeRequiredDescription
ConnectionSelectionYesTwinCAT connection profile to use
FunctionSelectionYesA read function of the matching type from the selected connection
Function ParametersDynamicVariesAuto-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 OverrideNumber (seconds)NoOverride 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" }
}
FieldTypeDescription
result.symbolstringEchoes the resolved symbol path (a raw path, or the path a tag alias resolved to)
result.dataTypestringData type used to decode the value
result.valueanyThe 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" }
}
FieldTypeDescription
result.valuesobjectMap keyed by datapoint name — every point that decoded successfully appears here.
result.errorsobject(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 }}
Sum-up batching

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:

NodeFunctionPurposeCommon Use Cases
TwinCAT Write Symboltwincat.write.symbolWrite one typed value to a writable variableSetpoints, command/start flags, mode changes
TwinCAT Write Structtwincat.write.structWrite selected struct members in one atomic write, with optional field-mergeRecipe/config updates, partial struct download

Node Configuration​

ParameterTypeRequiredDescription
ConnectionSelectionYesTwinCAT connection profile to use
FunctionSelectionYesA twincat.write.symbol or twincat.write.struct function from the selected connection
Function ParametersDynamicVariesAuto-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 OverrideNumber (seconds)NoOverride 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" }
}
FieldTypeDescription
result.symbolstringThe resolved symbol path that was written
result.dataTypestringData type used to encode the value
result.valueanyEcho 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" }
}
FieldTypeDescription
result.symbolstringThe struct that was written
result.writtenarrayThe struct members that were written
result.autoFillbooleanWhether 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.

Safety First

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:

SettingTypeDefaultDescription
DescriptionText—Optional description displayed on the node
Timeout (seconds)NumberPipeline defaultMaximum time the node may run before timing out
Retry on TimeoutTogglePipeline defaultAutomatically retry the node if it times out
Retry on FailTogglePipeline defaultAutomatically retry the node if it fails
On ErrorSelectionPipeline defaultError 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.

Test before wiring

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.