Resolving CPM2A Expansion Function FCS Upload Error

James Nishida11 min read
HMI ProgrammingOmronTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Problem Overview

The Omron CPM2A series PLC rejects user program uploads that contain the FCS (Frame Checksum) expansion instruction with an alarm message of the form "Problems with the expansion functions" or "Expansion Instruction Error". The upload appears to complete but the FCS function code is not stored in the PLC's expansion instruction set, so any logic that references FCS in the ladder program will not execute correctly at runtime, or will generate a fatal instruction error on the first scan.

This is one of the most common CPM2A/CPM2C upload problems reported by field engineers and is caused by a single, easily-overlooked configuration switch in the Startup tab of the CX-Programmer PLC Settings dialog. The default factory state of this switch is "Protect", which blocks any attempt to change the expansion instruction assignments at upload time.

Affected Hardware and Firmware

The failure mode is documented for the following Omron PLC families that share the CPM2A expansion instruction architecture:

  • Omron CPM2A (all CPU types: 20/30/40/60 I/O)
  • Omron CPM2C (compact block style)
  • Omron SRM1(-V2) (Slave Rack Master, V2 series)
  • Omron CPM1A (where expansion instructions are supported)

All firmware revisions are affected. The behavior is defined by the boot-time check on bit/word DM 6600 bits controlling expansion instruction write protection and is not firmware-version dependent. Refer to the CPM1/CPM1A/CPM2A/CPM2C/SRM1 Programming Manual (W353) section 2-10 for the canonical definition.

Root Cause Analysis

The CPM2A stores the user's expansion instruction set in a separate non-volatile area from the main ladder program. The PLC will only accept a new expansion instruction set on upload if two conditions are both true:

  1. The PLC is in PROGRAM mode at the moment of upload (not MONITOR or RUN).
  2. The PLC Setup word controlling expansion instruction write protection allows the write.

The default Startup setting in CX-Programmer for the parameter Expansion Instructions is Protect. With this value selected, the CPM2A boot code writes the default (factory) expansion instruction set into RAM and locks the expansion instruction slots. Subsequent upload attempts appear to complete, but the FCS code is silently dropped because the destination slot is read-only. The result is a program that references an instruction code the PLC does not know, and either executes as FCS(180) no-op or faults with an undefined instruction error.

Diagnostic Indicators

Before applying the fix, confirm the issue using any of these indicators:

  • CX-Programmer dialog during upload: "The program was transferred, but there were problems with the expansion functions".
  • PLC ERR/ALM LED is OFF (no fatal) but the FCS rung reads Function code error online.
  • Cross-referencing the expansion instruction set in CX-Programmer shows FCS not assigned to any function code (typically 0-255 range, default FCS lives at @FCS(180) or as user-assigned).
  • Compared with the project offline: the Expansion Instructions tab shows FCS mapped offline but reads blank or "default" online after upload.

Solution Procedure

The fix is a five-step sequence. Skipping any step (most commonly the power cycle) returns the PLC to the original fault state.

Step 1: Place the PLC in PROGRAM Mode

Using the physical mode switch on the CPM2A CPU or the CX-Programner online "Mode" toolbar button, change the operating mode to PROGRAM. The PLC will not accept expansion instruction changes in MONITOR or RUN. The mode key position is the source of truth; software mode changes are gated by the same switch on most CPM2A units.

Step 2: Open PLC Settings and Navigate to the Startup Tab

In CX-Programmer (versions 3.x, 4.x, 5.x, and 9.x supported):

  1. Double-click Settings in the project tree.
  2. Select the Startup tab (sometimes labeled Power On or Startup Setting depending on CX-Programmer revision).
  3. Locate the Expansion Instructions pull-down on the left side of the dialog.

Step 3: Change Expansion Instructions to "User Settings"

The pull-down has three values in the CPM2A family:

Value Behavior on Upload Recommended?
Protect (default) PLC ignores expansion instruction changes in the uploaded project. No - blocks FCS upload.
User Settings PLC writes the uploaded expansion instruction set, including FCS, into non-volatile memory. Yes - required for FCS and any custom expansion instructions.
Default PLC restores the factory expansion instruction set on every power-up. Only for legacy programs that must match the original factory image.

Select User Settings and click Transfer to PLC from the PLC menu (or OK followed by the standard online transfer workflow). The transfer must succeed before the program transfer; otherwise the expansion instruction area remains locked.

Step 4: Upload the Program (Ladder + Expansion Instructions)

With the PLC still in PROGRAM mode, perform the normal ladder program upload. CX-Programmer will now write the expansion instruction set first and the ladder program second. The "problems with the expansion functions" alarm should not appear. Verify the transfer log shows the expansion instruction set was written.

Step 5: Power Cycle the PLC

This is the step most often missed. The CPM2A only commits the new expansion instruction set to its non-volatile execution area on a power-on reset, not on a mode change or on the transfer event. Procedure:

  1. Disconnect the power supply to the CPM2A.
  2. Wait at least 5 seconds for the internal hold-up capacitor to discharge (the RUN LED must extinguish).
  3. Restore power.
  4. Observe the boot sequence: PWR LED on, RUN LED on, no ERR/ALM LED.

After the power cycle, the FCS instruction will be active in the expansion instruction set and any rungs using FCS(180) will execute.

Important: A mode change (RUN → PROGRAM → RUN) is not a substitute for a power cycle. The expansion instruction commit point is the POR (Power-On Reset) vector in the CPM2A boot ROM. Skipping the power cycle is the most common reason the fix appears to work once and then fails the next time the PLC is power-cycled in the field.

Verification

After the power cycle, confirm the fix with these checks:

  1. In CX-Programmer, go online and select Edit → Expansion Instructions. Confirm that FCS is shown as assigned to its function code (typically 180 for FCS, displayed with the @-modifier symbol if the differential version is used).
  2. Force or trigger the rung containing FCS(180) and watch the result word update correctly. FCS computes a frame checksum on the source word range S through S+N-1 using the algorithm defined in the Programming Manual.
  3. Cycle power one more time and re-verify: the expansion instruction set should persist across POR once it has been written via the User Settings path.

Technical Reference: CPM2A Expansion Instruction Architecture

Expansion instructions are optional instruction codes that the CPM2A loads from a separate memory area. Up to 18 expansion instruction slots are available in the CPM2A, and 12 in the CPM1A, in the function code range 0-255 (excluding the standard instruction range). Each slot can be assigned to one of the following expansion instructions per the CPM1/CPM1A/CPM2A/CPM2C/SRM1 Programming Manual (W353):

Function Code Mnemonic Name Notes
180 FCS Frame Checksum Common failure point - covered in this article.
181 HEX ASCII-to-Hex
182 LINE Column-to-Line Conversion
183 COLM Line-to-Column Conversion
184 SEC Seconds → HMS Conversion
185 HMS HMS → Seconds Conversion
186 SCL2 Scaling 2
187 AVG Average
188 STUP Setup (read/write PLC Setup area)
189 DIST Stack Distribute
190 COLL Stack Collect
191 INT Interrupt Control
192 TTIM Totalizing Timer
193 XFLO Expansion I/O Word Transfer
194 MAPW / MAPR Mapping Word/Read
195 APR Arithmetic Process
196 MAVR Moving Average
197 RGHT / LEFT / MID String Operations

FCS is the most frequently needed expansion instruction in serial communication projects (calculating checksums for Modbus RTU frames, custom protocols, etc.), so it is the most common one to trigger the upload error described in this article. The same five-step fix applies to any expansion instruction in the table.

FCS Instruction Parameters

The FCS(180) instruction computes an 8-bit two's-complement checksum on a contiguous range of words. From the Programming Manual:

Operand Meaning Valid Range Data Type
C Control word CPM2A: IR/SR/HR/AR/LR/DM/EM Word
S First source word Same as C Word
D Destination word for result Same as C Word

Control word layout:

  • Bits 00-07: number of words N (01-255 decimal, 00 = 256)
  • Bit 13: 0 = EXCLUSIVE-OR checksum (XOR folding, default for Modbus), 1 = two's-complement checksum (Omron legacy mode)
  • Bit 14: 0 = result is rotated right by 1 bit, 1 = result is not rotated (matches Modbus RTU LRC/CRC8 conventions)
  • Bit 15: 0 = continue, 1 = clear carry/error flag

For Modbus RTU, the standard settings are: bit 13 = 0, bit 14 = 0, bit 15 = 1, and the resulting byte is appended to the frame low-byte first.

Related CX-Programmer Settings That Interact With This Issue

Setting Tab Setting Name Default Effect on FCS Upload
Startup Expansion Instructions Protect Must be User Settings for FCS to upload.
Startup Mode at Power Up PROGRAM Should be PROGRAM for first commissioning; RUN for production.
Communications Peripheral Port Settings 9600,7,E,2 (Host Link) Wrong settings prevent CX-Programmer from talking to the PLC at all.
Built-in Inputs High-speed Counter Mode OFF Independent of FCS but easy to mis-configure in the same dialog.
DM Area DM 6600-6609 (Startup settings) Factory default Bit-level equivalent of the Startup tab.
Note: On the CPM2A, the Startup tab settings are bit-mirrors of DM 6600 through DM 6609. Bits 12-15 of DM 6600 control the Expansion Instructions field. Writing 1 to bit 14 of DM 6600 is equivalent to selecting User Settings in CX-Programmer. This is useful when the PLC must be reconfigured over a serial link from a remote site where CX-Programmer is not available.

Workarounds and Alternatives

If the Startup tab remains locked (for example, on a PLC with a forgotten password on PLC Setup, or in a machine where the integrator left the project in Protect mode), the following workarounds are field-proven:

  1. Compute the checksum in ladder without FCS: a sequence of XORW instructions followed by a final AND with 00FF produces an identical result to FCS in EXCLUSIVE-OR mode. This avoids the expansion instruction entirely and is portable across all CPM2A units without the Startup setting.
  2. Compute the checksum in the SCADA/HMI: push the raw frame bytes up to the host and append the checksum there. This is the cleanest fix for Modbus RTU masters that already have a CRC engine on the host side.
  3. Replace the CPM2A with a CP1E or CP1H: the CP1E/CP1H series have FCS as a standard instruction, not an expansion instruction, so the upload protection issue does not exist. This is the recommended path for new designs or for any retrofit where the Startup tab is inaccessible.

Troubleshooting Matrix

Symptom Likely Cause Action
"Problems with the expansion functions" alarm at upload Startup → Expansion Instructions = Protect Set to User Settings, re-transfer, power cycle.
Upload completes with no alarm, but FCS rung does not execute Expansion instructions transferred but PLC not power-cycled Power cycle the PLC for 5+ seconds.
ERR/ALM LED on after power cycle FCS instruction references invalid operand range or C word has invalid bit 15/13/14 combo Review C-word layout, validate N is 1-256.
CX-Programmer shows FCS online but result is always 0 S range points to a protected area (e.g., SR region) and reads return 0 Point S/D to a DM/IR range that is read/write.
Upload fails with "communications error" before reaching expansion instructions Peripheral port / RS-232C settings mismatch Verify host link settings: 9600,7,E,2 for default, or match the PLC DIP switches.
Fix works once, fails on next cold start at the customer site User failed to perform the power cycle, or battery-low condition Verify battery is good (BAT LED off), confirm POR actually happened.

Frequently Asked Questions

Why does the CPM2A default Expansion Instructions to "Protect"?

The default of Protect is a safety feature: it prevents the ladder project from inadvertently changing the instruction set at every upload, which can mask logic errors and corrupt programs that depend on a known instruction set. Set it to User Settings only when the project genuinely uses expansion instructions like FCS, HEX, or AVG.

Is a power cycle really required, or can I just toggle the mode switch?

A power cycle is required. The CPM2A commits the expansion instruction set to its persistent execution area only at the Power-On Reset vector. Toggling PROGRAM ↔ RUN does not trigger a re-commit, so the new FCS mapping will appear in CX-Programmer online view but will not be active in execution until the next true cold start.

Does the same fix apply to the CPM2C and SRM1(-V2)?

Yes. The CPM2C and SRM1(-V2) share the same expansion instruction architecture and the same Startup tab layout in CX-Programmer. The same five-step procedure (PROGRAM mode → User Settings → transfer → upload → power cycle) resolves the identical "problems with the expansion functions" alarm on those families.

Can I clear the PLC Setup password to fix this remotely?

CX-Programmer does not provide a back door to clear a forgotten PLC Setup password on the CPM2A. The unit must be returned to Omron or the password recovered from the original project file. If neither is possible, use the ladder-based XORW workaround described above to compute the FCS checksum without relying on the expansion instruction set.

Which Omron manuals cover the FCS instruction in detail?

The CPM1/CPM1A/CPM2A/CPM2C/SRM1 Programming Manual (W353) documents the FCS instruction and all expansion instruction codes. The CPM2A Operation Manual (W352) documents the PLC Settings dialog and the Startup tab layout that controls the upload protection.

Back to blog