Skip to main content
Version: 2.4.0

Omron Omron FINS Integration Guide

Talk directly to Omron PLCs using MaestroHub's Omron FINS connector. This guide walks you through the connection settings, how to author each function type, what the returned data looks like, and how to use the corresponding nodes in the Pipeline Designer.

If you have never worked with an Omron PLC before, start with the short Background section — it explains the vocabulary used throughout the rest of this page (FINS, DM, CIO, routing triples, and so on).

Overview

With the Omron connector you gain:

  • FINS/UDP support on port 9600 for CV, CS/CJ, CP, and NJ/NX series PLCs
  • Typed memory reads for Bit, Word, DWord, Real, Bytes, and String across the standard Omron memory areas (CIO, WR, HR, AR, DM, EM, TIM/CT, TASK_STATUS)
  • Batched multi-point reads — contiguous points in the same area are coalesced into a single FINS frame to minimise round-trips
  • Typed writes of single values or contiguous runs
  • Atomic bit control (Set / Reset / Toggle) via Force Set/Reset, which is safer than a full word rewrite
  • Cheap PLC clock reads — also useful as a lightweight health check
  • Automatic retries on transport-level failures, with configurable count and delay
  • Dynamic parameters — every function field accepts ((parameterName)) placeholders for use in pipelines

Background: what is FINS?

FINS (Factory Interface Network Service) is Omron's proprietary industrial protocol for PLC communication. This connector speaks FINS/UDP (port 9600), which is the most commonly enabled transport on Omron Ethernet units and built-in PLC Ethernet ports.

Every FINS message carries a six-field routing triple that identifies both endpoints on the FINS network:

  • Destination (the PLC): DNA (network number), DA1 (node number), DA2 (unit number)
  • Source (this client): SNA, SA1, SA2

On a single flat local network you typically leave all network numbers at 0, leave the destination node at 0 (MaestroHub derives it from the last octet of the PLC IP, which is the Omron convention), and pick a unique sourceNode for MaestroHub.

Omron memory is organised into named areas, each addressed in 16-bit words. The areas most people use day-to-day are:

AreaNameTypical useBit-addressableWritable
CIOCore I/OPhysical I/O channels, internal relaysYesYes
WRWork AreaGeneral-purpose scratch memoryYesYes
HRHolding RelayRetentive across power cyclesYesYes
ARAuxiliary RelaySystem flagsYes0..447 read-only; 448+ writable
DMData MemoryPrimary data area — setpoints, measurementsYesYes
EMExpansion MemoryAdditional data — requires a bank (0..12)YesYes
TIM_CT_PVTimer/Counter present valueCurrent timer/counter values (word only)NoYes
TIM_CT_FLAGTimer/Counter completion flagCompletion status (bit only)YesNo (read-only)
TASK_STATUSTask statusTask state flags (word only)NoNo (read-only)

When referring to a bit inside a word, the Omron convention is area address.bit — for example CIO 100.3 means bit 3 of word 100 in the CIO area.

Connection Configuration

Creating an Omron Connection

Navigate to ConnectionsNew ConnectionOmron FINS and configure the PLC endpoint. The form is organised into five tabs: Connection, Routing, Advanced, Functions, and Health.

1. Profile Information

FieldDefaultDescription
Profile NameA descriptive name for this connection profile (required, max 100 characters). Must be unique across all connections.
DescriptionOptional description for this Omron connection
LabelsKey-value pairs to categorise this connection (max 10 labels). Examples: line: line-1, area: packaging, model: cj2m.

2. FINS/UDP Endpoint

FieldDefaultDescription
PLC IP AddressIPv4 address of the target Omron PLC (e.g. 192.168.250.1) — required. Hostnames are not accepted.
FINS/UDP Port9600UDP port the PLC is listening on (1–65535). 9600 is Omron's default for FINS/UDP.
Network Access

FINS/UDP requires direct UDP connectivity to port 9600 on the PLC. There is no authentication at the protocol level — secure the network path with VLANs, firewall rules, or VPN tunnels. Most Omron Ethernet units enable FINS/UDP out of the box; if you cannot reach the PLC, check that FINS/UDP is enabled in CX-Programmer / Sysmac Studio and that no switch / firewall is dropping UDP 9600.

3. FINS Routing

The routing triple identifies where the FINS request is going and who is sending it. For a single PLC on a flat local network, the defaults almost always work — leave Destination Node at 0 and set a unique Source Node.

Omron FINS Routing

The Routing tab exposes the destination and source triples. For flat local networks the defaults are usually correct.

3a. Destination (the PLC)
FieldDefaultRangeDescription
Destination Network (DNA)00–127Destination FINS network number. 0 means "local network" — the common case for a single-switch/VLAN setup.
Destination Node (DA1)00–255Destination FINS node. 0 auto-derives from the last octet of the PLC IP address (Omron convention). Override only if the PLC's FINS node number has been manually configured to something other than its IP suffix.
Destination Unit (DA2)00–255Destination FINS unit. 0 targets the CPU unit (the normal choice). Override to address a specific CPU Bus Unit.
3b. Source (this client)
FieldDefaultRangeDescription
Source Network (SNA)00–127Source FINS network number. Leave 0 on flat local networks.
Source Node (SA1)1001–255Source FINS node — must be unique on the FINS network. Pick any number that is not already used by another FINS device (PLCs, HMIs, or other clients). A common convention is a "high" number (e.g. 100, 200) that humans won't accidentally reuse.
Source Unit (SA2)00–255Source FINS unit. 0 is correct for software clients like MaestroHub.
Source node conflicts

If two FINS clients use the same Source Node on the same FINS network, replies will get delivered to whichever one happens to be listening — you'll see intermittent timeouts or corrupted data. When in doubt, give each MaestroHub instance a unique Source Node.

4. Advanced Settings

FieldDefaultRangeDescription
Timeout (ms)20000–300000Per-request UDP response timeout.
Retries20–10Number of retries on transient (transport-level) failures. Protocol-level errors from the PLC are not retried.
Retry Delay (ms)2500–60000Delay between retry attempts.
Byte OrderBigEndianBigEndian / LittleEndianWord-level byte order. Omron PLCs use BigEndian by default — leave this unless you have a specific reason to change it.
Local Bind Address0.0.0.0IPv4 or emptyLocal IP interface to bind the outbound UDP socket to. 0.0.0.0 (all interfaces) is the normal choice. Pin to a specific NIC if the host is multi-homed and you need traffic to exit a particular interface.
Local Port96000–65535Local UDP port. 0 picks an ephemeral port. If the configured port is already in use, the connector automatically falls back to an ephemeral port.
Retry semantics

Only transport-level failures (UDP timeouts, socket closed, etc.) are retried. Protocol-level errors returned by the PLC — for instance "area not found" or "write protected" — surface immediately and are not retried.

Testing the Connection

Click Test Connection at the bottom of the form to verify connectivity before saving. The test performs a single Read Clock (FINS command 07 01) against the PLC — the cheapest possible FINS frame. A successful test proves:

  • UDP path to the PLC is open on the configured port
  • The routing triple is correct
  • The PLC is powered and its FINS service is online

A failing test typically means a network/firewall issue, the wrong IP, or the wrong routing. The dialog shows the underlying error message.

Function Builder

Creating Omron Functions

Once the connection is saved:

  1. Open the connection and navigate to the Functions tab
  2. Click New Function to open the function type selection dialog
  3. Choose one of Read Memory Points, Write Memory, Bit Control, or Read PLC Clock
  4. Fill in the Basic tab (name, description, labels) and the Configuration tab (function-specific parameters)
  5. Use the Test button to validate the function before saving
Omron Function Type Selection

Pick a function type. Each type has its own configuration form — read/write/bit-control/clock.

Each function has two configuration tabs:

  • Basic — Function name (required, max 100 characters, unique within the connection), optional description, and labels
  • Configuration — Function-specific parameters (memory area, address, data type, values, etc.)

Data Types

Omron values are decoded/encoded according to a small set of typed tags. The Words on Wire column shows how many 16-bit words each unit occupies in a FINS frame — this determines how count multiplies.

Data TypeWords on WireValue ShapeDescription
Bit— (bit frame)booleanSingle bit inside a word (requires bitOffset 0–15). Bit reads/writes use a different FINS frame (bit-addressed), so they are not merged with word reads.
Word1 per unitinteger (0–65535)Unsigned 16-bit word.
DWord2 per unitinteger (0–4,294,967,295)Unsigned 32-bit double word. Low word first, then high word — Omron's standard DWord layout.
Real2 per unitfloat (IEEE 754 single)32-bit floating point. Same low-word-first layout as DWord.
Bytes⌈N/2⌉ wordssingle byte arrayRaw byte buffer. The entire blob is treated as one value — the values array contains exactly one entry.
String⌈N/2⌉ wordssingle stringASCII string. Same blob semantics as Bytes; null-terminated on read.
Count vs Values
  • For reads, count is the number of units to read. Reading 5 consecutive DWords (count = 5) consumes 10 words on the wire.
  • For writes, the length of the values array implies the count. For Bytes/String, values must have exactly one entry (the blob itself).
  • For bit reads, count is the number of consecutive bits starting at bitOffset. A single-bit read sets count = 1.

Read Memory Points (omron.read)

Purpose: Read one or more typed data points from Omron PLC memory areas in a single call. The connector automatically coalesces contiguous same-area word points into a single FINS frame to minimise round-trips — if you read DM 100, DM 101, and DM 103 in the same request, that becomes one FINS read of DM 100..103.

Bit reads are not merged with word reads (they use a different FINS frame shape) and are issued one bit-point per frame.

Configuration Fields

FieldTypeRequiredDefaultDescription
Data PointsArrayYes1 entryList of data points to read (1 to 100).

Data Point Fields

FieldTypeRequiredDefaultDescription
NameStringYesdp1Unique key for this data point in the result. Must be unique across all points in the same read.
Memory AreaStringYesDMMemory area: CIO, WR, HR, AR, DM, EM, TIM_CT_PV, TIM_CT_FLAG, or TASK_STATUS. TIM_CT_FLAG is bit-only; TIM_CT_PV and TASK_STATUS are word-only.
AddressNumberYes0Starting word address (0–65535).
Data TypeStringYesWordOne of Bit, Word, DWord, Real, Bytes, or String.
CountNumberNo1Number of units to read (1–10000). For Bytes/String this is the length in bytes.
Bit OffsetNumberWhen dataType=Bit0Bit position within the word (0–15).
EM BankNumberWhen memoryArea=EM0Expansion Memory bank (0–12).

Example request

{
"dataPoints": [
{ "name": "zone_temp", "memoryArea": "DM", "address": 100, "dataType": "Real" },
{ "name": "setpoint", "memoryArea": "DM", "address": 102, "dataType": "Word" },
{ "name": "fan_running", "memoryArea": "CIO", "address": 50, "dataType": "Bit", "bitOffset": 3 },
{ "name": "recipe_name", "memoryArea": "DM", "address": 500, "dataType": "String", "count": 20 }
]
}

Example result (under the data key of the function result)

{
"results": {
"zone_temp": {
"values": [72.5],
"dataType": "Real",
"memoryArea": "DM",
"address": 100,
"count": 1
},
"setpoint": {
"values": [1024],
"dataType": "Word",
"memoryArea": "DM",
"address": 102,
"count": 1
},
"fan_running": {
"values": [true],
"dataType": "Bit",
"memoryArea": "CIO",
"address": 50,
"count": 1
},
"recipe_name": {
"values": ["MIX_A1"],
"dataType": "String",
"memoryArea": "DM",
"address": 500,
"count": 20
}
}
}

Result Fields (per data point)

FieldTypeDescription
valuesArrayDecoded values. Always an array — for scalars like Word/Real it's a single-element array; for String/Bytes it's a one-entry array holding the full blob.
dataTypeStringEchoes the configured data type.
memoryAreaStringEchoes the configured memory area.
addressNumberEchoes the starting word address.
countNumberEchoes the configured count.

If a single data point fails (e.g. a decode error or a per-point FINS end code), that point's entry contains an error field instead of values, category (error category), and optionally endCode (raw FINS end code). Other data points in the same request still succeed.

Use Cases: Poll process variables, batch-acquire recipe/setpoint data, monitor equipment state, read string labels and tags.

Write Memory (omron.write)

Purpose: Write a single value or a contiguous run of values to a writable Omron memory area. Writes to read-only areas (e.g. AR 0..447, TIM_CT_FLAG, TASK_STATUS) are rejected client-side before hitting the wire.

Configuration Fields

FieldTypeRequiredDefaultDescription
Memory AreaStringYesDMTarget writable area: CIO, WR, HR, AR, DM, EM, or TIM_CT_PV.
AddressNumberYes0Starting word address (0–65535).
Data TypeStringYesWordOne of Bit, Word, DWord, Real, Bytes, or String.
ValuesArrayYes[0]Values to write. For scalar types the array length is the number of units (e.g. [10, 20, 30] writes three Words to three consecutive addresses). For Bytes/String the array must contain exactly one entry (the whole blob). Supports ((parameter)) placeholders.
Bit OffsetNumberWhen dataType=Bit0Bit position within the word (0–15).
EM BankNumberWhen memoryArea=EM0Expansion Memory bank (0–12).

Example request — writing a Real setpoint to DM 200

{
"memoryArea": "DM",
"address": 200,
"dataType": "Real",
"values": [72.5]
}

Example request — writing a 10-character ASCII string to DM 500

{
"memoryArea": "DM",
"address": 500,
"dataType": "String",
"values": ["MIX_A1"]
}

Example request — writing three consecutive Words

{
"memoryArea": "CIO",
"address": 1500,
"dataType": "Word",
"values": [100, 200, 300]
}

Example result (under the data key of the function result)

{
"memoryArea": "DM",
"address": 200,
"dataType": "Real",
"written": 1,
"timestamp": "2026-04-21T08:30:00Z"
}

Result Fields

FieldTypeDescription
memoryAreaStringEchoes the target area.
addressNumberEchoes the starting address.
dataTypeStringEchoes the data type.
writtenNumberNumber of units written (length of the values array).
timestampStringISO 8601 / RFC 3339 UTC timestamp of the write.
Read-only guards
  • AR 0..447 — reserved system flags. Writes are rejected; AR 448+ is user-writable.
  • TIM_CT_FLAG — completion flags are read-only.
  • TASK_STATUS — read-only.
  • TIM_CT_PV — writable, but does not support bit-level access.

Always double-check your address before writing to production equipment.

Use Cases: Push setpoints, download recipe/configuration values, write ASCII labels, bulk-update consecutive registers.

Bit Control (omron.bit.control)

Purpose: Atomically set, reset, or toggle a single bit in a bit-addressable memory area. This is safer than a Write with dataType=Bit because it uses Omron's Force Set/Reset FINS commands at the PLC — no other bits in the same word are touched.

Use Bit Control when you need to flip a single bit (a start/stop flag, an alarm latch, a test indicator) without worrying about what the rest of the word looks like.

Configuration Fields

FieldTypeRequiredDefaultDescription
Memory AreaStringYesCIOBit-addressable area: CIO, WR, HR, AR, DM, or EM.
AddressNumberYes0Word address containing the bit (0–65535).
Bit OffsetNumberYes0Bit position within the word (0–15).
ActionStringYesSetOne of Set, Reset, or Toggle.
EM BankNumberWhen memoryArea=EM0Expansion Memory bank (0–12).

Example request — set motor-start bit CIO 100.3

{
"memoryArea": "CIO",
"address": 100,
"bitOffset": 3,
"action": "Set"
}

Example result (under the data key of the function result)

{
"memoryArea": "CIO",
"address": 100,
"bitOffset": 3,
"action": "Set",
"timestamp": "2026-04-21T08:30:00Z"
}

Result Fields

FieldTypeDescription
memoryAreaStringEchoes the target area.
addressNumberEchoes the word address.
bitOffsetNumberEchoes the bit position.
actionStringEchoes the action (Set / Reset / Toggle).
timestampStringISO 8601 / RFC 3339 UTC timestamp of the operation.
Atomicity
  • Set and Reset are atomic at the PLC (Force Set/Reset commands).
  • Toggle is implemented as read-modify-write (read word → flip bit → write word). If a second writer changes the same word between the read and the write, the toggle may clobber the other change. Use Set/Reset whenever you can.

Use Cases: Start/stop motors, clear alarm latches, trigger test indicators, flip flag bits without disturbing neighbours.

Read PLC Clock (omron.read.clock)

Purpose: Read the PLC's internal real-time clock. It's the cheapest possible FINS frame and takes no parameters, which makes it handy as both a real-time-clock sync source and a lightweight connectivity probe.

Configuration Fields

This function has no configuration fields.

Example result (under the data key of the function result)

{
"timestamp": "2026-04-21T08:30:42Z",
"dayOfWeek": 2
}

Result Fields

FieldTypeDescription
timestampStringPLC clock value as ISO 8601 / RFC 3339 UTC.
dayOfWeekNumberDay of week reported by the PLC (0 = Sunday, 1 = Monday, …, 6 = Saturday).

Use Cases: Log PLC time, drift monitoring, use as a cheap health-check function in scheduled pipelines.

Using Parameters

Every write-side field in Omron functions accepts ((parameterName)) placeholders. This lets you bind values at pipeline runtime (e.g. from an upstream node or a trigger payload) instead of hard-coding them into the function config.

ConfigurationDescriptionExample
TypeValidate the expected value typenumber, boolean, array, json, string
RequiredForce critical inputsRequired / Optional
Default ValueProvide a safe fallback0, false, "MIX_A1"
DescriptionDocument usage for other users"Setpoint in °C", "Recipe name"

Typical parameterised patterns:

  • values: [((setpoint))] — write a dynamic Real/Word setpoint
  • address: ((dmAddress)) — target a DM address selected by an upstream node
  • action: ((bitAction)) — decide Set vs Reset from a condition node

Testing Functions

Every Omron function can be tested before saving using the built-in Test dialog:

  1. Click the Test button in the function form
  2. The dialog shows an Execution Overview with the current configuration
  3. Override any parameter values in the Test Parameters section (for parameterised functions)
  4. Click Execute Test to run the function against the live PLC
  5. View the JSON response, including execution duration and timestamp

Pipeline Integration

Use the Omron functions you configure here as nodes inside the Pipeline Designer. Each function type exposes a matching node (connected.omron.read, connected.omron.write, connected.omron.bit.control, connected.omron.read.clock). Drag a node onto the canvas, bind it to the connection, select the function, and wire parameters from upstream outputs or constants.

For node-level details (full parameter reference, input/output schema, execution settings), see the Omron Nodes page.

Omron read node in pipeline designer

Omron Read node with connection binding and parameter configuration

Common Use Cases

Production Data Acquisition

Poll DM and CIO for production counts, cycle times, temperatures, and setpoints with a single Read Memory Points function, then forward the result to a historian, MQTT topic, or SQL database.

Supervisory Control

Validate operator inputs and write them back as setpoints (via Write Memory) or mode changes (via Bit Control) in response to business rules, approvals, or scheduled triggers.

Recipe / Configuration Download

Parameterise a Write Memory function with an ((array)) placeholder and push entire recipe blocks (arrays of Words/DWords/Reals) to DM in a single call.

Maintenance & Diagnostics

Expose alarm latches, AR system flags, timer/counter present values, and the PLC clock to dashboards and alerting pipelines. Bit Control makes it easy to clear an alarm latch in response to an operator acknowledgement.

Troubleshooting

Connection Issues

SymptomPossible CauseSolution
Connect fails with "failed to verify PLC connectivity"PLC unreachable or FINS/UDP not enabledPing the PLC; verify port 9600 is open end-to-end; check FINS service is enabled in CX-Programmer / Sysmac Studio.
Must be a valid IPv4 addressHostname entered instead of an IPHostnames are not accepted — enter the dotted-quad IPv4 (e.g. 192.168.250.1).
Intermittent timeouts / garbled repliesDuplicate Source Node on the FINS networkPick a unique Source Node (SA1) for each MaestroHub instance.
"bind: address already in use" on connectLocal port already bound (e.g. a second Omron connection)Leave Local Port at 9600 — the connector automatically falls back to an ephemeral port if the configured one is busy.
Routing works from a test tool but not MaestroHubWrong Destination NodeLeave DA1 at 0 to auto-derive from the PLC's IP, or enter the explicit FINS node configured on the PLC.

Function Issues

SymptomPossible CauseSolution
"memoryArea is required and must be a known area"Typo or unsupported areaUse one of the exact area labels listed in Background.
"emBank is required when memoryArea=EM"EM chosen without a bankFill in the EM Bank field (0–12). Check the PLC hardware configuration for available banks.
"bitOffset is required when dataType=Bit"Bit data type without an offsetEnter the bit position (0–15). 0 is a valid value.
Write fails with "write protected"Writing to AR 0..447, TIM_CT_FLAG, or TASK_STATUSThese ranges are read-only. Use AR 448+ for user-writable auxiliary relays.
Per-point error in a multi-point readArea not present on this PLC model, or a FINS end-code errorThe failing point's entry contains an error field plus FINS endCode — other points still return normally. Verify the area/address on the PLC.
"frame too large"Too many words in a single writeBreak the write into multiple smaller writes (keep each well under ~992 words, the FINS frame ceiling).
Use the Test dialog first

Every Omron function has a Test button. Always execute a test against the live PLC before wiring the function into a pipeline — it's the fastest way to catch wrong addresses, wrong data types, or routing mistakes.

Supported PLC Families

The connector has been validated against:

  • CV series (legacy)
  • CS / CJ series (CJ1M, CJ2M, CS1, CS1G, etc.)
  • CP series (CP1H, CP1L, CP2E, etc.)
  • NJ / NX series (NJ101, NJ301, NJ501, NX1P2, NX1P3, etc.)

Any PLC that exposes FINS/UDP on an Ethernet unit (built-in or add-on) should work. FINS/TCP is not yet supported — reach out if you need it.