FC6A Configuration Registers and Memory Mapping Strategy
Key Takeaway
A comprehensive guide to FC6A memory organization — inputs, outputs, internal relays, timers, counters, user and special data registers — and a proven register-allocation methodology to prevent the overlap collisions that cause hard-to-debug malfunctions in IDEC FC6A programs.
Overview
Understanding how FC6A memory is organized is essential to avoiding the register-overlap collisions that are among the most common causes of hard-to-debug PLC malfunctions. This article explains the FC6A address map (inputs, outputs, internal relays, timers, counters, user data registers, special data registers, non-retentive ranges, and index registers) and provides a robust register-allocation methodology.
Prerequisites
- You must understand the FC6A device address scheme, including the rule that the least significant digit of I/O addresses is octal (0–7).
- You must know which register ranges are "special/system," including the explicit warnings not to write reserved entries.
- You must recognize that analog modules store parameters in data registers and consume multiple words per module depending on settings.
- Some settings (function area settings, expansion data register settings) cannot be changed during Online Edit — they require a full project download.
Step 1 — Build a Register Budget Before Writing Logic
- Start with the master device range table from the FC6A user manual. A simplified version for your project documentation:
| Device Type | Range | Notes |
|---|---|---|
| Inputs (I) | Varies by CPU + expansion | Least significant digit is octal (0–7) |
| Outputs (Q) | Varies by CPU + expansion | Least significant digit is octal (0–7) |
| Internal Relays (M) | M0–M7997; M8000–M9997; M10000–M21247 | Bit memory and logic flags |
| Timers (T) | T0–T1999 | Timer bits and current values |
| Counters (C) | C0–C511 | Counter bits and current values |
| User Data Registers (D) | D0000–D7999 | General-purpose word/dword storage |
| Special Data Registers (D) | D8000–D8899 | System/config/error — do not write reserved entries |
| Non-retentive Data Registers | D70000–D269999 | Cleared on power cycle |
| Index Registers (P) | P0–P15 | 2-word registers; limited use contexts |
- Define your project's memory zones in writing. A recommended
partitioning:
- Low D-range (D0000–D1999): process variables, sensor raws, setpoints.
- Mid D-range (D2000–D3999): control blocks (PID/SCALE/filters), interlocks.
- High D-range (D4000–D7999): module allocations and protocol buffers.
Three Collision Modes: Why Registers Overlap
Collision Mode A — Special Data Registers Share the D Namespace
The device-range table includes special data registers (D8000–D8899) in the
same D address namespace as user registers. The special data
register list warns: do not write to data marked reserved; otherwise
the system may not operate correctly.
Key special registers include:
D8005— General Error CodeD8006— User Program Execution Error CodeD8022— Constant Scan Time PresetD8029— System Software Version
Collision Mode B — Analog Modules Reserve Multi-Word Blocks
Analog modules store parameters in data registers, with multiple words used starting from the configured base address. The word count varies by module model and configuration. If you assign two modules overlapping addresses — or use those addresses for unrelated logic — you create hard-to-debug malfunctions from parameter corruption.
Collision Mode C — Communication Features Reserve Register Blocks
Communication options (Modbus request tables, etc.) can store error status data into reserved data-register blocks, with the number of reserved registers depending on configuration choices.
Register Allocation Methodology
Naming and Addressing Conventions
- Document octal-bit addressing — The least significant digit of device addresses is octal (0–7). This must be explicitly stated in any documentation that shows I/Q/M bit addresses, because it affects how "I10" vs "I8" numbering is interpreted.
- Use a prefix/zone naming convention in code comments:
PV_for process variablesAI_RAW_for analog input raw valuesCFG_for configurationSYS_for system/special registers (read-only)
Detecting Overlaps Before They Ship
- Static register map review: maintain a single exported register-map document (CSV or spreadsheet) listing every allocated D/M range with its owner (module/function) and size.
- Cross-check system-reserved ranges: verify no user logic writes to reserved special data registers.
- Online validation (when hardware is available):
- Confirm system software version from
D8029and record it. - For Ethernet setups, confirm IP registers
(
D8330–D8333) reflect expected values.
- Confirm system software version from
Memory Map Diagram
flowchart LR
subgraph D_space["D Register Namespace"]
D0["D0000–D7999 User data registers"]
D8["D8000–D8899 Special data registers (system/config/error)"]
D7["D70000–D269999 Non-retentive registers"]
end
subgraph Allocations["Typical Allocations in D0000–D7999"]
A["Analog module control regs (multi-word blocks)"]
S["SCALE S2 block (8 words)"]
O["SCALE D1 block (6 words)"]
end
A -. "risk: overlap" .- S
S -. "risk: overlap" .- O
Example Allocation Plan
D0100 - D0115 : Analog input raw values (8 channels + status words)
D0200 - D0207 : SCALE1 control registers (S2, 8 words)
D0210 - D0215 : SCALE1 output registers (D1, 6 words)
D0300 - D0330 : Analog module #1 parameters (size depends on module + config)
D0400 - D0420 : Modbus request/error/status buffers (size per configuration)
D8005 - D8006 : System error info (read-only; do not overwrite)
Register Area Reference
| Memory Area | Purpose | Why Overlaps Happen | Avoidance Pattern |
|---|---|---|---|
D0000–D7999 |
General user storage | Multi-word blocks (analog modules, SCALE) live here; careless reuse overlaps. | Partition by subsystem; record each feature with size. |
D8000–D8899 |
Special data registers | Shares the "D" namespace; writing reserved entries breaks system behavior. | Treat as read-only unless the manual explicitly allows writes. |
| Inputs/Outputs (I/Q) | Physical I/O bits | Address confusion due to octal least-significant digit. | Always document both physical terminal and logical address. |
| Internal Relays (M) | Flags/status bits | Collisions when status flags are reused across features. | Use naming convention and reserve ranges per subsystem. |
| Index Registers (P0–P15) | Script/macro arguments | Only 16 available; accidental reuse breaks scripts. | Allocate like CPU registers — never reuse without review. |
Quick Checklist
- Reproduce the official device-range table in your internal standard (including the octal rule).
- Mark D8000–D8899 as "special/system — do not allocate" with an explicit warning about reserved entries.
- For every module/function that uses D blocks, list "start address + word count" (analog modules vary; SCALE is fixed at 8 + 6 words).
- Remember: function area settings and expansion data register settings cannot be changed during Online Edit.
- Validate live system version (
D8029) and keep it in your project records.
Frequently Asked Questions
FC6A memory is divided into inputs (I), outputs (Q), internal relays (M), timers (T), counters (C), user data registers (D0000–D7999), special/system data registers (D8000–D8899), non-retentive data registers (D70000–D269999), and index registers (P0–P15). The least significant digit of I/O addresses uses octal notation (0–7), which is a common source of addressing mistakes.
Special data registers (D8000–D8899) are system-reserved registers that store configuration, diagnostics, and error information. Key examples include D8005 (general error code), D8006 (user program execution error code), D8029 (system software version), and D8330–D8333 (Ethernet IP address). The manual warns: do not write to reserved entries or the system may not operate correctly.
Maintain a register-map document (CSV or spreadsheet) listing every allocated D/M range with its owner, base address, and word count. Partition the user D-range into zones (low for process variables, mid for control blocks, high for module allocations). Cross-check that no user logic writes to the reserved D8000–D8899 range, and verify that multi-word blocks for analog modules and SCALE instructions do not overlap.
On the FC6A, the least significant digit of input (I), output (Q), and internal relay (M) addresses is octal, meaning it uses digits 0 through 7 only. There is no address ending in 8 or 9 — after I7 comes I10. This must be documented explicitly in I/O maps to prevent 'wrong bit' addressing errors.