Problem Summary
An integrator wires a CJ1M-CPU11 plus three I/O modules to a PC running Citect (now AVEVA Plant SCADA) over RS-232C Sysmac-Way (Host Link C-mode) and the Citect driver reports a working link: the yellow SD/RD LED on the CPU flashes at 9600 baud, the analog meter on the HMI tracks CIO 2001 in real time, and digital input transitions from the CJ1W-ID201 module are correctly mirrored on Citect tags. The fault is one-directional. Pressing the Citect "Start" button never energises CIO 1.00 and the lamp driven by the CJ1W-OC201 contact output stays dark. The Citect kernel reports no comms error and the variable tag for the start command updates to "1" inside the Citect tag database, but the bit never makes it into the PLC. This is the classic CJ1M-to-Citect write problem and it has two independent root causes, both of which must be eliminated before the link becomes bidirectional.
System Reference Configuration
The hardware and software stack used to reproduce and resolve the fault is shown below. Use it as a baseline when you work with adjacent CJ1M variants (CPU12, CPU13, CPU21/22/23) — the memory map, Host Link behaviour, and Citect address syntax do not change across the family because CS1 and CJ1 share the same instruction set and address layout.
| Item | Model / Setting | Reference |
|---|---|---|
| CPU | Omron CJ1M-CPU11 compact CPU, RS-232C port on the CPU face, CX-Programmer 9.x compatible | CJ1M CPU Unit Hardware Reference Manual (W396) |
| Digital input | Omron CJ1W-ID201, 16-pt 24 VDC sink/source inputs, allocated to CIO word 0 | CJ1W-ID201 Operation Manual (W313) |
| Digital output | Omron CJ1W-OC201, 16-pt relay contact outputs, 250 VAC / 2 A or 24 VDC / 2 A per point, allocated to CIO word 1 | CJ1W-OC201 Operation Manual (W313) |
| Analog input | Omron CJ1W-AD041, 4-pt multi-range AI, 4-20 mA selected on the channel, normal resolution 1/4000 (0000 hex @ 4 mA, 0FA0 hex @ 20 mA) or high resolution 1/8000, 250 µs conversion per point | CJ1W-AD041/AD081 Operation Manual (W345) |
| SCADA | Citect 2016 or later, "CS1 [SysmacWay]" serial driver; CJ1 and CS1 share the same memory map | Omron KB: Citect to Omron PLC Serial Setup Guide |
| Programming tool | CX-Programmer 9.x, part of CX-One 4.x | CX-Programmer Operation Manual (W437) |
| Protocol | Host Link (Sysmac-Way / C-mode), 9600 bps, 7 data bits, even parity, 2 stop bits, unit number 00 | CS/CJ/NSJ Communications Commands Reference (W342) |
| Cable | OMRON XW2Z-200S (2 m) or XW2Z-500S (5 m) RS-232C cross cable, D-sub 9-pin male on the PLC end | CJ1M CPU Unit Hardware Reference Manual (W396) |
Root Cause 1 — PLC Is in Run Mode, Not Monitor Mode
Omron PLCs reject external writes that would alter program-controlled I/O while the CPU is in Run mode. The Host Link command W@ (bit write) or WR (word write) sent from Citect is accepted by the serial stack and the CPU replies with the correct acknowledgement frame, but the bit is written to I/O memory and either:
- immediately overwritten by the next scan if the rung resets it, or
- silently discarded by the CPU's write-protect logic because the operating mode is not Monitor or Program.
Citect does not flag this as a comms error; the ACK frame looks identical to a successful write, which is why the operator believes the command was sent. The diagnostic signature is unmistakable: every Citect write completes in 50–80 ms with no error logged, but the Citect tag and the actual PLC bit never agree because Citect reads back what it last wrote, not what the PLC currently holds. The only reliable check is to read the bit back from the PLC into a second Citect tag and compare.
The CPU startup mode is configured in CX-Programmer under PLC > Operating Mode > Startup Mode. The default is Run. Change it to Monitor and transfer the PLC Setup to the CPU. After a power cycle the CPU will boot into Monitor instead of Run and the Host Link master will then be able to force bits in scan program memory.
MD (MODE) command at startup. CJ1M and CS1 retain the configured startup mode in flash, so the Cicode trick is no longer necessary. If you are migrating a legacy project, leave the Cicode in place as a belt-and-braces measure; it is harmless on a modern CPU.Root Cause 2 — Citect Tag Overwrites a Physical Input Word
The integrator configured the Citect variable tag start as a digital tag at address 00001, which is CIO 0.01. Bit 01 of CIO 0 is the second physical input on the CJ1W-ID201 module. Writing to that bit in the host link is therefore a write to a real input. The CPU ignores the write because the input refresh at the start of the next scan overwrites it with the real field input value, and even if it did honour the write the safety implication of forcing a physical input is severe.
The correct pattern is to keep Citect commands on a separate work address and then copy the work bit into the start logic of the ladder program. The integrator's stop button (0.00) and the start button (0.01) on the ID201 are physical inputs; the Citect start and stop must occupy unused bits in the W area, e.g. W0.00 and W0.01. The ladder then OR's the physical start button with the SCADA start bit and feeds the seal-in circuit, so neither the operator nor the SCADA can lock the other out.
Memory-area map used by Citect on a CJ1M
| Area name | Address range | Word syntax in Citect | Bit syntax in Citect | Use |
|---|---|---|---|---|
| CIO | CIO 0000 to CIO 6143 |
0–6143 (decimal word number) |
00000 = CIO 0.00, 02001 = CIO 2001 |
Physical I/O, special I/O, CPU Bus Unit, DeviceNet, and the four AD041 words at CIO 2000–2003 |
| Work | W000 to W511 |
W0–W511
|
W00000 = W0.00 |
Internal scratch and SCADA hand-off bits |
| Holding | H000 to H511 |
H0–H511
|
H00000 |
Retained across power cycle, useful for operator setpoints |
| Auxiliary | A000 to A959 |
A0–A959
|
A00000 |
System flags, do not use for SCADA writes |
| Data Memory | D00000 to D32767 |
D0–D32767
|
n/a (word only) | General-purpose word storage, retained |
| Timer / Counter | T0000–T4095, C0000–C4095 |
T0, C0
|
Completion flag only | Used internally; let CX-Programmer manage |
Corrected tag database
| Tag name | Data type | Old (broken) address | New (working) address | Reason |
|---|---|---|---|---|
| stop_phys | DIGITAL | 00000 (read only) | 00000 (read only) | Physical stop button on ID201, no SCADA write |
| start_phys | DIGITAL | 00001 (read only) | 00001 (read only) | Physical start button on ID201, no SCADA write |
| motor_run | DIGITAL | 00100 | 00100 | Output to OC201 contact, write allowed |
| scada_start | DIGITAL | 00001 (bad, collides with input) | W00000 | SCADA-only start command in work area |
| scada_stop | DIGITAL | 00000 (bad, collides with input) | W00001 | SCADA-only stop command in work area |
| level_raw | INT | 02001 | 02001 | Analog input 2 on CJ1W-AD041, read only |
| level_pct | REAL | (derived) | level_raw / 40.0 | 0–100 % display, scaling on HMI |
Step-by-Step Fix
Step 1 — Reconfigure the Citect variable tags
- Open Citect Explorer and select I/O Server > Variable Tags.
- Delete or repurpose the tags that were pointing into CIO 0.
- Create
scada_startwith data type DIGITAL and addressW00000. - Create
scada_stopwith data type DIGITAL and addressW00001. - For the analog level, create
level_rawwith data type INT and address02001(word 2001 of CIO). - Create
level_pctwith data type REAL and a Citect expression oflevel_raw / 40.0. - Recompile the project and cycle the Citect I/O Server.
Step 2 — Patch the ladder program in CX-Programmer
- Open the project in CX-Programmer and go online with the CPU.
- Change the operating mode to Monitor (PLC → Operating Mode → Monitor).
- Edit the start/stop rung so it OR's the physical start button and the SCADA start bit, and seals in around the motor contact, as shown in the snippet below.
- Transfer the new program to the CPU.
Rung 1 — motor seal-in (3-wire start/stop): stop_phys scada_stop |--|/|--------|/|----------------( motor_run )--| | | | start_phys scada_stop | |--[ ]--------|/|----------+ | | | | | scada_start scada_stop| | |--[ ]--------|/|--------+ | | | |--( motor_run )---< seal-in branch >----------+
Both stop sources (the physical NC button and the SCADA stop bit) are wired as NC contacts in series. Either one breaks the seal. Both start sources (the physical NO button and the SCADA start bit) are wired as NO contacts in parallel, with the seal-in contact on motor_run latching the output after the start pulse is released.
Step 3 — Set PLC startup mode to Monitor
- In CX-Programmer, double-click PLC > Settings in the project tree.
- Open the Startup tab.
- Set Startup Mode to Monitor.
- Click Transfer to PLC and confirm. The setting is written to the CPU's flash and survives a power cycle.
Step 4 — Verify the Citect I/O device
- In Citect Explorer, open the I/O Devices folder and confirm the board is configured as CS1 [SysmacWay] (not "Omron [Hostlink]" — both exist and only the CS1 driver is correct for a CJ1M in Citect 2016+).
- Set the port to 9600, 7, E, 2 and unit number 00.
- On the same dialog, tick Special > Use Long Addresses if you are reading any address above CIO 999.
- Recompile and watch the kernel log: the line CS1: connect to unit 00 OK confirms the link is up.
Host Link Frame Reference (Sysmac-Way, 9600/7-E-2)
Use the table below when you need to manually prove the link with a terminal emulator such as PuTTY. Every Host Link frame starts with @ (0x40) and ends with a two-character FCS (Frame Check Sequence, longitudinal XOR of all bytes between the unit number and the * terminator) followed by * (0x2A) and CR (0x0D). The maximum command body length is 131 characters including the FCS.
| Command | Frame sent from PC to PLC | Reply (success) | Use |
|---|---|---|---|
| RR (Read Word) |
@00RR020010001 + FCS + *CR
|
@00RR0200<hex data>FCS*CR |
Read CIO 2001 (analog input) |
| WR (Write Word) | @00WR020010000A00FCS*CR |
@00WR00FCS*CR |
Write 0x0A00 to CIO 2001 (test only) |
| W@ (Bit Write) | @00W@W0000001FCS*CR |
@00W@00FCS*CR |
Set W0.00 to 1 (SCADA start command) |
| R@ (Bit Read) | @00R@W0000FCS*CR |
@00R@W000001FCS*CR |
Confirm W0.00 is 1 after write |
| MD (Mode Change) | @00MD02FCS*CR |
@00MD00FCS*CR |
Force CPU to Monitor (02) |
| MS (Status Read) | @00MSFCS*CR |
@00MS00…FCS*CR |
Returns CPU mode in byte 3 (00=Program, 02=Monitor, 04=Run) |
CJ1W-AD041 Analog Scaling for the Level Tag
The integrator stored the raw AD041 word in D100, which is correct. The scaling from counts to engineering units depends on the DIP-switch resolution of the CJ1W-AD041 module.
| Mode | Resolution DIP | 4 mA raw | 20 mA raw | Span counts | Eng. units (example 0–100 %) |
|---|---|---|---|---|---|
| Normal | OFF | 0000 hex (0 dec) | 0FA0 hex (4000 dec) | 4000 | PV = raw / 40 |
| High | ON | 0000 hex (0 dec) | 1F40 hex (8000 dec) | 8000 | PV = raw / 80 |
If the user has Citect perform the scaling in a derived tag, the formula is level_pct = (level_raw / 40.0) * 100.0 for normal resolution. Citect will complain about a division by zero on a dead input; use level_raw / 40.0 and let the SCADA clamp the result to 0 on the display. For a tank-level display calibrated in litres, use level_L = level_raw * 25.0 / 1000.0 (25 L per percent on a 2500 L tank) or whatever the tank calibration dictates.
Verification Procedure
- In CX-Programmer, with the program in Monitor, force W0.00 = 1. The lamp should energise. Clear W0.00 and the lamp should drop out.
- On the Citect page, click Start. The Citect tag
scada_startshould read 1 and the lamp should energise. The Citect kernel log should containCS1: write W0.00 OK. - Click Stop. The lamp should drop out.
- Power cycle the PLC. The CPU should come back in Monitor (CX-Programmer shows "Monitor" in the status bar). Pressing Start in Citect should still drive the lamp.
- Confirm the Citect meter on the HMI tracks the analog input in real time. Use a 4–20 mA calibrator on the field side; the meter should swing from 0 to 100 % as the current goes from 4 to 20 mA.
- Perform a Host Link
MSfrom PuTTY and confirm byte 3 returns02(Monitor), not04(Run).
Signal Flow Diagram
The corrected end-to-end flow is shown below. The SCADA command lives in the work area, the ladder OR's the two start sources and seal-in holds the motor, and the physical output is driven only by the ladder, never by a Host Link write.
Diagnostic Matrix
| Symptom | Likely cause | Check | Fix |
|---|---|---|---|
| SD/RD LED off, Citect log shows "timeout" | Cable, baud, or unit number | Loopback test on the XW2Z-200S cable, verify 9600/7-E-2 in Citect I/O Device dialog and PLC Setup port | Re-pin cable or set port parameters identically in both sides |
| Reads OK, writes accepted by Citect but no effect on PLC | PLC in Run mode | Send Host Link MS from PuTTY, expect byte 3 = 02 (Monitor) or 00 (Program), not 04 (Run) |
CX-Programmer → PLC Settings → Startup = Monitor, transfer to PLC |
| Start bit blinks for 1 scan then resets | Tag mapped into physical input word | In Citect tag list, look for any DIGITAL tag whose address begins with 00000–00159 pointing to a CJ1W-ID201 | Move SCADA command to W area, edit ladder to OR the two sources |
| Analog meter jumps, digital reads OK, but writes still fail | Stale I/O Server after tag rename | Citect kernel log, look for "tag address not found" | Recompile Citect project, stop and start the Citect I/O Server, then cycle Runtime |
| All OK for 10 minutes, then writes start timing out | RS-422/485 repeater on long cable, half-duplex echo | Inspect cable, measure voltage on SD line | Add a 120 Ω termination, lower baud to 4800, or move to FinsGateway on Ethernet |
| Tag updates in Citect but PLC ignores even from CX-Programmer online edit | CPU in Run mode and program protect set | CX-Programmer status bar, "PROTECT" indicator | Clear protect bit in PLC Settings → Protection tab |
| Citect reads CIO 2001, but raw value is stuck at 0FA0 hex (4000 dec) | AD041 input open-circuit on 4-20 mA | Measure loop current with multimeter in series | Check transmitter power, polarity, and shield grounding |
| Writes succeed for 1 second then revert | Citect I/O Server polling the tag as a read, overwriting the write | Inspect the Citect port polling period, look for dual assignments | Use distinct read and write tags, or set poll period > 1 s for write tags |
Migration to FinsGateway on Ethernet
Once the serial link is stable, the long-term recommendation is to retire Sysmac-Way and switch to FinsGateway (FGW) over TCP. CJ1M-CPU21/22/23 have Ethernet built in; for the CJ1M-CPU11/12/13 used here, add a CJ1W-ETN21 Ethernet unit to the rack. The Citect driver changes from CS1 [SysmacWay] to CS1 [TCP], the same memory map applies, the FCS and the parity overhead disappear, and polling can run at 100 ms instead of 250 ms. The Omron knowledge base article Citect to Omron PLC Serial Setup Guide covers the FinsGateway path as the recommended option for new projects and includes the FGW unit IP setup and routing table.
AVEVA Plant SCADA Notes
Citect was rebranded AVEVA Plant SCADA in 2018. The driver is now distributed under Plant SCADA 2020 / 2023 / 2024 / 2025; the same CS1 [SysmacWay] I/O device is shipped in the driver pack and the tag address syntax above has not changed. AVEVA documents the Omron driver and its high-availability mode in the AVEVA Plant SCADA driver reference, Communicating with Omron PLCs page. If you are commissioning on a Plant SCADA 2024+ install, select the Omron CS1 (Serial) driver in the Communications dialog and the rest of the procedure is identical. AVEVA also ships an OPC UA bridge that can talk to a CJ2/CJ1M Ethernet unit; this is the preferred path on greenfield sites where the plant has been migrated to OPC UA as the fieldbus standard.
Cross-References to Adjacent Modules
The same work-bit pattern applies if the CJ1M is paired with a CJ1W-OD231 (transistor output) or a CJ1W-OC211 (relay output with different contact rating). The CJ1W-ID211 (high-density 32-pt input module) allocates CIO 0 and CIO 1 in the same way as the ID201, so the address collision case described above is identical. If the integrator is later adding a CJ1W-DA041 analog output module, the four output words occupy CIO 2004–2007, and the SCADA setpoint should be written to the work area and then moved into the output word by the ladder, never directly to CIO 2004. The pattern is the same: SCADA writes a work bit or work word, the ladder copies it into the program-controlled I/O, the CPU scan executes it.
FAQ
Why does Citect not show a comms error when the start button does not work?
The Host Link stack returns a normal acknowledgement frame to every successful W@ (bit write) command whether or not the CPU accepted the value into its program-controlled I/O. Citect treats the ACK as success. The only way to detect the rejection is to read the bit back from the PLC and compare it to the value you wrote, or to query the CPU mode with a MS (Status Read) frame and confirm byte 3 is 02 (Monitor), not 04 (Run).
Can I write directly to CIO 1.00 from Citect instead of using the ladder seal-in?
You can, but you lose the physical start/stop buttons and the safety implication of forcing an output from a SCADA is significant. The work-bit + ladder OR pattern keeps a single source of truth (the ladder) and lets you trace an E-stop back to a real contact. Use the direct-output pattern only on non-safety indicators such as a green run light.
The CPU is in Monitor mode but writes still do not work. What is next?
Confirm two things: the Citect tag address does not collide with a CJ1W-ID201 input word, and the Citect I/O Server has been restarted after the tag rename. A stale I/O Server will keep the old address in its driver cache. Stop the I/O Server, recompile the Citect project, then restart Runtime. The Citect kernel log will show CS1: write W0.00 OK on the first successful click.
Do I have to use the CS1 [SysmacWay] driver or can I use the generic Omron [Hostlink] driver in Citect?
Use the CS1 driver. The generic "Omron" driver in older Citect releases was written for the C-series and does not understand the CJ1M I/O allocation above CIO 255. The CS1 driver is the same one for CS1 and CJ1, because the two product families share the memory map and the instruction set. It is the only correct choice for a CJ1M-CPU11 in Citect 2016 or later.
What is the correct scaling for the CJ1W-AD041 on a 4-20 mA loop in normal resolution?
4 mA = 0000 hex (0 dec) and 20 mA = 0FA0 hex (4000 dec). With a 0-100 % display the engineering-units formula is PV% = raw / 40. In high resolution the same loop maps 0-8000 counts and the formula is PV% = raw / 80. The DIP switch for resolution lives on the front of the CJ1W-AD041 module, behind the clear cover, and the channel range selector is on the bottom of the unit.
Can I leave the PLC in Monitor mode permanently on a production line?
Yes, this is the standard recommendation for any cell with SCADA-controlled outputs. The risk in Run mode is that an external write is rejected and the operator believes the SCADA is in control. In Monitor mode the SCADA behaves predictably, online edits are possible from CX-Programmer, and a power cycle brings the cell back to the same state. If your site standard mandates Run mode, use the Cicode MD trick to push the CPU into Monitor at Citect startup, then leave it.