Skip to main content

FC6A Configuration Registers and Memory Mapping Strategy

By NFM Consulting 5 min read

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

  1. 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
  1. 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 Code
  • D8006 — User Program Execution Error Code
  • D8022 — Constant Scan Time Preset
  • D8029 — 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

  1. 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.
  2. Use a prefix/zone naming convention in code comments:
    • PV_ for process variables
    • AI_RAW_ for analog input raw values
    • CFG_ for configuration
    • SYS_ for system/special registers (read-only)

Detecting Overlaps Before They Ship

  1. 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.
  2. Cross-check system-reserved ranges: verify no user logic writes to reserved special data registers.
  3. Online validation (when hardware is available):
    • Confirm system software version from D8029 and record it.
    • For Ethernet setups, confirm IP registers (D8330D8333) reflect expected values.

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

Ready to Get Started?

Our engineers are ready to help with your automation project.