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:
- The PLC is in PROGRAM mode at the moment of upload (not MONITOR or RUN).
- 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 erroronline. - 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):
- Double-click Settings in the project tree.
- Select the Startup tab (sometimes labeled Power On or Startup Setting depending on CX-Programmer revision).
- Locate the
Expansion Instructionspull-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:
- Disconnect the power supply to the CPM2A.
- Wait at least 5 seconds for the internal hold-up capacitor to discharge (the RUN LED must extinguish).
- Restore power.
- 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.
Verification
After the power cycle, confirm the fix with these checks:
- In CX-Programmer, go online and select Edit → Expansion Instructions. Confirm that FCS is shown as assigned to its function code (typically
180for FCS, displayed with the @-modifier symbol if the differential version is used). - Force or trigger the rung containing
FCS(180)and watch the result word update correctly. FCS computes a frame checksum on the source word rangeSthroughS+N-1using the algorithm defined in the Programming Manual. - 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. |
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:
-
Compute the checksum in ladder without FCS: a sequence of
XORWinstructions followed by a finalANDwith00FFproduces 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. - 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.
- 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.