Troubleshooting S7-1500 Modbus_Comm_Load Status 16#7000 / 16#7001: DONE and ERROR Stay FALSE
The Modbus_Comm_Load instruction on the SIMATIC S7-1500 (CPU 1515-2 PN, 1517-3 PN/DP, 1518-4 PN/DP, etc.) is one of the most frequently misconfigured FBs in TIA Portal. A classic symptom — the block never reports DONE = TRUE or ERROR = TRUE, and the STATUS output remains frozen at 16#7000 or 16#7001 — is almost never a code bug. It is a hardware, library, port-identifier, or runtime issue that prevents the block from completing bus initialization.
This guide consolidates the engineering checks required to recover the communication, with deep coverage of the CM 1541-1 PtP module (article number 6ES7 541-1AB00-0AB0), TIA Portal V16 library selection, port HW identifiers, and PLCSIM limitations. It is intended for automation engineers responsible for commissioning Modbus RTU links to inverters, instruments, and weigh scales over RS485.
1. What the Status Code 16#7000 Actually Means
The STATUS word on Modbus_Comm_Load follows the standard SIMATIC step-pattern:
| STATUS (hex) | Meaning | Trigger |
|---|---|---|
| 16#7000 | Block is idle / not currently processing | REQ edge was never detected, or call has been skipped by the OB cycle |
| 16#7001 | First call — Modbus_Comm_Load is initializing the port | REQ=TRUE on rising edge; port HW ID is valid; library loaded |
| 16#7002 | Subsequent call — still initializing | Internal bus startup not yet completed |
| 16#0000 | DONE=TRUE, no error | Port configured successfully |
| 16#8180 | ERROR=TRUE — invalid port ID | HW identifier from device config is wrong or empty |
| 16#8181 | ERROR=TRUE — parameter error | Baud, parity, or data bits outside the module range |
| 16#8183 | ERROR=TRUE — pointer/inst-DB error | Instance DB not loaded, or accessed while stopped |
| 16#8184 | ERROR=TRUE — framing/parity/overrun | Physical layer problem (wiring, termination, baud mismatch) |
| 16#8185 | ERROR=TRUE — Modbus exception from slave | Slave returned 0x01..0x04 exception code |
| 16#8186 | ERROR=TRUE — invalid response | Slave ID mismatch, CRC error, or stray noise |
| 16#8187 | ERROR=TRUE — watchdog timeout | No response within configured response timeout |
| 16#8188 / 16#8189 | ERROR=TRUE — NAK / memory | Out of receive buffer, or no instance DB |
| 16#818A / 16#818B | ERROR=TRUE — checksum / bad telegram | CRC mismatch or framing violation |
| 16#818C | ERROR=TRUE — receive buffer overflow | Slave data longer than the receive buffer slice |
2. Why the Block Never Advances Past 16#7000 / 16#7001
From field experience, the failure modes cluster into five categories. Diagnose in this order because each subsequent check assumes the previous one is correct.
-
Library not installed in the project. The blocks
Modbus_Comm_LoadandModbus_Master/Modbus_Slaveare not part of the S7-1500 base instruction set. They ship in the optional library MODBUS_RTU (or MODBUS_PN for Open User Communication on PROFINET). Without the library, the FB compiles against a stub or the system function simply does not execute. -
Wrong or empty HW identifier on the
PORTinput. ThePORTparameter is a hardware identifier (HW-ID), not a slot number. The HW-ID is generated automatically by TIA Portal when the CM 1541-1 is inserted and configured. Dragging the value from the device configuration or using a constant from the system constants is mandatory. -
Block called only on a single cycle and not retriggered. Because the FB is a multi-cycle instruction, the first scan must re-evaluate every OB1 pass. Tying
REQtoFirstScanthen never re-driving it leaves the block in the idle state16#7000. -
Running on PLCSIM. S7-PLCSIM does not emulate the CM 1541-1 backplane bus. PtP instructions always return
16#7000in PLCSIM regardless of wiring. Use PLCSIM Advanced or a physical CPU for testing. - Instance DB loaded twice or not loaded. The single-instance DB created by the FB must be downloaded to the CPU. If a second copy exists in the project tree without the FB call, the call gets the wrong instance.
3. Hardware Setup: CM 1541-1 (6ES7 541-1AB00-0AB0)
The CM 1541-1 in HF (High Feature) variant is the standard PtP module for S7-1500 Modbus RTU. Configure it in the device view before adding any FB to OB1.
| Parameter | Recommended value for Modbus RTU on RS485 | Notes |
|---|---|---|
| Module type | CM 1541-1 (6ES7 541-1AB00-0AB0) | Insert in the local backplane; powered via system rail |
| Port configuration | RS485 half-duplex (2-wire) | Full-duplex (4-wire) is supported but is rarely used in field |
| Protocol selection | Freeport (ASCII) — Modbus RTU master is software-driven | Select "Freeport" not "Modbus RTU" at port level |
| Baud rate | Match the slave device exactly (typical 9600 / 19200) | Many VFDs default to 19200 8E1 |
| Data bits / Parity / Stop | 8 / Even / 1 (most common) or 8 / None / 2 | Slave datasheet is authoritative |
| Flow control | None for half-duplex | RTS/CTS not used in 2-wire RS485 |
| Termination | Enable at the two physical ends of the bus only | Built-in resistor, configured in port properties |
| HW identifier (PORT input) | Read from System Constants after download | Format: integer like 269, 270 — record it |
The HW identifier is the single most common source of stuck 16#7000 / 16#7001. After downloading the device configuration, open PLC > Properties > System Constants and locate the line CM 1541-1 / PtP interface. The numeric value in the HW Identifier column is what must be wired to the PORT input of Modbus_Comm_Load.
4. Software Setup: TIA Portal V16 Library Selection
TIA Portal V16 ships multiple Modbus libraries. Choose exactly one to avoid name collisions.
| Library | Use case | Blocks provided |
|---|---|---|
| MODBUS_RTU (V16) | PtP modules (CM 1541-1, CB 1241, ET 200SP CM PtP) | Modbus_Comm_Load, Modbus_Master, Modbus_Slave |
| MODBUS_PN (V16) | Modbus TCP via PROFINET interface of the CPU | Modbus_Comm_Load_PN, Modbus_Master_PN |
| Legacy Modbus library (pre-V13) | S7-300/400 only | Not available in TIA V16 |
To install: in the project tree, right-click the CPU → Properties > Library → Add user library → select MODBUS_RTU from the global library catalog. Confirm that Modbus_Comm_Load V6.0 (or later) appears under Instructions > Communication > Modbus RTU. Rebuild the program after adding the library so the FB symbol resolves to a real block rather than an unresolved reference.
5. Wiring the RS485 Bus
The CM 1541-1 front connector is a 9-pin Sub-D. For 2-wire (half-duplex) Modbus RTU:
| Sub-D pin (CM 1541-1) | Signal | RS485 wire color (typical) |
|---|---|---|
| 3 (Data+ / B) | Data + | Red |
| 8 (Data− / A) | Data − | Black |
| 5 (GND) | Common reference | Shield / drain wire, single-point to ground |
| 6 (+5 V, 220 Ω fail-safe bias) | Optional bias supply | Use only if slave does not bias |
Verify the bus is a single daisy chain (no stubs longer than ~30 cm at 19200 baud, shorter at higher rates), that the shield is grounded at one end only, and that exactly two termination resistors — at the physical end nodes — are present. A shorted or reversed A/B pair will produce 16#8184 the moment a telegram is sent; a missing termination typically allows the first scan to complete (16#7001 → 16#0000) but corrupts every subsequent Modbus_Master call.
6. Calling the FB in OB1 — The Correct Pattern
Because Modbus_Comm_Load is multi-cycle, it must be called every scan. A common mistake is to gate it behind FirstScan:
// OB1 — segment 1
// ❌ INCORRECT — REQ is only TRUE for one scan, then STATUS stays 16#7000
IF "FirstScan" THEN
"Modbus_Comm_Load_DB".REQ := TRUE;
END_IF;
"Modbus_Comm_Load_DB"(
REQ := "Modbus_Comm_Load_DB".REQ,
PORT := 269, // HW ID of CM 1541-1
BAUD := 9600,
PARITY := 2, // 0=None, 1=Odd, 2=Even
FLOW_CONTROL := 0, // 0=None
RTS_ON_OFF := 0,
RTS_PRESET := 0,
RESP_TO := 1000, // ms — slave response timeout
MODE := 4, // 4 = Modbus RTU master (RS485 half-duplex)
TIMEOUT := 2000, // ms — character timeout
DONE => _done,
ERROR => _err,
STATUS => _status);
The correct pattern is to force a rising edge on REQ on the first scan, then let the FB self-clear it. The block is internally designed to drive its own REQ low on completion, so an external latch is not required:
// OB1 — segment 1
// ✅ CORRECT — REQ rises on first scan, then the block manages its own state
"Modbus_Comm_Load_DB"(
REQ := "FirstScan", // one-shot edge is sufficient
PORT := 269,
BAUD := 19200,
PARITY := 2, // Even
FLOW_CONTROL := 0,
RESP_TO := 1000,
MODE := 4, // Modbus RTU master half-duplex
DONE => _done,
ERROR => _err,
STATUS => _status);
IF "Modbus_Comm_Load_DB".DONE THEN
"Modbus_Master_DB".REQ := TRUE; // start master cycles
END_IF;
7. PLCSIM and Runtime Limitations
The S7-1500 simulation (S7-PLCSIM and S7-PLCSIM Advanced) supports PROFINET-based MODBUS_PN, but does not emulate the CM 1541-1 PtP module. In PLCSIM:
-
Modbus_Comm_Loadreturns STATUS = 16#7000 indefinitely. - No telegram is ever placed on the bus.
- DONE never becomes TRUE; ERROR never becomes TRUE.
Symptom presentation: the engineering project is fully correct, Modscan sees the slave on the desk, and TIA Portal reports a successful download. Only the in-CPU behavior is broken. The only remedy is to test on real hardware. If a CPU is unavailable, you can validate program structure by stubbing the PORT input with an unused HW identifier and observing the 16#8180 error — this confirms the call site is wired correctly and shifts the suspicion away from code into hardware.
8. Step-by-Step Diagnostic Procedure
Run the following checks in order. Each step should be marked complete before moving to the next.
- Verify the CM 1541-1 in the device view. The module must appear under the CPU in the project tree. Open Device view, select the CM, and confirm a green check on the slot. If absent, add it from the catalog and download the new hardware configuration.
- Confirm the port protocol. Right-click the CM → Properties > Port > Protocol → Freeport. The Modbus RTU master instruction expects the port to be in Freeport mode, not "Modbus Master".
-
Read the HW identifier. PLC > System Constants → filter by CM 1541-1. Note the integer value (e.g., 269) and use it on the
PORTinput. - Install the MODBUS_RTU library. Check that the FBs appear in the project instructions tree. If they are missing, the block in OB1 is a placeholder.
- Confirm the call site is in OB1 (or a cyclic OB). Modbus_Comm_Load in OB100 only runs once on startup; in OB82 / OB86 it is suspended. Place it in OB1 unconditionally.
-
Monitor STATUS in a watch table. Add a watch table with the instance DB tags
.REQ,.DONE,.ERROR,.STATUS. Cycle the CPU and observe. - Cross-check the slave with Modscan or Modbus Poll. If the slave answers from a PC tool, the slave hardware and physical layer are good. The issue is on the PLC side.
- Check the CPU diagnostic buffer. Online → Diagnostics > Diagnostic Buffer. Entries referencing "PtP", "Modbus", or "CM 1541-1" with event ID 0x1A40 / 0x1A41 indicate the module reported a bus error.
- Re-download everything. Stop the CPU → Download to device with "Software (all blocks)" and "Hardware configuration" checked. Reset the CM by power-cycling or by toggling it in the device view.
9. Verification
Successful commissioning is confirmed by the following observable state:
-
Modbus_Comm_Load.DONEpulses TRUE once after the rising edge of REQ, then returns FALSE. -
Modbus_Comm_Load.STATUSreads16#0000on the cycle where DONE is TRUE. -
Modbus_Mastercycles through16#7001 → 16#0000on each read/write request. - The diagnostic buffer contains no PtP error events.
- An external Modbus scanner sees the master’s request frames on the RS485 bus at the configured baud and parity.
A final test that catches the most elusive wiring issues: temporarily set the slave to loopback mode (if available) or short pins 3 and 8 on the CM 1541-1 with a 120 Ω resistor. The block should now report a framing error (16#8184) on the first Modbus_Master cycle. The fact that the error code is physical rather than stuck at 7000 proves the Modbus_Comm_Load itself is healthy — the original problem is upstream of the bus.
10. Quick Reference Fault Matrix
| Symptom | Likely cause | Remedy |
|---|---|---|
| Stuck 16#7000, never 7001 | FB not called / wrong OB / library missing | Install MODBUS_RTU, call in OB1, confirm instance DB |
| Stuck 16#7001, never 0000 | PORT HW ID is wrong or empty | Re-read HW identifier from System Constants |
| Stuck 16#7001, never 0000 | PLCSIM running | Test on physical CPU |
| DONE=TRUE then 16#8184 on first Modbus_Master | Wiring, termination, baud mismatch | Match slave settings, enable two terminations |
| 16#8180 right after download | HW identifier reassigned after re-inserting module | Refresh HW ID in DB or constant |
| 16#8181 on first call | Invalid BAUD/PARITY/MODE for the CM | Use only values listed in device properties |
| 16#8187 with 7001 to 0000 ok | Slave response timeout too short | Increase RESP_TO (ms) to 1000–3000 |
11. Extended Diagnostics: Reading the CM LEDs
The CM 1541-1 front panel LEDs provide instantaneous status that complements the STATUS word:
- DIAG slow red blink — module diagnostic event; check CPU diagnostic buffer for entry text "PtP configuration error" or similar.
- DIAG solid red — module fault, often firmware / configuration mismatch. Verify the module firmware in the device view matches a version supported by the CPU firmware (F-update the CM if required).
- TX / RX activity — should flicker on every Modbus_Master cycle. A completely idle TX/RX with DONE=TRUE on Modbus_Comm_Load confirms the master is not being called.
If the LEDs do not match the expected state, cycle power to the CM. A field-tested quirk: after a hot-swap or partial download, the CM can hold the previous port configuration in cache, returning 16#7001 because the new HW ID does not match its internal handle. A full power reset of the S7-1500 station clears the cache.
12. Frequently Asked Questions
Why does Modbus_Comm_Load show STATUS 16#7000 instead of 16#0000 on an S7-1500?
STATUS 16#7000 means the block is idle, not processing. The most common cause is a missing MODBUS_RTU library in the project, an empty or wrong HW identifier on the PORT input, or the FB not being called every OB1 cycle. Confirm the library is installed, the HW ID matches the CM 1541-1 in System Constants, and the call sits in OB1 unconditionally.
Does S7-PLCSIM support the CM 1541-1 for Modbus RTU testing?
No. PLCSIM and PLCSIM Advanced do not emulate the CM 1541-1 backplane bus, so Modbus_Comm_Load returns 16#7000 indefinitely in simulation. Use a physical S7-1500 CPU with the CM 1541-1 inserted, or switch to the MODBUS_PN library with an Open User Communication path that PLCSIM can emulate over PROFINET.
What MODE parameter do I select in Modbus_Comm_Load for RS485 half-duplex Modbus RTU master?
Use MODE = 4. This selects the Modbus RTU master protocol on the Freeport-configured RS485 half-duplex port. MODE = 0 disables the protocol and is the most common reason a programmer sees the block "do nothing" after configuration.
How do I find the correct PORT (HW identifier) for the CM 1541-1?
Open the project, right-click the CPU, and select "Properties > System Constants". Filter for "CM 1541-1" or "PtP interface". The integer shown in the HW Identifier column is the value to assign to the PORT input of Modbus_Comm_Load. This value is assigned automatically and changes if you remove and re-add the module.
The Modbus_Comm_Load returns DONE=TRUE once but Modbus_Master always returns 16#8187 timeout — what is wrong?
This is a slave-side or physical-layer problem, not a Modbus_Comm_Load problem. Verify with a PC tool (Modscan, Modbus Poll) that the slave answers. Check that baud rate, parity, and slave address on the CM match the slave exactly, that A/B are not reversed, and that the RESP_TO (ms) value in the Modbus_Master call is longer than the slave's actual response delay (typically 1000–3000 ms for slow instruments).