Problem Overview
A Siemens SIMATIC S7-400 CPU 416-2 DP (typical catalog numbers 6ES7416-2XN05-0AB0 through 6ES7416-2XP07-0AB0) configured as the master of an automation cell stops unexpectedly with diagnostic event 16#494D – "STOP due to IO error". The CPU diagnostic buffer shows that the immediate trigger was an I/O access error 16#39B4 raised by a downstream PN/PN coupler (typical catalog 6ES7158-3AD10-0XA0) while the CPU was updating the process image outputs of process image partition (PIP) 0 starting at byte address 1000 with a length of 196 bytes. The fault is preceded by a diagnostic interrupt 16#3942 at input address 16372 indicating "module/submodule fault / channel error detected". The coupler auto-recovers and posts 16#3842 ("Module OK") minutes later, but on the failing event the CPU did not survive the access fault and went to STOP.
This article documents the root cause, decodes the diagnostic buffer, and provides a reproducible commissioning and verification procedure for the dual 24 V power-supply wiring of a PN/PN coupler, plus the role of OB82, OB85, and OB122 in keeping the CPU in RUN.
Affected Hardware and Topology
| Component | Catalog / Version | Role in Fault Path |
|---|---|---|
| SIMATIC S7-400 CPU 416-2 DP | 6ES7416-2XN05-0AB0 / -2XP07-0AB0, firmware ≥ V5.x | Master controller; raises diagnostic and I/O access events |
| PN/PN coupler | 6ES7158-3AD10-0XA0 (or -3AD00-0XA0 legacy) | Gateway between two PROFINET networks; carries the failing I/O |
| Distributed I/O on secondary side | ET 200S / ET 200MP head modules + digital/analog modules | Channel-fault source reflected as 16#3942 |
| Power supply 1 (PS1) | SITOP PSU300S or equivalent 24 V / ≥ 5 A | 24 V for coupler terminals 1L+, 1M |
| Power supply 2 (PS2) | Independent 24 V source (battery-backed or second SITOP) | 24 V for coupler terminals 2L+, 2M |
| Engineering station | STEP 7 V5.6 / V5.7 or TIA Portal V16–V20 | Online diagnostics and OB download |
The PN/PN coupler is intentionally designed with two electrically isolated 24 V inputs so that a loss of one supply does not interrupt PROFINET communication. The internal logic ORs the supplies; only when both are absent or unstable does the coupler drop out. Conversely, when only one supply is energized, transient brown-outs on that rail have no backup and can stall the coupler long enough to fail the cyclic I/O update of the S7-400.
Diagnostic Buffer Decoded
The CPU diagnostic buffer is the single most reliable source of truth for an I/O access stop. The following three entries are emitted in the sequence shown, with the final entry being the actual cause of the STOP transition.
Entry 1 – Diagnostic Interrupt (incoming)
-
Event ID:
16#3942– Module problem or maintenance necessary - Module type: Distributed I/O (PROFINET device behind the PN/PN coupler)
-
Input address: 16372 (decimal) =
16#3FF4 - Channel information available: yes
- User information available: yes
- Module/submodule fault, External module error, Channel error detected
- Requested OB: OB82 (Diagnostic interrupt OB)
- Priority class: 25
-
Coding word sequence:
16#3942 1952 C554 3FF4 0D33 0000
The 0D33 field is the channel-error qualifier. A common interpretation per the STEP 7 diagnostic-event reference is channel fault, short circuit / overload / over-temperature at the PROFINET device. This entry alone does not stop the CPU if OB82 is loaded.
Entry 2 – I/O Access Error (incoming)
-
Event ID:
16#39B4– I/O access error when updating the process image output - Access error occurred with user data
- Process image partition no.: 0 (PIP 0 is the automatic update PIP tied to OB1)
- Start address of I/O area involved: 1000 (decimal), Length: 196 bytes
- Requested OB: OB85 (Program execution error OB)
- Priority class: 25
-
Coding word sequence:
16#39B4 1955 5750 2943 00C4 03E8
Address 1000 (decimal) = 16#03E8. The coding 00C4 = 196 decimal, confirming the 196-byte output range PIP 0 was attempting to refresh when the coupler failed the read-back. Because OB85 was present in the project the CPU normally logs and continues, but a single shot escalated the severity.
Entry 3 – STOP Transition (incoming)
-
Event ID:
16#494D– STOP due to IO error -
Z1 (info): 9182 – derived from
16#23E6which is the standard qualifier for "STOP by IO access error OB85 with priority class error" - Z2: 03B0 (PIP 0, byte offset qualifier)
- Z3: 04F9 (logical address tag of the affected slot)
- Previous operating mode: RUN
- Requested operating mode: STOP (internal)
Siemens' S7-400 firmware escalates to STOP when the OB85 error is associated with an OB that has not been loaded, or when the I/O access occurs in a priority class that cannot be masked. In this project OB85 was already loaded, so the escalation was the result of multiple access faults in rapid succession while PIP 0 was being updated – a condition the CPU firmware treats as a fatal I/O error.
Recovery Event (incoming → outgoing)
-
Event ID:
16#3842– Module OK - Module type: Distributed I/O
-
Input address: 16372 (
16#3FF4) - Requested OB: OB82
This entry typically appears minutes later, confirming the PN/PN coupler re-established the PROFINET AR (Application Relationship) on its own. On the failing event the CPU had already dropped to STOP before this recovery could be observed.
Event ID Quick Reference
| Event ID | Meaning | Triggered OB | Default Reaction (no OB) |
|---|---|---|---|
| 16#3842 | Module OK (outgoing diagnostic) | OB82 | Informational – no STOP |
| 16#39B4 | I/O access error updating process image output | OB85 | CPU goes to STOP |
| 16#3942 | Module problem / channel error | OB82 | CPU goes to STOP |
| 16#494D | STOP due to I/O error | n/a – terminal event | CPU in STOP |
| 16#39B1 | I/O access error reading process image input | OB85 | CPU goes to STOP |
Root Cause – Single Power-Supply Feed on the PN/PN Coupler
The PN/PN coupler 6ES7158-3AD10-0XA0 has two independent 24 V inputs:
- 1L+ / 1M – power for the left PROFINET interface
- 2L+ / 2M – power for the right PROFINET interface and internal logic buffer
By design these rails are diode-ORed internally. If the cabinet wiring brings both 1L+ and 2L+ from the same 24 V source and that source is loaded by other 24 V consumers, the rail voltage can dip below the coupler's 20.4 V undervoltage threshold (UVR) for tens of milliseconds. A brown-out of that duration is long enough to:
- Drop the PROFINET AR on one or both sides of the coupler.
- Cause PIP 0 to fail its read-back of the 196-byte output area starting at 1000.
- Trigger
16#39B4, then the16#3942channel fault at logical address 16372. - Escalate to
16#494DSTOP if the fault cluster exceeds the firmware's mask window.
In the case logged on 02/26/2016, the physical site survey showed that only one of the two 24 V supplies was switched on. With only one rail energized there is no redundant headroom; any sags from the energized source pass directly to the coupler. Once both PSUs were powered, the fault did not re-occur.
Role of OB82, OB85, and OB122
Siemens S7-300/S7-400 CPUs invoke specific error OBs depending on the failure class. Each OB, if present, suppresses the default transition to STOP and instead transfers control to the user program so it can react.
OB82 – Diagnostic Interrupt OB
Called when a PROFINET or PROFIBUS DP slave signals a diagnostic event (16#3942 incoming, 16#3842 outgoing). The OB82 start information contains the logical base address of the slot, the channel number, and the channel-error value. If OB82 is missing, the CPU goes to STOP on the first incoming diagnostic interrupt. Reference: Siemens – I/O access error OB 122 (S7-300, S7-400).
OB85 – Program Execution Error OB
Called when a process-image update fault (16#39B1 read, 16#39B4 write) or a priority-class error occurs. The OB85 start information includes the PIP number, byte offset, and the slot's logical address. If OB85 is missing, the CPU goes to STOP the first time it fails to update PIP 0. When OB85 is loaded, the CPU continues in RUN but still logs the event – the user can then evaluate OB85_EXC_CLASS and OB85_BLK_TYPE in the start info to filter transient events from hard faults.
OB122 – I/O Access Error OB
Called on direct I/O access via load/transfer instructions (e.g. L PEW 1000 or T PAW 1000) when the addressed slot is faulty. This is distinct from OB85 which handles the cyclic process-image refresh. Reference: Siemens – Organization blocks S7-300/S7-400.
STEP-by-Step Troubleshooting Procedure
- Capture the diagnostic buffer. Open the S7 project in STEP 7 V5.x, right-click the CPU, select PLC > Diagnostics/Setting > Diagnostics Buffer (or in TIA Portal: Online > Diagnostics > Diagnostics buffer). Export the full buffer to a text file. Look for the 16#39B4 / 16#3942 / 16#494D triplet.
- Identify the slot. From the 16#39B4 entry, note the PIP number, start address, and length. Cross-check with PLC > Module Information to confirm which device occupies the address range. In the case above, address 1000 with length 196 = the output image of the PN/PN coupler's right-hand PROFINET network.
- Read the OB85 start information. Add a temporary snippet to OB85 that copies the start info into a DB, e.g.:
// OB85 – Program execution error OB
// Temporary diagnostics, remove after root cause is fixed
L #OB85_EXC_CLASS // 16#3Axx = I/O access error
T DB200.DBD 0
L #OB85_BLK_TYPE // 5 = process image update
T DB200.DBD 4
L #OB85_RESERVED_1 // PIP number (bits 0–7), offset (bits 8–23)
T DB200.DBD 8
L #OB85_DBNR // Slot logical address qualifier
T DB200.DBD 12
- Verify both 24 V rails on the PN/PN coupler. With a calibrated DMM, measure 1L+ to 1M and 2L+ to 2M at the coupler terminals. Each must read 24 V ±5 % under load. A single energized rail is the smoking gun.
- Check DIP switch position on the PN/PN coupler. On the 6ES7158-3AD10-0XA0 the 4-pole DIP switch (S1) configures the diagnostic behavior and the substitute-value strategy. Confirm the diagnostic-enable bit matches the project setting in Properties > PROFINET interface > Diagnostics.
- Inspect PROFINET cabling. Replace suspect patch cords; verify M12 D-coded connector torque (0.6 Nm). A marginal link produces the same signature.
- Confirm both 24 V supplies are physically separate. Trace 1L+ back to its breaker/MCB; trace 2L+ to a different MCB on the same or a different bus. If both rails return to the same PSU, run a second feed cable.
- Recompile and download. Once OBs are confirmed in the project, perform an online download of the S7 program only (no hardware reconfiguration). The CPU should not re-stop on the next brown-out because OB82 and OB85 will absorb the diagnostic and process-image errors.
-
Force a fault to verify OB behaviour. With the plant in a safe state, momentarily pull the PROFINET cable on the right side of the coupler. Expect:
- One 16#3942 incoming event (channel fault at address 16372).
- One 16#39B4 process-image write error.
- No STOP transition – OB85 absorbs the access error.
- 16#3842 outgoing once the cable is reconnected.
Verification Checklist
| Check | Expected Value | Result |
|---|---|---|
| 1L+ to 1M voltage at coupler | 24.0 V ±5 % | |
| 2L+ to 2M voltage at coupler | 24.0 V ±5 % | |
| PS1 source | Independent of PS2 (different MCB / bus) | |
| PS2 source | Independent of PS1 | |
| OB82 loaded in project | Yes | |
| OB85 loaded in project | Yes | |
| OB122 loaded in project | Yes (recommended) | |
| Diagnostic buffer after pull-cable test | 16#3942 → 16#39B4 → 16#3842, no 16#494D | |
| CPU mode after pull-cable test | RUN (no STOP) | |
| PROFINET name + IP of both coupler ports | Match project |
Reading the OB85 Start Information
| Local variable | Length | Meaning for 16#39B4 |
|---|---|---|
| OB85_EXC_CLASS | BYTE | 16#3A = I/O access error during process image update |
| OB85_BLK_TYPE | BYTE | 5 = process image update (PIP 0) |
| OB85_RESERVED_1 | WORD | Low byte = PIP number (0), high byte = byte offset within the PIP |
| OB85_RESERVED_2 | WORD | Logical address of the affected slot (16372 in this case) |
| OB85_RESERVED_3 | DWORD | Reserved |
PN/PN Coupler DIP Switch Reference (6ES7158-3AD10-0XA0)
| Switch | Position | Effect |
|---|---|---|
| S1.1 | OFF | Normal data exchange on PROFINET port 1 |
| S1.1 | ON | Substitute-value behaviour forced on port 1 (use only during commissioning) |
| S1.2 | OFF | Diagnostics enabled (match project setting) |
| S1.3 | OFF | Reserved – leave OFF |
| S1.4 | OFF | Restore factory defaults on next power-up (commissioning only) |
After any DIP change cycle both 24 V rails. Configuration is only latched at power-up.
Why Two Supplies Matter for the PN/PN Coupler
The coupler's internal OR-ing diodes mean each interface can source from either rail. With both 24 V inputs healthy:
- The undervoltage threshold of 20.4 V is only crossed if both supplies fail simultaneously.
- Brown-out of one rail is masked by the other rail, so the PROFINET AR does not drop.
- Channel diagnostics from the secondary side remain consistent with the project configuration, eliminating the 16#3942 spurious events that precede the 16#39B4 write failure.
With only one 24 V input energized the coupler is operating at its reliability floor. Any sags from the single source translate directly to firmware-level resets inside the coupler's PROFINET stack. The S7-400 sees a flapping AR, the PIP 0 update fails, and the firmware escalates to STOP once the error budget is consumed.
Common Variants and Edge Cases
- PN/PN coupler 6ES7158-3AD00-0XA0 (older revision): Same dual-supply wiring logic but the diagnostic buffer uses 16#39B3 / 16#39B5 codes instead of 16#39B4. The fix is identical.
- S7-400H redundant CPU with PN/PN coupler: Both H-CPUs will log 16#494D independently. Check that the coupler is connected to a non-redundant PROFINET network or that both H-CPUs are members of the same MRP/MRPD ring.
- PROFINET IRT mode on the coupler: IRT narrows the time budget for the cyclic update. A 24 V brown-out that PIP 0 would absorb in RT mode will fail under IRT, producing the 16#39B4 cluster within a single cycle.
- Shared DC bus on the cabinet: If the coupler's 24 V is shared with a high-inrush load (e.g. a contactor or inverter DC link), the inrush sag can dip the rail below 20.4 V for > 20 ms. Move the coupler to a dedicated 24 V branch.
Field-Proven Best Practices
- Feed 1L+ and 2L+ from independent MCBs on different busbars. A single trip should never black out both rails.
- Add a 24 V DC-UPS (e.g. SITOP UPS1600) on at least one rail. Buffering covers the 100–500 ms sag that a switch-mode PSU cannot ride through.
- Always load OB82, OB85, OB121, and OB122. Use Report System Error in STEP 7 to auto-generate the OBs and the corresponding diagnostic DBs. This is the most reliable way to ensure nothing is missing.
- Pull-test every cabinet at commissioning. Trip PS1 only – the coupler and CPU should remain in RUN with OB82 firing. Trip PS2 only – same. Trip both – expect a controlled STOP, not an uncontrolled fault cascade.
- Document the PIP mapping. If PIP 0 covers a large output area (here 196 bytes starting at 1000), consider splitting it into smaller PIPs assigned to dedicated OBs. A 196-byte PIP that fails in a single cycle is harder to mask than four 49-byte PIPs.
Diagnostic Decision Flowchart
Related Siemens Documentation
- Siemens TIA Portal – I/O access error organization block OB 122 (S7-300, S7-400)
- Siemens TIA Portal – I/O access error OB (S7-1500)
FAQ
What does Event ID 16#494D mean on an S7-400?
It is the terminal diagnostic entry "STOP due to I/O error". The CPU went from RUN to STOP because the firmware could not mask a fault from OB85 (process image) or OB122 (direct I/O). The Z1/Z2/Z3 fields pinpoint the slot, PIP, and access type.
Why does OB85 not always keep the CPU in RUN?
OB85 only masks a single I/O access error per priority class. If the process image update fails repeatedly within the firmware's error budget, the CPU escalates to STOP regardless of OB85's presence. The fix is to remove the upstream cause, not to add more error handling.
Does the PN/PN coupler really need two independent 24 V supplies?
Yes. The coupler's two 24 V inputs are diode-ORed for redundancy. Feeding them from a single PSU defeats the redundancy and exposes the coupler to brown-out whenever the shared source sags. Use separate MCBs or a DC-UPS on at least one rail.
What is the difference between OB85 and OB122?
OB85 handles faults during the automatic process image refresh (PIP update). OB122 handles faults on direct I/O accesses (L PEW / T PAW instructions) in the user program. Both should be loaded to cover cyclic and acyclic I/O paths.
How do I decode the address 16372 in the 16#3942 event?
16372 decimal = 16#3FF4. Use the slot configuration in HW Config (STEP 7 V5.x) or the device view in TIA Portal to identify which PROFINET device occupies that logical input address. The address is the diagnostic base address of the module reporting the channel error.