Configuring Omron CJ2M FINS Node Address for Ethernet Communication
Field engineers commissioning CJ2M-CPU3x CPUs with FINS/TCP often hit a class of error where the client reports a timeout, a bad response code, or an illegal node address even though the TCP socket connects, the IP address is correct, and Wireshark shows the request leaving the PC. The root cause is almost never the wire, the switch, or the firewall — it is a mismatch between the CJ2M's FINS node address and the TargetNodeAddress configured on the HMI/SCADA client. This article walks through the diagnosis, the exact CX-Programmer and CX-Integrator settings, the FINS/TCP frame structure to verify in Wireshark, and the recovery procedure when the PLC has been left at a default or factory value.
1. Problem Description
A typical symptom report looks like this:
- TCP connection to the CJ2M on UDP/TCP port
9600succeeds (no socket error). - The HMI driver (e.g., OmronEthernetFINSCom, FINS/TCP, OPC server, or Ignition's FINS driver) writes a request and receives no reply, or receives a reply with a non-zero FINS error code such as
0x0105(node address setting error) or0x0205(response timeout). - Wireshark captures the request going out, but no FINS response — or a response with the destination node address field (
DA1) still set to whatever the client broadcast (commonly 0 or 30). - Identical project communicates fine with a CP1H, CP1L, or NX/NJ controller. The failure is specific to the CJ2M (or any FINS node whose address has not been set).
Wireshark trace evidence is unambiguous: the FINS request packet has the correct magic bytes (46 49 4E 53 = "FINS"), correct command frame layout, source node derived from the PC's IP address last octet, and an incrementing service ID. The PLC either drops the packet at the FINS routing layer (because the destination node address has no match in its routing table) or replies with a routing error.
2. Root Cause: FINS Node Address vs. TargetNodeAddress
FINS routing uses a 3-layer address tuple per node: Network Address (0–127), Node Address (0–254), and Unit Address (0–255). For an Ethernet-attached CJ2M, the network address is typically the local network number (commonly 0 or 1) and the unit address is the CPU unit number (default 0 for the CPU itself, or 10 + EE for the built-in Ethernet port on some platforms). The node address is the value that must be unique on the FINS network and is the field most often misconfigured.
On a CJ2M-CPU3x with built-in EtherNet/IP, the node address is stored in the CPU Unit's Built-in Ethernet Port Settings, accessible from CX-Programmer. It is not automatically derived from the IP address unless the user explicitly selects the "Use IP address last octet" option. Factory-fresh units often ship with a node address that does not match the IP last octet, and the value the engineer entered in CX-Programmer while setting the IP may have been overlooked.
The client-side TargetNodeAddress parameter must equal this exact value. If the client sends DA1 = 0 (broadcast) and the CJ2M is configured with a unicast node (e.g., 201), the PLC will either ignore the frame or reply with a routing error. If the client sends DA1 = 30 and the PLC is node 201, the same happens. Only when DA1 = 201 matches does the FINS frame reach the CPU's communication unit and get serviced.
3. Affected Hardware and Firmware
The fix applies to any Omron controller that participates in a FINS/TCP or FINS/UDP conversation. The most common offenders:
| CPU Model | Built-in Ethernet? | FINS Node Address Set Via | Default Behaviour |
|---|---|---|---|
| CJ2M-CPU11 / 12 / 13 / 14 / 15 | No | CJ1W-ETN21 or CJ1W-EIP21 unit DIP switches / CX-Programmer | Node = 0 or unit-rotary value |
| CJ2M-CPU31 / 32 / 33 / 34 / 35 | Yes (EtherNet/IP) | CX-Programmer → Built-in Ethernet Port Settings → FINS/TCP or FINS/UDP tab | Often not auto-set from IP |
| CJ2H-CPU64 / 65 / 66 / 67 / 68 (-EIP) | Yes on -EIP variants | CX-Programmer → Built-in Ethernet Port Settings | Manual assignment required |
| CP1H / CP1L with CP1W-CIF41 | Option board | CX-Programmer → Option Board → Ethernet → FINS settings | Often auto-set from IP last octet |
| NX102 / NX502 / NJ501 / NJ301 | Yes (EtherNet/IP) | Sysmac Studio → Controller Setup → Built-in EtherNet/IP Port | Usually derived from IP; verify anyway |
For the official hardware reference, see the CJ-series CJ2 CPU Unit Hardware User's Manual (W472). Section 7 covers the built-in EtherNet/IP port, including how node address selection interacts with IP address assignment.
4. Required Materials and Prerequisites
- CX-Programmer version 9.5 or later (CX-One 4.x or Sysmac Studio for NJ/NX). FINS node address configuration requires at least CX-Programmer 7.x for legacy CJ2M.
- Online USB connection (CS1W-CN226 or equivalent) or Ethernet online connection to the CJ2M. USB is preferred for the first commissioning because it bypasses any FINS routing problem.
- A PC with Wireshark 3.x or later for FINS/TCP frame validation.
- The HMI/SCADA client tool that exposes
TargetNodeAddress(e.g., AdvancedHMI's OmronEthernetFINSCom, Ignition's FINS/TCP driver, Kepware Omron FINS driver, or a custom .NET/Python FINS client). - Network access to the PLC's IP on TCP port 9600 (FINS/TCP default). No firewall blocking inbound 9600 from the PLC to the PC.
5. Step-by-Step Resolution
5.1 Discover the PLC's current FINS node address
Before changing anything, read the value the PLC actually has. Two methods:
Method A — CX-Programmer (offline file):
- Open the project and double-click Settings under the CPU in the project tree.
- For CJ2M-CPU3x, expand Built-in Ethernet Port Settings.
- Open the FINS/TCP tab and the FINS/UDP tab.
- Note the FINS Node Address (FINS Node No.) field. If it shows 0, the PLC will ignore any unicast FINS frame sent to DA1 = 0 (it treats 0 as "local") and only accept broadcasts or specially routed frames.
Method B — Online via Ethernet:
- Connect CX-Programmer directly to the CJ2M's IP (PLC → Connect → Ethernet).
- If CX-Programmer connects successfully, the IP layer works. The node address is read in the same place as Method A, but with the live PLC selected.
- If CX-Programmer cannot connect, switch to USB and read the node address from the offline project that was last downloaded to the unit.
5.2 Set the FINS node address explicitly
Inside CX-Programmer → Built-in Ethernet Port Settings → FINS/TCP tab:
- Select "Use the following IP address conversion method" (do not leave on auto-default unless you have confirmed the IP last octet matches).
- Set FINS Node No. to a unique value in the range 1–254. The value
255is reserved for broadcast. Values above254are invalid and will be rejected by the CPU. - Common practice is to mirror the IP last octet (e.g., IP
192.168.250.201→ node201). This is the value that worked in the field — when the client was set toTargetNodeAddress = 201, communication succeeded. - Set FINS Network No. to your local network number (commonly
0or1). This is the value that appears in theDNA/SNAfields. - Set the FINS Node No. Conversion Table entries if you want explicit IP ↔ node mapping rather than 1:1 with IP last octet.
- Download the project to the PLC. The CPU will prompt to confirm the Ethernet setting change; accept.
CX-Programmer parameter map (illustrative default values — verify against your project):
| CX-Programmer Field | Tag in Frame | Default | Recommended |
|---|---|---|---|
| FINS Network No. | DNA / SNA | 0 | 0 (local) |
| FINS Node No. | DA1 / SA1 | 0 | IP last octet (e.g., 201) |
| IP Address | — | 0.0.0.0 | 192.168.250.201 |
| Subnet Mask | — | 0.0.0.0 | 255.255.255.0 |
| FINS/TCP Port No. | TCP dst port | 9600 | 9600 (do not change unless required) |
| FINS/UDP Port No. | UDP dst port | 9600 | 9600 |
5.3 Align the client TargetNodeAddress
On the HMI/SCADA client, change the parameter that controls the destination FINS node:
-
AdvancedHMI / OmronEthernetFINSCom: Set the driver's
TargetNodeAddress(sometimes labelledTargetNodeorDA1) to match the value set in step 5.2 (e.g.,201). - Ignition FINS/TCP driver: Set the PLC Address field on the device connection to the node number, not the IP address — Ignition uses the node as the FINS-level identifier and the IP only for socket connection.
- Kepware / TOP Server Omron FINS driver: On the channel or device, set Destination FINS Node Address.
-
Custom .NET / Python (pyFINS, fins.py): Set
DA1in the FINS frame header before callingsend_frame().
5.4 Verify in Wireshark
Apply the filter tcp.port == 9600 and trigger one read from the client. Inspect the request packet:
FINS/TCP Header (16 bytes):
46 49 4E 53 -- "FINS" magic
00 00 00 1A -- length (26 bytes of FINS frame)
00 00 00 00 -- command, error code
FINS Frame (26 bytes):
ICF = 0x80 -- command, response required
RSV = 0x00
GCT = 0x02 -- 2 gateways allowed
DNA = 0x00 -- dest network
DA1 = 0xC9 -- dest node = 201 <-- must equal PLC's FINS node
DA2 = 0x00 -- dest unit (CPU)
SNA = 0x00 -- src network
SA1 = 0x01 -- src node = PC IP last octet
SA2 = 0x00 -- src unit
SID = 0xN+ -- service ID, increments
MRC = 0x01 -- memory area read
SRC = 0x01
...data...
If DA1 = 0xC9 (= 201 decimal) and the response carries 0x0000 in the FINS end code field, the fix is confirmed.
6. FINS/TCP Frame Structure (for engineers)
Understanding the frame is essential for diagnosing this class of error. The complete FINS/TCP message has two parts: a 16-byte FINS/TCP header followed by a variable-length FINS frame.
| Offset | Bytes | Field | Purpose |
|---|---|---|---|
| 0 | 4 | Magic | ASCII "FINS" (46 49 4E 53) |
| 4 | 4 | Length | Length of FINS frame body (big-endian) |
| 8 | 2 | Command | 0x0001 = node address data send, etc. |
| 10 | 2 | Error code | 0x0000 = success |
| 12 | 2+ | FINS frame | Standard FINS routing + command |
The FINS frame body itself is laid out as:
| Byte | Field | Meaning |
|---|---|---|
| 0 | ICF | Information Control Field — bit 7 set = response required |
| 1 | RSV | Reserved (0x00) |
| 2 | GCT | Gateway count (max hops) |
| 3 | DNA | Destination Network Address |
| 4 | DA1 | Destination Node Address (THE value we are aligning) |
| 5 | DA2 | Destination Unit Address (CPU = 0x00, built-in Ethernet = 0xEF on some) |
| 6 | SNA | Source Network Address |
| 7 | SA1 | Source Node Address (often = PC IP last octet) |
| 8 | SA2 | Source Unit Address |
| 9 | SID | Service ID — incremented per transaction |
| 10+ | Command data | MRC + SRC + parameters + data |
7. Common FINS Error Codes Encountered During This Failure
| FINS End Code | Meaning | Likely Cause | Fix |
|---|---|---|---|
| 0x0000 | Normal completion | — | — |
| 0x0101 | Local node not in network | Node not set or duplicate | Set FINS node address |
| 0x0105 | Node address setting error | Node number > 254 or invalid | Set 1–254 |
| 0x0106 | Node address duplication | Two devices share the node | Make unique |
| 0x0201 | Dest node not in network | DA1 has no match | Correct TargetNodeAddress |
| 0x0202 | No node with that unit address | DA2 mismatch | Set DA2 = 0x00 for CPU |
| 0x0205 | Response timeout | PLC doesn't recognize DA1 | Same as 0x0201 |
| 0x0401 | Command format error | Bad ICF or malformed frame | Driver bug; update |
| 0x1101 | Read area error | Bad memory area code | Check area codes (DM, W, H…) |
| 0x110C | Read size error | Requested > max words | Reduce block size |
Codes 0x0105 and 0x0205 are the two that show up most often with the CJ2M node address mismatch described here.
8. Verification Procedure
After applying the configuration change and downloading to the PLC:
- Power-cycle is not required on CJ2M for FINS setting changes; the new node is live immediately. Existing TCP sessions are dropped — clients will reconnect.
- From the PC, run
ping 192.168.250.201. Confirm ICMP reachability. - Open Wireshark with capture filter
tcp port 9600. - Trigger a single read from the HMI client on a known memory address (e.g.,
D0000). - Confirm in the capture:
- Request frame has
DA1 = 0xC9(= 201). - Response frame has
SA1 = 0xC9(PLC replying from its configured node). - FINS end code =
0x0000. - Service ID in response matches request SID + 1 (per FINS convention).
- Request frame has
- In CX-Programmer, PLC → Monitor, force-toggle a bit in the read area and confirm the HMI sees the change within one poll cycle.
9. Extended Troubleshooting Matrix
| Symptom | Wireshark Evidence | Root Cause | Corrective Action |
|---|---|---|---|
| No FINS response at all | Single request, no reply | DA1 does not match PLC node | Set TargetNodeAddress to PLC node value |
| Response with 0x0201 | Reply DA1 = original request, code 0x0201 | PLC has no route for DA1 | Set PLC FINS node in CX-Programmer |
| Connection refused on TCP 9600 | SYN, RST/ACK | FINS/TCP not enabled, port changed | Enable FINS/TCP in Built-in Ethernet settings; check port |
| Connection succeeds, every read times out | Many requests, no replies | Firewall dropping reply from PLC; or DA2 wrong | Allow inbound from PLC IP; set DA2 = 0x00 |
| Reads succeed, writes fail | Read response OK, write no reply | DM write protection or wrong area | Use correct area code; check PLC DIP for DM protect |
| Reads slow / partially succeed | Many retries in trace | Communication overload on the port | Reduce poll rate; batch reads; raise PLC cycle time budget |
| All values zero / stale | Replies come back clean but data empty | Memory area mismatch (e.g., DM vs. D) | Use D for DM in client; verify in CX-Programmer |
| Reads work, then stop after 5–10 min | TCP RST after sustained traffic | Driver not handling keep-alive; or PLC CPU cycle too long | Enable TCP keep-alive in driver; reduce concurrent transactions |
10. Performance and Load Considerations
Once communication is established, do not assume the FINS/TCP session can sustain unlimited poll rates. The CJ2M's built-in EtherNet/IP port serializes FINS and CIP traffic on the same Ethernet processor. Practical limits observed in field deployments:
- Sustained FINS read throughput on a CJ2M-CPU31 with default scan time: roughly 50–80 single-word reads per second before response latency climbs above 100 ms.
- Block reads (e.g., 100 words per request) are dramatically more efficient than single-word polling — 10 block reads/sec ≈ 1000 words/sec with stable latency.
- Concurrent FINS/TCP clients: up to 16 simultaneous FINS/TCP sockets supported on CJ2M built-in Ethernet; exceeding this yields connection refusals.
- If the HMI is also consuming EtherNet/IP traffic (e.g., for NX-I/O or other CIP devices), budget the FINS bandwidth accordingly. Mixed load can push latency above 500 ms if the CPU scan time is > 20 ms.
11. CP1H / CP1L vs. CJ2M Behaviour Comparison
Engineers often confuse the CJ2M with the CP1H because both use FINS/TCP. They differ in one subtle but critical way for node addressing:
| Aspect | CP1H (with CP1W-CIF41) | CJ2M-CPU3x (built-in Ethernet) |
|---|---|---|
| Default FINS node source | Typically auto-set to IP last octet on first connection | Manual — must be set explicitly |
| CX-Programmer settings path | PLC → Option Board → Ethernet | PLC → Built-in Ethernet Port Settings |
| Node address visible in routing table? | Yes | Yes, same CX-Integrator view |
| Behaviour with DA1 = 0 | Often accepts as local | Routed as broadcast — usually dropped |
| Effect of mismatch | Often still responds | Hard fail — no response |
This asymmetry is why the same driver that works flawlessly on a CP1H fails silently on a freshly configured CJ2M. The fix is the same in principle (align the node), but the CX-Programmer navigation differs.
12. Preventative Configuration Checklist
For new CJ2M deployments, use this checklist to avoid the node address trap entirely:
- In CX-Programmer, set IP address, subnet mask, and gateway on the Built-in Ethernet Port TCP/IP tab.
- On the FINS/TCP tab, explicitly enter the FINS Node No. to match the IP last octet. Tick "Use the following IP address conversion method" with "Use IP address" as the conversion method if you want automatic 1:1 mapping.
- Record the node number in the PLC's nameplate comment so future engineers can correlate IP and FINS node without re-reading CX-Programmer.
- Download and verify with a single FINS read from a known-good client.
- Save the project to the PLC's Memory Card for backup.
13. Frequently Asked Questions
What is the default FINS node address on a factory-fresh CJ2M-CPU3x?
There is no defined default. The Built-in Ethernet Port Settings ship with node number 0 and the "automatic conversion" option unselected, so out-of-the-box the unit has no valid FINS node until CX-Programmer configures one. Always set it explicitly during commissioning.
Why does my driver work with a CP1H but fail with a CJ2M using the same project?
The CP1H (with CP1W-CIF41 option board) typically derives its FINS node from the IP last octet automatically, while the CJ2M-CPU3x does not. If your client sends DA1 equal to the IP last octet, the CP1H accepts it and the CJ2M rejects it. Align the CJ2M's node address in CX-Programmer to the same value, then communication works identically.
Does changing the FINS node address require a PLC restart?
No. CJ2M applies the new node immediately after the project download. Active FINS/TCP sessions are dropped, and clients reconnect within a few seconds. Schedule the change during a maintenance window if the line is running, but no full power cycle is needed.
What FINS end code indicates this specific node address mismatch?
The most common codes are 0x0201 (destination node not part of network) and 0x0205 (response timeout). If the request never gets a reply at all, you will not see an end code — you must read the Wireshark capture to confirm the request was sent with the correct DA1 value.
Can the FINS node address be different from the IP last octet?
Yes. The two are independent values. You can configure any node number 1–254 with any IP address. The "use IP last octet" option in CX-Programmer is a convenience mapping, not a requirement. Field deployments with managed FINS addressing often use sequential node numbers (1, 2, 3…) regardless of IP subnets.
Where can I find the official specification for FINS/TCP framing?
The CJ-series CJ2 CPU Unit Hardware User's Manual (W472) covers the built-in EtherNet/IP port in detail, including FINS node address configuration. Refer to the official Omron documentation portal for the latest revision before commissioning.