Keyence KV Nodes
Read and write Keyence KV PLCs directly from pipelines over Host Link. Each operation has its own node in the Pipeline Designer (Keyence Read, Keyence Block Read and Keyence Write), plus a Keyence Read Group node that runs several reads in one node.
For connection setup, device addressing, data types and per-function fields, see the Keyence KV connection guide.
Configuration Quick Reference
| Field | What you choose | Details |
|---|---|---|
| Parameters | Connection, Function, Function Parameters, Timeout Override | Select the Keyence 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. |
Keyence Read Node
Read one typed value from a device or tag, or Count consecutive values as a list. Runs a keyence.read.device function.
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | Keyence connection profile to use |
| Function | Selection | Yes | A keyence.read.device function from the selected connection |
| Function Parameters | Dynamic | Varies | Auto-populated from the function (device, dataType, count, length). See Read Device. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
Output Structure
quality is good when the PLC answered: an error reply (E0–E6) fails the node instead of storing a value, so a value that reached the result is the PLC's own reading.
{
"result": {
"device": "DM100",
"dataType": "DINT",
"value": 1234,
"quality": "good"
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 6, "timestamp": "2026-09-30T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.device | string | The device or tag you read (a raw address such as DM100, or the tag name) |
result.dataType | string | The type the value was decoded as |
result.value | any | The decoded value (BIT → boolean, STRING → text, the rest → number); a list of values when Count is more than 1 |
result.quality | string | good: a PLC error reply fails the node instead of storing a value |
{{ $node["Keyence Read"].result.value }}
Keyence Block Read Node
Read many named, typed points in the fewest requests. Runs a keyence.read.block function.
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | Keyence connection profile to use |
| Function | Selection | Yes | A keyence.read.block function from the selected connection |
| Function Parameters | Dynamic | Varies | The dataPoints list. See Read Block. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
Output Structure
{
"result": {
"count": 2,
"values": { "count": 1234, "alarm": true },
"quality": "good",
"totalDataPoints": 2,
"totalReads": 2
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 9, "timestamp": "2026-09-30T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.values | object | Every point by its name |
result.count | number | How many points were decoded |
result.quality | string | good: a PLC error reply fails the node instead of storing a value |
result.totalDataPoints | number | How many points were requested |
result.totalReads | number | How many Host Link requests the points were merged into |
{{ $node["Keyence Block Read"].result.values.alarm }}
Points on the same device type are sorted by address. Neighbours within a small gap share one RDS request, and a run never exceeds the PLC's per-request count limit (1000 words on KV, 256 on a KV Nano). Relays, timers and counters are read in their own requests. totalReads shows how many requests the read used.
Keyence Write Node
Write one typed value to a writable device, or a list of values to consecutive devices in one request. Runs a keyence.write.device function.
A single relay is set or reset on its own (ST / RS), so relays the PLC changes meanwhile are never overwritten. A bit inside a data-memory word (DM100.05) is written by reading the word and writing it back with that bit changed. A write is sent once: the node does not repeat it when the PLC does not answer, and it does not run in a pipeline started by a late (replayed) input.
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | Keyence connection profile to use |
| Function | Selection | Yes | A keyence.write.device function from the selected connection |
| Function Parameters | Dynamic | Varies | device, dataType, value, length. The value field supports ((paramName)) templates. See Write Device. |
| Timeout Override | Number (seconds) | No | Override the default function timeout |
Output Structure
{
"result": {
"device": "DM200",
"dataType": "REAL",
"value": "72.5"
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 7, "timestamp": "2026-09-30T08:30:00Z" }
}
| Field | Type | Description |
|---|---|---|
result.device | string | The device or tag written |
result.dataType | string | The type the value was encoded as |
result.value | any | The value as given (after parameter substitution) |
A value the type cannot hold (70000 as WORD), a write to the read-only digital trimmer AT, or text longer than the string length fails the node before anything is sent to the PLC.
Validate values in a Condition node before writing to equipment. A setpoint or relay can move a motor, valve or actuator immediately.
Keyence Read Group Node
Execute multiple read functions from a single Keyence connection in one node. The read group runs the selected functions (in parallel or sequentially) and merges their results, which is ideal for collecting a line's data from one PLC without a node per function.
Merging neighbouring addresses into one request happens inside each keyence.read.block function. The connection still carries one request at a time, so parallel functions queue on the link rather than overtake each other.
Supported Function Types:
| Function Name | Purpose |
|---|---|
Read Device (keyence.read.device) | One typed value (or a list) per function |
Read Block (keyence.read.block) | A batch of named datapoints per function |
Node Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
| Connection | Selection | Yes | Keyence connection profile to use |
| Function Selection | Selection | No | Select Functions (default) reads the functions you list, All Functions reads every read function on the connection, By Labels reads every function whose labels match the labels you pick |
| Functions | List | With Select Functions | One or more read functions from the selected connection, each with an optional alias that becomes its output key |
| Execution Mode | Selection | No | How to execute the coalesced requests (parallel or sequential) |
| Continue on Error | Toggle | No | On by default: a failed read is recorded in the output and the other functions still run. Off: the node fails as soon as any function fails |
Output Structure
The node output is the canonical {result, _metadata} envelope: result holds one entry per function read, keyed by the function's output key; _metadata holds the group's accounting.
{
"result": {
"Press Count": {
"value": 1234,
"success": true,
"error": "",
"duration": 11,
"timestamp": "2026-09-07T08:30:00Z"
},
"Line Block": {
"value": { "count": 2, "values": { "Temperature": 72.5, "Alarm": false }, "quality": "good", "totalDataPoints": 2, "totalReads": 2 },
"success": true,
"error": "",
"duration": 19,
"timestamp": "2026-09-07T08:30:00Z"
}
},
"_metadata": {
"connectionId": "conn-123",
"connectionName": "Press Line KV-8000",
"total": 2,
"successful": 2,
"failed": 0,
"totalDuration": 83,
"executionMode": "parallel",
"originalRequests": 2
}
}
Each entry under result is one function's read — keyed by the function's alias, else its name, else its id:
| Field | Type | Description |
|---|---|---|
result.<alias>.value | any | What the function read — its own result.value when it has one (the decoded value for keyence.read.device, since its result carries value; the whole {count, values, …} object for keyence.read.block), otherwise its whole result. null when the read failed |
result.<alias>.success | boolean | true when this function's read succeeded |
result.<alias>.error | string | Why the read failed; empty when it succeeded — always present |
result.<alias>.duration | number | How long this function's read took, in milliseconds |
result.<alias>.timestamp | string | When the read was issued, RFC 3339 UTC |
The _metadata object is the group's execution summary:
| Field | Type | Description |
|---|---|---|
_metadata.connectionId | string | The connection every function was read on |
_metadata.connectionName | string | That connection's display name |
_metadata.total | number | How many functions the group ran |
_metadata.successful | number | How many read successfully — including the ones onChange then suppressed |
_metadata.failed | number | How many failed; successful + failed = total |
_metadata.totalDuration | number | Wall-clock time of the whole group, in milliseconds |
_metadata.executionMode | string | parallel or sequential |
_metadata.originalRequests | number | How many functions were selected to run |
_metadata.keyCollisions | string[] | Output keys that two or more functions resolved to — the later read overwrote the earlier under that key. Present only when it happened |
_metadata.configWarnings | string[] | Non-fatal problems in the node's config, each saying what was ignored. Present only when there were any |
_metadata.outputMode | string | onChange — present only in that mode |
_metadata.suppressedCount | number | onChange mode: how many successful reads were unchanged since the last run and left out of result |
_metadata.emittedCount | number | onChange mode: how many entries result carries — total − suppressedCount |
_metadata.suppressedKeys | string[] | onChange mode: the output keys left out as unchanged. Present only when at least one was |
_metadata.reason | string | onChange mode, when every successful read was unchanged: why result is empty — the node buffers instead of waking downstream |
Settings Tab
All Keyence 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 Test Function in the function form (on the connection page) to run every Keyence function against the live PLC before wiring it into a pipeline. It catches a wrong address, a hex/decimal mix-up, or a data type the device cannot hold.