S7-300 CPU 313C-2 DP Download Error 294-6: MB255 Memory Fix

David Krause13 min read
S7-300SiemensTroubleshooting
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

1. Problem Overview

The Siemens S7-300 CPU 313C-2 DP rejects a block download with error code 294-6 when the FC, FB, or instance DB being loaded contains operands whose absolute addresses fall outside the memory map supported by the CPU. The most common trigger in the field is the use of bit-memory bytes above MB255 (e.g., MB256–MB4095), timers above T255, or counters above C255. The download halts and the block is not written to the target PLC even though STEP 7 (SIMATIC Manager or TIA Portal) reports a successful compile with zero errors and zero warnings.

The mismatch is silent at compile time because the offline program editor is bound only to the symbolic address table and not to the runtime memory map of the destination CPU. The error surfaces only when the load image is built and pushed across PG/PC → PLC via MPI/PROFIBUS or via the integrated DP port of the CPU 313C-2 DP.

2. CPU 313C-2 DP Technical Specifications

The CPU 313C-2 DP is a compact CPU with integrated digital and analog I/O, an integrated PROFIBUS DP master/slave interface, and three high-speed counters. The relevant memory limits for this article are summarized below.

Parameter Value Order Number Reference
Order number (typical) 6ES7313-6CF03-0AB0 CPU 313C-2 DP, 128 KB work memory
Work memory (integrated) 64 KB / 128 KB (variant dependent) 6ES7313-6BE01 / 6CE01 / 6CF03
Bit memory (M area) 256 bytes (MB0 – MB255) Hard CPU limit
Timers (T area) 256 (T0 – T255) Hard CPU limit
Counters (C area) 256 (C0 – C255) Hard CPU limit
Process image (inputs) Max 1024 bytes (variable) Configurable in HW Config
Process image (outputs) Max 1024 bytes (variable) Configurable in HW Config
I/O address range (digital) 0.0 – 1023.7 Default module mapping
Integrated DI/DO/AI/AO 24 DI / 16 DO / 4 AI / 1 AO + 1 PT100 Compact I/O built-in
Counters (integrated) 3 high-speed (10 kHz / 30 kHz) Function channels 0–2
DP interface PROFIBUS DP master/slave, 12 Mbps X2 connector

Reference: S7-300 CPU 31xC and CPU 31x Manual (Siemens Support entry 8861711) and the S7-300 CPU 313C-2 DP/PtP Operating Instructions on the Siemens Industry Online Support portal.

Field caveat: The MB255 / T255 / C255 boundaries are fixed by the CPU firmware. Unlike the S7-400 or S7-1500 families, the S7-300 bit-memory size is not configurable. There is no parameter, HW Config setting, or CPU property dialog that raises the upper bound. Any symbol resolved to MB256 or higher will always fail at download.

3. S7-300 Address Space Architecture

The CPU 313C-2 DP organises its operand area as eight discrete address spaces. STEP 7's absolute address must be valid in the runtime image of the destination CPU; otherwise the online loader raises a download fault.

Operand Area Prefix CPU 313C-2 DP Range Bit / Word / DWord
Process image inputs I / IB / IW / ID 0.0 – 1023.7 0–1023 bytes
Process image outputs Q / QB / QW / QD 0.0 – 1023.7 0–1023 bytes
Bit memory (flags) M / MB / MW / MD 0 – 255 0–255 bytes
Timers T / T no. 0 – 255 Word each
Counters C / C no. 0 – 255 Word each
Data blocks DB / DBB / DBW / DBD DB 0 – 1023 (or larger by work mem) DB-number scoped
Local data (stack) L / LB / LW / LD Per execution level Temporary only
Periphery (P) PIB / PIW / PID / PQB / PQW / PQD 0 – 65535 Direct I/O access

The total size of an operand's container (e.g., MW256 requires two bytes, MB256 and MB257) must also be fully within range. An MW254 or MW255 access is legal because it consumes only MB254–MB255. An MW256 access (consuming MB256–MB257) is illegal because both bytes fall outside the legal range.

4. Error Code 294-6: Detailed Breakdown

Siemens assigns diagnostic codes in a structured format: 294-6 falls under the family of download/load faults returned by the CPU's online interface. The 294 series signals block load rejected by target system; the suffix 6 indicates the specific reason: operand outside CPU-supported range.

Code Meaning (S7-300/400 context) Likely Cause
294-0 Block type not supported by CPU Loading an FB onto a CPU that lacks the required instance mechanism
294-1 Function / system function not present Calling an SFB/SFC the CPU does not have in firmware
294-2 Block too large for CPU work memory FC/FB exceeds available load memory
294-4 Instance DB mismatch FB interface signature drift
294-6 Operand / address out of supported range Use of MB256+, T256+, C256+, I/Q beyond image size
294-7 Protection violation (know-how protect, write protect) CPU in RUN with write protection

Authoritative source: the STEP 7 Error Code Reference (PDF 770453, att_117322/v1) published by Siemens AG.

5. Root Cause Analysis: Why the MB255 Boundary Fails

The failure has three contributing factors that compound into a single error event:

  1. Symbol table decoupling. The STEP 7 symbol table permits entries for any address the user types, including MB1024. The symbol editor does not validate against the destination CPU. As a result, a project originally developed for a larger S7-300 CPU (e.g., CPU 319-3 PN/DP with MB0 – MB4095) is silently portable to a smaller CPU with a different M-area size.
  2. Block compilation blind to address map. Compiling a FC or FB checks only the network logic, instruction set coverage, and data type consistency. It does not confirm that the addresses are valid for the target CPU. STEP 7 reports 0 errors, 0 warnings.
  3. Online load validates against CPU firmware. The download path (via PLC > Download in SIMATIC Manager, or Online > Download to device in TIA Portal) builds the block image and transmits it to the CPU. The CPU's loader walks the block, examines every operand, and rejects the block as soon as it encounters an address that exceeds the firmware-defined range.

The user-visible symptom is therefore: clean offline compile, failed online load, single 294-6 event in the diagnostic buffer. The diagnostic buffer (reachable via PLC > Diagnose/Hardware > Diagnostic Buffer) is the authoritative source for the rejected address.

6. Diagnostic Procedure

  1. Read the diagnostic buffer. In SIMATIC Manager, right-click the CPU node, choose PLC > Diagnose/Hardware > Diagnostic Buffer. Look for an event of class CPU/fault with text containing the operand that triggered the rejection. Example entry: Block FC10 load error 294-6: operand MB256 out of range.
  2. Cross-check the symbol table. In S7 Program > Symbols, sort the Address column descending. Any M, T, or C address exceeding the limit (255 for the CPU 313C-2 DP) is suspect.
  3. Grep the FC/FB source. Open the failed block. In LAD/FBD view, use Options > Cross-references to enumerate every absolute operand. In STL view, search the source for the literal string MB 2 or higher, T 256 or higher, and C 256 or higher.
  4. Confirm with Accessible Nodes > Online > Compare. This highlights exactly which block(s) the CPU refuses to absorb.
Tip: When the project is opened from a project originally authored for a different CPU family, do not trust a successful offline compile. The diagnostic buffer is the only deterministic evidence.

7. Resolution: Step-by-Step

The following procedure resolves the 294-6 fault for the MB255 / T255 / C255 boundary. It assumes SIMATIC Manager with a STEP 7 V5.x project. TIA Portal follows the same logical flow with menu changes noted inline.

  1. Place the PLC in STOP. From SIMATIC Manager: PLC > Operating Mode > STOP. This eliminates write-protection as a secondary cause.
  2. Open the Blocks folder in the S7 program.
  3. Compile the project explicitly. Right-click the Blocks folder and choose Compile. Confirm 0 errors, 0 warnings. If errors appear, fix syntax first.
  4. Open the failing FC/FB in the editor (LAD/FBD/STL).
  5. Use cross-references to list every absolute operand used in the block. Filter for operands with an M-, T-, or C- prefix and address number > 255.
  6. Rewrite the offending addresses to legal values inside the 0 – 255 range. Two patterns are typical:
    • Shrink the working set. If the program genuinely requires more than 256 bytes of bit memory, you have already exceeded the CPU's design point. Either switch to a larger CPU (e.g., CPU 314, CPU 315-2 DP, CPU 317-2) with an extended M-area or refactor to use data-block (DB) storage instead of M-area. The CPU 317-2 PN/DP supports up to MB0 – MB4095; the CPU 319-3 PN/DP supports MB0 – MB16383.
    • Reuse existing M bytes whose existing symbols are no longer used by the live program. Cross-references and the Program Info (Reference Data) tool help confirm dead memory.
  7. Update the symbol table to match the rewritten absolute addresses. Decide between Symbol has priority or Absolute address has priority in the block folder properties (see Section 8).
  8. Recompile the entire Blocks folder. Resolve any new errors introduced by the address remap.
  9. Download the corrected block(s) via PLC > Download. Repeat for every FC/FB/DB that previously failed.
  10. Switch the CPU back to RUN and verify scan-cycle behavior.

8. Symbol Priority Configuration

After an address rewrite you must ensure that subsequent compiles do not silently re-apply the old absolute addresses. This is controlled in the Blocks folder properties:

Setting Behavior on Recompile When to Choose
Symbol has priority The address stored in the symbol table wins. If the symbol Motor_Start points to M 50.0 in the symbol table, every reference in the block is rebound to MB50 regardless of the literal written in the network. Use this when the symbol table is the single source of truth (recommended for porting projects between CPUs).
Absolute address has priority The literal address written in the network wins. The symbol is updated to match the literal. Use only when the network is the source of truth and the symbol table is permitted to be overwritten.

Configure via: Blocks folder → right-click > Properties > Block folder > Address priority. In TIA Portal the equivalent setting lives under Project tree > PLC > Properties > General > Symbolic access and in the compile settings of the program blocks.

Common failure mode: A project is fixed once, the engineer returns weeks later, edits a single network, recompiles, and the addresses silently snap back to the old (out-of-range) values. The block compiles cleanly but the download fails again. The fix is to confirm the priority setting before the second compile and to rebuild the symbol table from the corrected network first.

9. Verification and Validation

  1. Diagnostic buffer clean. After download, re-open the diagnostic buffer. The 294-6 event should be the most recent download-related entry, with no follow-up fault.
  2. Online > Compare. Online > Compare Offline/Online must report identical for the affected FC/FB/DB.
  3. Monitor the affected M bytes with a VAT or watch table. Force a MW in the new range and verify expected behavior.
  4. Run a scan-time check. With the CPU in RUN, the cycle time should be stable. A sudden 100 ms increase suggests a newly introduced loop or block overcall.
  5. Cross-reference closure. Re-run Reference Data > Cross-references and confirm no unused or stranded operands remain in the symbol table.

10. Common Pitfalls and Cross-Platform Notes

Pitfall Symptom Mitigation
Project originally on CPU 319-3 PN/DP, ported to 313C-2 DP MB0–MB4095 addresses reject at load Downsize the M-area, or migrate to a CPU with the same M-area size
Use of T 256 or C 256 from a copy-paste 294-6 with timer/counter operand in the event Remap to T0–T255 / C0–C255 or move to IEC timers in SFB 3/4/5
Cross-segment MW access (e.g., MW254 over MB254+MB255) Works on big CPU, fails on 313C-2 DP only when MW points to byte 256 Always validate MW/MD endpoints, not just the start address
Symbol priority flip during maintenance Recompile silently reverts the fix Lock priority setting; document in project notes
Mixing S7-300 and S7-400 in the same project tree Compilation accepts the union of operand ranges; load fails on the smaller CPU Split into separate sub-projects per CPU class
Loading FC during RUN (write-protection) Different error (294-7), easy to confuse with 294-6 Place CPU in STOP or unlock with the correct password

11. Troubleshooting Matrix

Observed Symptom Likely 294.x Code First Check Resolution
Clean compile, load fails, single line in diagnostic buffer 294-6 Cross-reference for MB/T/C > 255 Remap to in-range addresses
Load fails after editing existing FC 294-6 Symbol priority Set "Symbol has priority" and recompile
Load fails on FB instance DB 294-4 FB interface signature Recompile FB, regenerate instance DBs
Load fails on SFB call 294-1 CPU capability list Replace SFB with equivalent logic or use larger CPU
Load fails in RUN mode 294-7 CPU protection level STOP, or remove write protection
Load fails with "Block too large" 294-2 Work memory size Split block, use larger CPU, or move to MMC with size to spare

12. Related Engineering Notes

  • MMC sizing. A project rewritten to use more DBs and less M-area will grow load memory. The 313C-2 DP accepts up to an 8 MB Micro Memory Card (MMC, 6ES7953-8LPxx-0AA0). Plan for a 2–4 MB MMC if the project exceeds 256 KB of offline block data.
  • IEC timers as a fallback. When the 256-timer limit binds, consider SFB 3 ("TP"), SFB 4 ("TON"), and SFB 5 ("TOF") IEC timers. They are stored in instance DBs and are not bound to the T-area count limit, trading simplicity for instance-DB overhead.
  • Migration path to S7-1500. A direct port from S7-300 to S7-1500 via TIA Portal preserves symbol names, but the address-priority semantics differ. Use the migration tool with the Address priority: Symbol has priority option to avoid silent revert.
  • Project documentation. Record the maximum M-, T-, and C-area consumed in the project header. This single line of metadata prevents the 294-6 class of fault the next time someone re-targets the project to a smaller CPU.

What does Siemens error 294-6 mean on an S7-300 CPU 313C-2 DP?

Error 294-6 means the target CPU rejected the block during download because one or more operands in the block fall outside the address range the CPU supports. The most common cause is a bit-memory byte greater than MB255, a timer greater than T255, or a counter greater than C255 on the CPU 313C-2 DP.

Why does the project compile with zero errors but still fail to download?

STEP 7's offline compile validates only network syntax, instruction set, and data types. It does not verify operand range against the destination CPU. The online load path performs that check, which is why a clean compile is followed by a 294-6 download fault.

Can I increase the bit-memory area on a CPU 313C-2 DP?

No. The 256-byte M-area on the 313C-2 DP is fixed by firmware. To use more than 256 bytes of bit memory you must either move the data into data blocks (DBs) or upgrade to a larger CPU such as the CPU 314 (M-area 256 B), CPU 315-2 DP (M-area 2048 B), CPU 317-2 PN/DP (M-area 4096 B), or CPU 319-3 PN/DP (M-area 16384 B).

How do I make symbol priority "Symbol has priority" stick in SIMATIC Manager?

Right-click the Blocks folder of the S7 program, choose Properties, switch to the Block folder tab, and select "Symbol has priority" under Address priority. Save the project. After this, recompiling the block will rebind the network to whatever address the symbol table currently specifies, instead of overwriting the symbol with the literal in the network.

How do I find which exact operand is causing the 294-6?

Open the CPU's diagnostic buffer (PLC > Diagnose/Hardware > Diagnostic Buffer in SIMATIC Manager) and read the most recent download-related event — it usually names the offending operand. Then run Options > Cross-References on the affected block and sort by absolute address to confirm the entry in the source.

Back to blog