Fix S5 CPU 928B QVZ/ADF STOP: Read the ISTACK Fast

David Krause10 min read
PLC HardwareSiemensTroubleshooting
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

Problem Details

A SIMATIC S5 rack built around a CPU 928B (order number 6ES5928-3UB12) runs correctly for roughly two hours, then drops to STOP. The failure signature reported on the CPU front plate is:

  • QVZ on the first trip, with BASP active (command output disable, all digital outputs forced to 0).
  • After a manual reset/restart attempt, the CPU stops again but now with ADF on and BASP active.
  • Intermittently, during otherwise normal operation, the fault LED on one 32-point digital output module lights for about a second.

Rack population, left to right:

Slot Module
1 CPU 928B
2-3 32 DI, 32 DI
4 empty
5-10 32 DI x 6
11-16 32 DO x 6
17 empty
18 4 AI
19 4 AO

The only communication partner is an OP (operator panel). Relevant history: the external 24 VDC supply feeding the input side failed and was repaired; the fault pattern began after that repair.

Key distinction: QVZ and ADF are not the same fault. QVZ (Quittungsverzug, acknowledgement delay/timeout) means the CPU addressed an I/O byte and received no acknowledgement on the S5 bus. ADF (Adressierfehler, addressing error) means the program accessed a peripheral address for which no module is present or the module does not respond. Both point at the I/O bus, but the ISTACK tells you exactly which address and which program step.

How to Read the ISTACK on a CPU 928B

The interrupt stack is dumped from the programming device (STEP 5 PG software, Test > STACKS > ISTACK) after the CPU has gone to STOP and before you power-cycle or overall-reset it. An overall reset destroys the evidence.

Work the dump in this order:

  1. Read the STOP cause bits. These are the flagged control bits in the first ISTACK screen — for example STP-BEF (stop caused by an STP statement inside the user program), QVZ, ADF, NAU, ZYK, BAU. Multiple bits can be set if a subsequent error occurred during error handling.
  2. Read the block identification. The ISTACK names the block that was executing (in this case PB 90) and the relative address (STEP address counter, SAC) of the statement.
  3. Locate the offending statement. The reported relative address is normally the address of the next statement to be executed. So a dump showing relative address 0006 means you inspect the statement at relative address 0005 in PB 90 — that is the instruction that actually triggered the fault.
  4. Read OP-REG. The operation register holds the machine-code word of the instruction being processed. In this fault the dump showed OP-REG: D9A4. Decode it against the STEP 5 machine-code list to confirm the operand type and the absolute byte address the CPU tried to reach.
  5. Read the accumulators and the data block register if the failing statement is an indirect/indexed access — these reveal the computed pointer value that produced the illegal address.

To go from a relative address to source code, open PB 90 in STEP 5 in STL with address display. The addresses shown are word offsets from the block header, matching the ISTACK SAC directly.

Root Cause Analysis

Two candidate causes fit the evidence, and they are not mutually exclusive.

Candidate 1 — Faulty or non-responding I/O module

ADF with a fixed block/address pair (PB 90, relative address 0005/0006) means the statement at that point references a peripheral byte that the S5 bus does not acknowledge. Practical triggers:

  • The module is fitted but its bus interface has failed, so it stops acknowledging after it warms up (explains the ~2 h delay).
  • The 32 DO module whose fault LED flashes has an output driver in short-circuit/overload shutdown; the on-board protection trips, the module signals fault, and in the worst case stops acknowledging.
  • The absolute byte address written in the program does not correspond to any fitted module — the two empty slots (slot 4 and slot 17) are a strong hint that addresses were shifted after a hardware change.

Cross-check whether the module identified by the ISTACK address is the same module that shows the flashing fault LED. If it is, you have a single-point failure and the diagnosis is closed.

Candidate 2 — Repaired 24 VDC supply still degraded

The failure started after the input-side 24 VDC supply failed and was repaired. A supply that broke down under overload commonly has a second damaged component that only misbehaves once the unit reaches thermal equilibrium. The chain is self-reinforcing:

  1. An output short or overload draws excess current.
  2. The repaired supply heats beyond design margin and its output sags or ripples.
  3. Modules on the sagging rail stop acknowledging on the bus, or the CPU sees a bus timeout.
  4. CPU goes to STOP with QVZ/ADF, BASP drops all outputs.

The two-hour delay is the classic signature of a thermal or electrolytic-capacitor-related defect rather than a logic bug.

Candidate 3 — Illegal absolute address in PB 90

The decoded operation register value D9A4 was interpreted as a bit access on byte 164 with bit number 9. Bit numbers in STEP 5 are only valid in the range 0-7, so a bit 9 reference is not a legal I/O bit and would be produced by a mis-typed absolute address, by a corrupted block, or by an indirect access computing an out-of-range pointer.

Ambiguity to resolve before acting: the same 16-bit code can be read as several operand forms (for example set/assign on an input byte vs. an output byte). Do not assume which one it is. Confirm the decode against the STEP 5 machine-code list for the CPU 928B, and confirm against the actual STL text at relative address 0005 in PB 90. If block memory is suspect, re-download PB 90 from the archived, known-good project rather than trusting the resident copy.

Diagnostic Procedure

  1. Capture the ISTACK before anything else. Print or save both dumps (the QVZ trip and the ADF trip). Note block, relative address, OP-REG, and every set STOP cause bit.
  2. Map the failing address to a slot. Build a table of slot vs. absolute byte address range from the actual rack, including the two empty slots. Verify the address in the ISTACK falls inside a range that is physically populated.
  3. Verify PB 90 source. Open PB 90 in STL with addresses, read the statement at relative address 0005 and the two statements around it. Check for hard-coded absolute peripheral addressing (L PB, T PB, L PW, T PW, or bit operations on I/Q bytes) with a byte number that was valid before the hardware change but is not valid now.
  4. Measure the 24 VDC rails under load, hot. Log the supply output for the full two-hour run — a handheld reading at power-up proves nothing. Look for voltage sag, ripple growth, or a rail that drifts as the enclosure warms. Compare against the module specifications for permissible input voltage range and ripple.
  5. Chase the output fault LED. Identify the exact channel on the 32 DO module that flags. Disconnect the field wiring for that channel and run the machine. If the fault LED stops and the CPU survives past two hours, the defect is in the field wiring or the load, not the module.
  6. Substitution test. Swap the suspect DO module with an identical spare, or move it to the known-good address range and re-address in the program. If the fault follows the module, replace it; if the fault stays with the slot, the problem is the backplane/bus or the supply feeding that slot.
  7. Thermal check. With an IR thermometer, log the case temperature of the repaired supply and the suspect module at the 90-minute mark. A component running far above its neighbours identifies the failing part.

Corrective Actions

Finding Action
ISTACK address maps to an empty slot or a slot with no module Correct the absolute address in PB 90, or fit the missing module. Re-download and re-run.
ISTACK address maps to the DO module with the flashing fault LED Replace that module; clear the field short/overload first or the replacement will fail the same way.
Bit number outside 0-7 confirmed in the decoded instruction Re-download PB 90 from the archived project; if the source itself is wrong, correct the operand and re-test.
24 VDC rail sags or ripples after warm-up Replace the repaired supply with a new unit rated with margin over the measured steady-state load. Do not return a field-repaired supply to service on a production CPU.
STP-BEF set in the dump Search the program for STP statements and for OB blocks that call STP on error. The CPU may be stopping itself in a user-written error handler triggered by the QVZ/ADF, which masks the real first-cause bit.
BASP note: BASP active is a consequence, not a cause. When the CPU enters STOP, BASP disables the digital output drivers so the process is de-energised. Do not defeat or bypass BASP to keep the machine running — it is the only thing holding the outputs off while the CPU is faulted.

Verification

  1. Clear the ISTACK (overall reset only after the dumps are saved), download the corrected program, and start the CPU.
  2. Run the machine continuously for at least 4 hours — double the previously observed 2-hour time-to-failure — with the enclosure closed so thermal conditions are representative.
  3. Log the 24 VDC rail at start, 1 h, 2 h and 4 h. Voltage and ripple must remain inside the module input specification for the whole run.
  4. Confirm no module fault LED illuminates, even momentarily, during the run.
  5. After the run, pull an ISTACK/BSTACK read while the CPU is still in RUN — the stacks should be empty of new entries.
  6. Archive the corrected PB 90 and the slot-to-address map with the machine documentation so the next hardware change does not reintroduce the addressing error.

Preventive Notes

  • Keep a printed slot/address map inside the enclosure door. Empty slots in an S5 rack are the most common source of later ADF faults after a module is added or moved.
  • Fuse or individually protect output groups so a single field short trips a fuse rather than driving the shared 24 VDC supply into thermal failure.
  • Prefer replacement over repair for switch-mode supplies feeding a PLC I/O rail. A partially repaired supply produces exactly this class of intermittent, temperature-dependent fault.
  • Take an ISTACK dump every time the CPU stops, not just the first time. The QVZ dump and the ADF dump in this case carry different information; discarding either loses the fault chain.

What is the difference between QVZ and ADF on a Siemens S5 CPU?

QVZ (acknowledgement delay) means the CPU addressed an I/O byte on the S5 bus and got no acknowledgement within the bus timeout. ADF (addressing error) means the program accessed a peripheral address for which no module responds — typically an unpopulated slot or a module whose bus interface has failed.

How do I find the exact instruction that caused an ADF from the ISTACK?

Read the block name and relative address (SAC) from the ISTACK. The relative address points to the next statement, so inspect the statement one address lower — a dump reading 0006 in PB 90 means the fault came from the statement at relative address 0005. Cross-check with the OP-REG machine-code word.

Why does the CPU only stop after about two hours?

A time-to-failure that is repeatable in hours points to a thermal defect, not a logic error. The usual culprits are a repaired or overloaded 24 VDC supply whose output sags once it reaches thermal equilibrium, or an output module driver that overheats and stops acknowledging on the bus.

Does BASP mean the outputs are damaged?

No. BASP (command output disable) is asserted automatically when the CPU enters STOP and forces all digital outputs to the off state. It is a protective consequence of the STOP, not an indication of output hardware damage.

Can a single faulty 32 DO module take the whole CPU to STOP?

Yes. If the module stops acknowledging bus cycles or drags the shared 24 VDC rail down through a shorted output, the CPU raises QVZ or ADF and goes to STOP. A fault LED that flashes for about a second during normal running is a strong indicator of that module or its field wiring.

Back to blog