Siemens ET 200SP CM PtP Modbus Master Error 8281 Troubleshooting
Problem Overview
When a working Modbus RTU master application on a SIMATIC S7-1200 CPU 1214 (with a CM 1241 serial module) is migrated to a SIMATIC S7-1513 CPU controlling a distributed ET 200SP station with an IM 155-6 PN ST interface module and a CM PtP communication module, communication can become intermittent. The classic symptom pattern is:
-
Modbus_Comm_LoadreturnsSTATUS = 16#7000(no error reported at load time). -
Modbus_MasterreturnsSTATUS = 16#8281on every call. - The instance-DB static variable
MB_DB_SPORTremains at its initial valueW#16#FFFFinstead of being populated with the connection identifier fromModbus_Comm_Load. - The underlying
WRRECcall reports status16#C080_9300(identifier/address invalid) when the master attempts to start a request. - Forcing
MB_DB_SPORTmanually (for example toW#16#0136) makes the master poll successfully until the next cold restart, but the override is not a sustainable solution.
This article documents the root cause of the MB_DB_SPORT not being automatically updated, the meaning of error 16#8281, the meaning of 16#C080_9300, and the correct TIA Portal configuration that allows the connection identifier to be written back into the Modbus_Master instance automatically.
System Architecture: S7-1200 to S7-1500 + ET 200SP Migration Path
The migration path that triggers this fault is structurally different from the original configuration, even when the same project blocks and slaves are used.
Original Configuration (Working)
- Controller: S7-1214 DC/DC/DC (firmware 4.x) with a CM 1241 RS422/485 plug-in serial module.
- Topology: Point-to-point, CM is in the local S7-1200 rack and is configured directly under the CPU in the device view.
- Hardware identifier of the CM: assigned by TIA Portal locally (small integer, typically 260–263).
- Modbus_Comm_Load LADDR: the local CM identifier.
New Configuration (Intermittent / Failing)
- Controller: S7-1513-1 PN (firmware 2.9 or later), with a PROFINET line to the distributed I/O.
- Distributed station: ET 200SP with IM 155-6 PN ST (article number 6ES7155-6AU00-0BN0 or 6ES7155-6AU30-0BN0 depending on firmware).
- Communication module: ET 200SP CM PtP (6ES7137-6AA00-0BA0) plugged to the right of the IM in the BaseUnit chain.
- Hardware identifier of the CM PtP: assigned by TIA Portal in the distributed I/O namespace (typically a much larger integer, for example 4113 or 4138 in a real project, depending on slot index).
- Modbus_Comm_Load LADDR: must reference the distributed CM PtP identifier, not the local identifier of the CPU.
Two of the most common port-identifier mistakes during migration are:
- Leaving the old local
LADDRof the CM 1241 in theModbus_Comm_Loadblock while the project now points to a CM PtP under an IM 155-6 PN ST.WRRECto the wrong slot returns16#C080_9300immediately. - Compiling only the changed S7-1500 program without re-doing the device configuration of the ET 200SP head, leaving the
MB_DB_SPORTin the static area pointing to a slot that exists in the old project but is no longer mapped.
Modbus Communication Blocks in TIA Portal
The Modbus RTU master on an S7-1500/ET 200SP uses the library "MODBUS (RTU)" blocks from Siemens. The two blocks that interact are described in the Siemens Industry Online Support documentation set for the S7-1500/ET 200SP Modbus library (see also the ET 200S Modbus/USS module manual for the historical reference that defines the protocol-driver structure used by CM PtP).
| Block | Function | Critical I/O for this fault |
|---|---|---|
| Modbus_Comm_Load (FB 1200 / 1800 family) | Configures the CM PtP port, sets baud/parity/flow, allocates the connection ID and writes it back to the master/slave instance DB static area. |
LADDR (HW ID of CM PtP), BAUD, PARITY, FLOW_CTRL, MB_DB (reference to the Modbus_Master instance DB), DONE, ERROR, STATUS. |
| Modbus_Master (FB 1201 / 1801 family) | Issues a Modbus request (FC 01, 02, 03, 04, 05, 06, 15, 16, 23) to the slave, using the connection previously created by Modbus_Comm_Load. |
REQ, MB_ADDR, MODE, DATA_ADDR, DATA_LEN, DONE, BUSY, ERROR, STATUS, static MB_DB_SPORT. |
The static variable MB_DB_SPORT is the connection identifier that the master uses internally to address the CM PtP port. The value is set by the Modbus_Comm_Load call from the moment DONE = TRUE is signaled. The master FB then uses that stored identifier for every subsequent request.
Root Cause Analysis: MB_DB_SPORT Not Populated
When MB_DB_SPORT remains at W#16#FFFF in the online view of the Modbus_Master instance DB, the most common root causes are:
-
LADDR mismatch. The HW identifier at the
LADDRinput ofModbus_Comm_Loaddoes not match the actual CM PtP module that has been plugged and configured under the IM 155-6 PN ST. The most frequent cause after a hardware migration is that theLADDRconstant was not updated when the device was re-assigned from a local CM 1241 to a distributed CM PtP. -
CM PtP not configured for "Modbus master" in the device view. In the ET 200SP CM PtP properties, the operating mode must be set to Modbus master (RTU) under Operating mode > Module parameters > Protocol. If the protocol is left as Freeport / Transparent, the module rejects the parameter record write from
Modbus_Comm_Loadand the load block never writes back a validMB_DB_SPORT. -
Multiple Modbus_Comm_Load calls on the same instance. Re-invoking
Modbus_Comm_Loadagainst an already-loaded instance with a differentMB_DBreference clears the stored port. The block then cannot validate which instance owns the port, and the master seesW#16#FFFF. -
Project compile not propagated. The S7-1500 program was downloaded, but the ET 200SP submodule (the CM PtP itself) was not re-downloaded. The CPU has the new
LADDRconstant, but the actual submodule still has the old PROFINET slot configuration. In this case theWRRECin the load block returns16#C080_9300("wrong ID"). -
Different Modbus library versions for S7-1200 and S7-1500. The S7-1200 and S7-1500 Modbus libraries use different FB numbers (FB 1200/1201 on S7-1200 versus FB 1800/1801 on S7-1500). Migrating a project copies the old block tags, but the internal
MB_DB_SPORToffset may differ. The result is that the load block writes the value into a different byte of the master instance DB than the master reads, and the master still seesW#16#FFFF.
The presence of STATUS = 16#7000 on Modbus_Comm_Load while MB_DB_SPORT remains W#16#FFFF is the diagnostic fingerprint of cause 5 above, or of cause 1 with a stale instance DB that was not re-initialised after download. The fingerprint of cause 1 with a live configuration mismatch is STATUS = 16#C080_9300 on the load block, with the master still showing 16#8281.
Decoding Error 16#8281 in Modbus_Master
The status code 16#8281 is documented in the TIA Portal help for the Modbus library. The two production-grade interpretations are:
-
Configuration mismatch. The Modbus_Master instance has been loaded by
Modbus_Comm_Loadwith parameters that are inconsistent with the current hardware configuration of the CM PtP (different baud, parity, or port). The internal state machine aborts before issuing the request. -
No valid connection ID. The static
MB_DB_SPORTin the Modbus_Master instance DB isW#16#FFFF, meaning the load block has not yet written a valid connection identifier into the instance. The master therefore has no port to address and refuses the request.
In the migration case, the second interpretation is the one that matches the observation: MB_DB_SPORT = W#16#FFFF, master status 16#8281, and forcing the value to W#16#0136 makes the master work until the next restart. The connection identifier W#16#0136 is the TIA Portal-assigned handle for the CM PtP submodule under the IM 155-6 PN ST in this particular project layout.
PROFINET IO Error 16#C080_9300 in WRREC
The status 16#C080_9300 is a PROFINET IO controller / device record error returned by the standard WRREC instruction when the parameter record write is rejected by the addressed IO device. In the context of a Modbus load call against a CM PtP, this status means "identifier/address invalid": the HW ID at LADDR does not match any IO submodule currently configured in the device view of the ET 200SP head.
This is consistent with:
- The original CM 1241 being unplugged from the S7-1200 (and thus the
LADDRfrom the old project no longer exists in the new project), or - The CM PtP being added to the ET 200SP under a different slot than the one referenced by the
LADDRinput.
When this error appears simultaneously with the master's 16#8281, the resolution path is to fix the LADDR in the load block, recompile, and re-download the ET 200SP configuration to the field.
Step-by-Step Resolution
The procedure below resolves the issue without manually editing the instance DB. It assumes the project is opened in TIA Portal V17 or later and the target is an S7-1500 CPU with ET 200SP.
Prerequisites
- TIA Portal project with the migrated S7-1500 CPU and ET 200SP station.
- CM PtP module physically installed in the ET 200SP BaseUnit chain, seated and locked.
- Online connection to the S7-1500 CPU (PROFINET or Ethernet).
- The Modbus library installed: Modbus_Comm_Load (FB 1800) and Modbus_Master (FB 1801) for S7-1500, or the equivalent for ET 200SP CPU.
Procedure
- Re-validate the ET 200SP device configuration. In the project tree, open Devices & networks > ET 200SP station > Device view. Verify the slot order: IM 155-6 PN ST in slot 0, the CM PtP in slot 1 (or wherever the project intends it). The slot number becomes part of the HW identifier of the submodule.
- Set the CM PtP operating mode. Select the CM PtP module in the device view, open Properties > Operating mode, and choose Modbus master (RTU). Set baud, parity, data bits, stop bits, and flow control to match the slave.
- Read the correct HW identifier of the CM PtP. With the project selected, open PLC > Accessible devices or place the cursor on the CM PtP in the device view and read the System constants / HW identifiers. For a typical ET 200SP configuration the CM PtP interface identifier will be a value in the high 4000s or low 5000s. Record this value.
-
Update the Modbus_Comm_Load instance. Open the OB that calls
Modbus_Comm_Load(typically OB 1 or a cyclic OB). At theLADDRinput, replace the constant with the HW identifier of the CM PtP recorded in step 3. Do not use a local CM identifier from a previous S7-1200 project. Confirm theMB_DBinput references the correctModbus_Masterinstance DB. -
Delete and re-create the Modbus_Master instance DB. This forces TIA Portal to regenerate the static structure with the offsets of the current library version. Right-click the instance DB, choose Delete block, then drag a fresh
Modbus_Masterinstance from the library into the call. Re-link any user code that referenced the old instance. -
Recompile hardware and software. Right-click the S7-1500 CPU > Compile > Hardware and software (rebuild all). TIA Portal will recompute the HW identifiers and propagate the new
LADDRconstants into the program. - Download hardware configuration first, software second. Use Download to device > Hardware configuration, confirm the ET 200SP station comes up with no diagnostic interrupts, then Download to device > Software (all). This order ensures the CM PtP submodule exists in the actual field configuration before the Modbus_Comm_Load issues a record write to it.
-
Run Modbus_Comm_Load once with REQ = TRUE. In online mode, force or trigger a single execution of
Modbus_Comm_LoadwithREQ = TRUE. Verify thatDONE = TRUE,ERROR = FALSE, andSTATUS = 16#0000on the rising edge ofDONE. -
Confirm MB_DB_SPORT in the instance DB. Open the Modbus_Master instance DB in online view and inspect the static
MB_DB_SPORT. The value must now be a TIA Portal-issued connection identifier (a non-FFFFword). It will typically look likeW#16#0136for the first configured Modbus master port in the project, or any other value TIA Portal assigned for that specific HW identifier. -
Issue one Modbus_Master call. Set
REQ = TRUEon the master FB. The first call returnsSTATUS = 16#7001(first call) or16#7002(intermediate), and within the Modbus response time the call returnsDONE = TRUEandERROR = FALSEwithSTATUS = 16#0000. No more16#8281should appear.
Verification
Validate the fix at three levels: instance state, runtime status, and physical line.
| Check | Where | Expected | Pass criterion |
|---|---|---|---|
| Modbus_Comm_Load STATUS | Online view of load FB |
16#0000 on DONE rising edge |
ERROR = FALSE, STATUS = 16#0000 |
| MB_DB_SPORT | Modbus_Master instance DB, static | Non-FFFF word, e.g. W#16#0136
|
Holds its value across STOP/RUN |
| Modbus_Master STATUS | Online view of master FB |
16#0000 on DONE, 16#7001/7002 in flight |
No 16#8281 after first call |
| WRREC STATUS | Internal to load block (not always visible) |
16#0000 or 16#DF00_81C0 (job running) and then DONE |
No 16#C080_9300
|
| CM PtP diagnostic buffer | Online > Diagnostics > CM PtP | No channel/bus errors, frame counters incrementing | Frames sent > 0, frames received > 0, CRC errors = 0 |
| Physical line | Oscilloscope or Modbus tap on RS485 A/B | 3.5-character silence, then valid 11-bit frames, correct inter-frame delay | Idle line voltage > 200 mV (RS485 idle bias correct), end-of-frame gap present |
Error Code Reference Matrix
Use the following matrix when triaging Modbus RTU on an S7-1500 with ET 200SP CM PtP.
| Block | STATUS (hex) | Meaning | Likely cause | Action |
|---|---|---|---|---|
| Modbus_Comm_Load | 16#0000 | No error | DONE = TRUE expected | Continue |
| Modbus_Comm_Load | 16#7000 | No call active | REQ = FALSE | Trigger REQ = TRUE |
| Modbus_Comm_Load | 16#7001 | First call with new parameters | Normal | Wait for DONE/ERROR |
| Modbus_Comm_Load | 16#7002 | Intermediate call, parameters already accepted | Normal | Wait for DONE/ERROR |
| Modbus_Comm_Load | 16#80C8 | Access error reported by I/O | PROFINET diagnostic pending | Read CM PtP diagnostics, fix slave wiring |
| Modbus_Comm_Load | 16#8181 | Port already in use by another instance | Two Modbus_Comm_Load on same CM PtP | Remove duplicate, ensure single owner |
| Modbus_Comm_Load | 16#8182 | Parameter record rejected by module | Wrong baud/parity/flow or wrong protocol mode | Re-check CM PtP operating mode = Modbus master |
| Modbus_Comm_Load | 16#8281 | Internal buffer overflow / version mismatch | Library version vs. project migration | Re-create instance DB with current library |
| Modbus_Comm_Load | 16#C080_9300 | Address/identifier invalid (via WRREC) | Wrong HW identifier at LADDR | Re-assign LADDR to the correct CM PtP submodule |
| Modbus_Master | 16#0000 | No error | Request completed | Continue |
| Modbus_Master | 16#7000 | No call active | REQ = FALSE | Trigger REQ = TRUE |
| Modbus_Master | 16#7001 | First call | Normal | Wait for DONE |
| Modbus_Master | 16#7002 | Intermediate call | Normal | Wait for DONE |
| Modbus_Master | 16#8181 | Master busy with previous request | Overlapping REQ pulses | Wait for DONE/ERROR before next REQ |
| Modbus_Master | 16#8182 | Slave error or no response within timeout | Wiring, slave address, baud mismatch | Check RS485 bias, termination, slave address |
| Modbus_Master | 16#8281 | No valid connection ID / configuration mismatch | MB_DB_SPORT = FFFF or load parameters changed | Re-run Modbus_Comm_Load after fix, do not force SPORT |
| Modbus_Master | 16#80C8 | Exception response from slave (FC + 0x80) | Slave rejected the data area | Inspect DATA_ADDR and DATA_LEN, slave register map |
Preventive Configuration Best Practices
When designing a Modbus RTU master on an ET 200SP CM PtP, the following rules prevent the 16#8281 fault from reappearing in future projects.
-
Pick the right library per CPU generation. Use the S7-1500/ET 200SP library (FB 1800/1801) for an S7-1500 CPU. The S7-1200 library (FB 1200/1201) is functionally compatible at the wire level but produces a different instance-DB static layout. Mixing them after migration is the most common root cause of
MB_DB_SPORTnot being written back. -
Assign a unique MB_DB per port. Each physical CM PtP port must be loaded by exactly one
Modbus_Comm_Loadcall referencing exactly one master (or slave) instance DB. Multiple load calls against the same instance corrupt the stored port. -
Use symbolic HW identifiers. Reference the CM PtP through a tag of type
HW_INTERFACEpopulated from the system constants of the device configuration, not a raw integer constant. The compiler then re-validates the symbol when the slot changes. -
Run Modbus_Comm_Load only on cold start and on parameter change. Calling the load FB every OB1 cycle is unnecessary once
DONE = TRUE. Use a one-shot pattern with a rising-edge on the cold-restart bit or a parameter-change flag. -
Watch the diagnostic buffer of the CM PtP after download. PROFINET port-down events on the ET 200SP head will tear down the CM PtP submodule connection; the load block must be re-run after such an event. A watchdog on
Modbus_Master.ERRORandSTATUS = 16#8182(no response) is a good trigger. -
Maintain RS485 bias and termination. For multi-drop RS485, enable the fail-safe bias on the ET 200SP CM PtP (per the device manual) and place 120 Ω termination at both physical ends only. Missing bias explains the "sometimes working, sometimes not" symptom pattern that often accompanies
16#8182in field installations. - Match the inter-frame timeout. The Modbus RTU spec requires a 3.5-character silence between frames. At 9600 baud this is roughly 4 ms; at 19200 baud it is roughly 2 ms. Use a Modbus tap or a serial analyser to confirm the CM PtP is actually emitting this gap; some slave devices are very strict about it.
Hardware and Software Compatibility Notes
| Component | Article / firmware | Notes |
|---|---|---|
| S7-1500 CPU 1513-1 PN | 6ES7513-1AM02-0AB0 (or 1AM03 from FW 2.9) | FW 2.9 or higher recommended for ET 200SP CM PtP interoperability |
| IM 155-6 PN ST | 6ES7155-6AU01-0BN0 (FW ≥ V3.0) or 6ES7155-6AU30-0BN0 (high-feature) | Standard variant supports CM PtP; HF adds additional value-IO modules |
| CM PtP for ET 200SP | 6ES7137-6AA00-0BA0 (RS232/422/485, one channel) or 6ES7137-6AA01-0BA0 (successor) | Operating mode must be "Modbus master (RTU)" for this application |
| BaseUnit for CM PtP | 6ES7193-6BP00-0BA0 (BU15-P16+A0+2B) or 6ES7193-6BP00-0DA0 (BU15-P16+A0+2D, dark) | Type A0 (new load group start) is required if the CM PtP is the first module after the IM and is fed from a separate power supply |
| TIA Portal | V16 + HSP for the CM PtP or V17/V18 with the module in the device catalog | Older TIA Portal versions require a hardware support package (HSP) to add the CM PtP to the device catalog |
| Modbus library (S7-1500) | FB 1800 (Comm_Load), FB 1801 (Master), FB 1802 (Slave) | Shipped with TIA Portal, no separate installation needed |
W#16#0136 is a legitimate connection identifier in modern TIA Portal projects as well.
Field-Commissioning Checklist
Use this condensed checklist when commissioning a fresh migration from an S7-1200 CM 1241 setup to an S7-1500 + ET 200SP CM PtP setup.
- [ ] CM PtP physically installed in the correct BaseUnit slot, locked.
- [ ] PROFINET cable from CPU 1513 to IM 155-6 PN ST verified with PROFINET diagnostics (no port-down events).
- [ ] TIA Portal device view shows the CM PtP in the correct slot and protocol mode = Modbus master (RTU).
- [ ]
LADDRinput ofModbus_Comm_Loaduses the symbolic HW identifier of the distributed CM PtP, not the legacy CM 1241 identifier. - [ ]
Modbus_Comm_Load.MB_DBreferences the correctModbus_Masterinstance DB. - [ ] Baud, parity, data bits, stop bits match the slave datasheet exactly.
- [ ] RS485 bias enabled (internal) or external resistor network fitted.
- [ ] Termination resistors (120 Ω) at the two physical ends of the bus only.
- [ ] First
Modbus_Comm_Loadcall returnsDONE = TRUE,STATUS = 16#0000. - [ ]
MB_DB_SPORTin the master instance DB is a non-FFFFword and survives STOP/RUN. - [ ] First
Modbus_Mastercall returnsDONE = TRUE,STATUS = 16#0000; data is in the configured target area. - [ ] Long-run monitor (≥ 1 h) shows zero
16#8281and zero16#C080_9300occurrences.
Why does Modbus_Master return 16#8281 right after migrating from S7-1200 to S7-1500 + ET 200SP?
Status 16#8281 means the master has no valid connection ID. After migration, the static MB_DB_SPORT in the master instance DB typically remains at W#16#FFFF because either the LADDR input of Modbus_Comm_Load still points to the old local CM 1241 instead of the distributed CM PtP, or the instance DB was generated by the S7-1200 library and the new S7-1500 library (FB 1800/1801) writes the port handle at a different offset. Re-assign LADDR to the CM PtP HW identifier and delete/re-create the instance DB with the current library.
Is it safe to force MB_DB_SPORT to W#16#0136 in the online instance DB?
It restores communication temporarily and is useful as a diagnostic step, but it is not a fix. The forced value is cleared on every STOP/RUN transition, online/offline compare marks the DB as divergent, and Siemens support will not accept the project for further analysis if a library FB instance is forced. Use the value only to confirm that the rest of the configuration is correct, then apply the resolution in the project to make the load block write the value itself.
What does WRREC status 16#C080_9300 mean in this context?
It is a PROFINET IO record-error: the address/identifier at the LADDR input of the underlying record write is not a known IO submodule. In a Modbus setup this is almost always caused by the LADDR pointing to a non-existent or re-slotted CM PtP under the IM 155-6 PN ST. Re-read the HW identifier from the ET 200SP device view (system constants) and update the constant at the LADDR input.
Can the S7-1200 Modbus library (FB 1200/1201) be used on an S7-1500 with ET 200SP?
Functionally the protocol on the wire is the same, but the FB numbers, instance-DB layouts, and supported status codes differ between the two libraries. Mixing the S7-1200 library on an S7-1500 is not a recommended path and is the most common root cause of the master not seeing the port identifier. Use FB 1800/1801 from the S7-1500/ET 200SP Modbus library for an S7-1500 CPU.
Do I need to call Modbus_Comm_Load every OB1 cycle?
No. The load block only needs to run when the CM PtP parameters (baud, parity, etc.) change or after a cold restart / PROFINET reconnect of the ET 200SP station. Call it once at startup on the first OB1 cycle after the PROFINET IO is up, gate it behind a one-shot on the cold-restart bit, and call it again only when the master reports STATUS = 16#8182 (no response) for a sustained period. Calling it every cycle wastes CPU time and can race with the master's request handling on busy ports.