Overview of Internal Error 16#75D1
Error 16#75D1 is a STOP-class diagnostic event reported by Siemens SIMATIC F-CPUs (fail-safe controllers) in the S7-1500, S7-300, and S7-400 families. The hexadecimal code maps to a generic safety-program fault detected by the F-runtime group's integrity check. According to Siemens Support Entry 109783988, when the F-CPU enters STOP with 16#75D1, the firmware has detected a safety-critical violation inside the safety program (the F-block container compiled from the FBD/LAD/ST safety logic). The CPU cannot continue execution because doing so would compromise the SIL 2 / SIL 3 / PL d / PL e guarantee the F-system is rated for.
The same error code applies to legacy controllers running STEP 7 V5.x, as documented in Siemens Support Entry 16770414. Although the symptoms are identical, the diagnostic buffer entries, the F-signature regeneration procedure, and the recompilation rules differ between TIA Portal (S7-1500F) and STEP 7 V5.x (S7-300F / S7-400F).
16#75D1 forces a transition to STOP and disables safety outputs. Production lines under F-control lose their defined safe state (typically de-energize) until the operator clears the fault and performs a safety acceptance check. Never bypass the F-block signature check to return the system to RUN.Catalogue of Documented Causes for 16#75D1
Siemens lists several root causes in the support entries cited above. Each maps to a different failure mode inside the F-runtime group:
| Cause Category | Trigger Condition | Typical Diagnostic Buffer Text |
|---|---|---|
| Arithmetic overflow / underflow | Signed integer wraps beyond INT range in an F-FB or F-FC | "Overflow in safety-related variable" |
| Invalid range on F-channel access | Reading an F-I/O channel outside its declared value range (e.g., raw value > 27648 on a 6ES7 analog F-module) | "F-I/O access error" |
| Division by zero | F-runtime DIV instruction with divisor = 0 | "Division by zero in safety program" |
| Invalid F-DB signature | Online modification without F-signature regeneration | "F-signature mismatch" |
| Passivation timeout | F-I/O module removed or failed during passivation window | "F-module passivation failed" |
| Time-out of F-monitoring | F-runtime group watchdog exceeded (default 100 ms for S7-1500F) | "F-monitoring time expired" |
This article focuses on the first row: arithmetic overflow of a safety-related variable, which is the most common cause reported by users who observe the F-CPU entering STOP without an obvious hardware fault.
Why a Simple +1 Loop Will Not Trigger 16#75D1
Engineers frequently attempt to provoke the overflow deliberately by incrementing a safety-tag until it wraps. They observe that the value rolls over from +32767 to -32768 (for INT) or from +2147483647 to -2147483647 (for DINT) without raising any diagnostic event. This behaviour is by design, not a bug.
The F-runtime compiler emits a ADD_I or ADD_DI instruction that performs modular arithmetic in hardware. The CPU's ALU does not flag a status bit for signed wraparound because the result is mathematically well-defined in two's-complement representation. The result is wrong from a process-safety perspective (the tag no longer represents a meaningful count), but the instruction itself completed successfully and therefore does not raise 16#75D1.
The F-runtime's overflow detection operates at a different level. The error is raised when:
- The F-runtime invokes the F-block integrity check after the F-cycle.
- The integrity check compares the declared value range of an F-tag (set in the F-tag DB or declared at the F-FB interface) against the actual value produced by the F-block.
- If the actual value falls outside the declared range AND the tag has been marked with the "Range check" attribute in the F-block properties, the F-runtime raises
16#75D1and forces the F-CPU into STOP.
Incrementing a tag with Range check = disabled (the default for performance reasons) will not raise the error even when the value wraps. This is why bench testing often fails to reproduce the field failure.
Conditions That Genuinely Trigger the Overflow Path
To raise 16#75D1 through overflow, the F-tag must be configured with an active range check. The following table summarizes the configuration paths in TIA Portal V17 and later:
| F-Block Property | Default | Required Value to Trigger 16#75D1 |
|---|---|---|
| F-tag range check (F-DB attribute) | Disabled | Enabled |
| F-tag declared range (lower bound) | -32768 | 0 (or any positive lower bound) |
| F-tag declared range (upper bound) | +32767 | 30000 (must be < INT_MAX) |
| F-runtime version | V2.x (S7-1500F) | Any; integrity check present from V1.0 |
| STEP 7 Safety version | V17 | V16 or later for full overflow detection on S7-1500F |
Reproducible Test Procedure in TIA Portal
- Create a new F-Function Block (F-FB) inside the safety program.
- Declare an F-tag of type
INTnamediTestCount. - Open the F-tag properties and enable "Range check". Set lower bound to
0and upper bound to30000. - In the F-FB body, add a network with:
iTestCount := iTestCount + 1; - Assign the F-tag to a non-safety retention DB only if the test is run on a real PLC. For simulation, use PLCSIM V17+.
- Download the safety program. The TIA Portal prompts for an F-signature regeneration; confirm.
- In the safety administration editor, set the F-monitoring time to its maximum (5000 ms) to avoid a parallel watchdog STOP.
- Force the tag to
29999from the watch table. - Single-step the F-runtime group. The next
+1instruction raises16#75D1and the F-CPU transitions to STOP within one F-cycle (typically < 10 ms on an S7-1516F).
The same procedure is described implicitly in the diagnostic flow of Siemens Support Entry 109783988: the entry requires the engineer to verify that the offending F-tag has a non-default range configuration before treating the error as a real overflow.
Diagnostic Workflow After a STOP Event
When a fielded F-CPU enters STOP with 16#75D1, follow the decision tree below. This sequence aligns with the official Siemens recovery procedure documented for both S7-1500F and S7-300F / S7-400F.
- Read the diagnostic buffer. Open TIA Portal → Online → Diagnostics → Diagnostic buffer. Note the timestamp, the F-block instance that raised the event, and any passivation events from F-I/O modules.
- Identify the F-runtime group. The diagnostic buffer entry lists the F-runtime group number (1, 2, or 3) and the F-FB name. S7-1500F supports up to three independent F-runtime groups.
- Cross-check F-tag ranges. Open the F-FB or F-DB identified in step 2 and inspect every F-tag with the range-check attribute enabled. The most likely candidate is a counter, accumulator, or position-integral value.
-
Review the online/offline difference. If the safety program was modified since the last safety acceptance, the F-signature mismatch itself can raise
16#75D1. TIA Portal will display a yellow warning triangle on the safety program node. - Check F-I/O substitution values. If the offending tag is sourced from an F-I/O channel that has been passivated, the substitution value (default 0) may push the running sum of an F-block accumulator out of range on the next cycle.
- Capture the safety log. The S7-1500F maintains a non-volatile safety log (up to 512 entries) accessible via the web server or TIA Portal → Safety Administration → Logs. Export the log before any restart attempt.
Restart Procedure Once the Root Cause Is Known
Restarting an F-CPU that has stopped on 16#75D1 requires a deliberate operator sequence. The firmware refuses to return to RUN automatically.
| Step | Operator Action | Result |
|---|---|---|
| 1 | Turn the mode selector to STOP (or issue "CPU → Stop" from TIA Portal) | F-CPU remains in STOP, diagnostic buffer preserved |
| 2 | Correct the F-tag range or F-block logic | Offline change saved to project |
| 3 | Compile and download the safety program | F-signature is regenerated; TIA Portal forces re-acceptance |
| 4 | Execute the safety acceptance test | Signed test record archived in the safety log |
| 5 | Turn the mode selector to RUN | F-CPU enters RUN only if all F-runtime groups pass their initial integrity check |
Firmware-Specific Behaviour
The behaviour of 16#75D1 varies slightly across firmware versions. The table below summarises documented changes:
| CPU Family | Firmware Version | Behaviour |
|---|---|---|
| S7-1518F-4 PN/DP | V2.9.x | Original behaviour; range check optional |
| S7-1516F-3 PN/DP | V2.9.7 and later | Improved diagnostic buffer entries; F-runtime group ID is logged |
| S7-1515F-2 PN | V3.0.x | Added F-tag range-check default = Enabled for new projects (opt-out available) |
| S7-1504F (compact) | V2.6.x | Single F-runtime group; identical error semantics |
| S7-300F (CPU 317F-2) | V3.x (STEP 7 V5.x) | Same code; range check configured via S7F configuration tool per Support Entry 16770414 |
| S7-400F (CPU 416F-3) | V6.x | Same code; range check via CFC/SFC and S7F |
Comparison: Real Overflow vs. False Positive on S7-300/400F
Engineers migrating a safety program from S7-300F or S7-400F (STEP 7 V5.x) to S7-1500F (TIA Portal) sometimes report 16#75D1 for the first time. The discrepancy usually has one of two causes:
| Aspect | STEP 7 V5.x (S7-300F / S7-400F) | TIA Portal (S7-1500F) |
|---|---|---|
| F-runtime compiler | S7F / Distributed Safety V6.x | STEP 7 Safety integrated |
| Default range check on F-tags | Disabled | Disabled (V17), Enabled (V18+, new projects) |
| Overflow detection in pure ADD instruction | No (only on tagged range check) | No (only on tagged range check) |
| Overflow on DINT->REAL cast | Raises OF flag in STATUS word; user must wire a check | Same; S7-1500F does not auto-raise 16#75D1 on cast overflow |
| F-monitoring default | 100 ms | 100 ms (configurable 1-5000 ms) |
The crucial insight is that the legacy controllers also do not raise 16#75D1 on bare modular wraparound. A migrated program with the same arithmetic will exhibit the same lack of detection unless the F-tag range check is explicitly enabled in TIA Portal.
Prevention Best Practices
- Enable range check on every F-tag that is an accumulator or integrator. Counters, position integrals, and runtime-hours tags are the three most common offenders.
-
Clamp the F-tag upper bound below the INT/DINT maximum. Setting the upper bound to 32000 for a count that realistically never exceeds 10000 gives a 220% safety margin before
16#75D1is raised. -
Use F-validated wrap-around logic. If the process genuinely requires a counter that rolls over (e.g., cycle counter), implement the wrap with a conditional reset:
IF iCount >= 32000 THEN iCount := 0; END_IF;Place the reset logic in the same F-FB so it is part of the F-signature. - Avoid implicit type promotion. Adding a DINT constant to an INT F-tag in TIA Portal promotes the operation to DINT, which silently widens the F-tag. Ensure the F-tag type matches the operation.
- Document the F-tag ranges in the safety requirement specification (SRS). The SRS must list every F-tag's declared range; the F-block implementation must match.
- Use PLCSIM Advanced for FAT coverage. Force the F-tag to within 1 count of its upper bound and verify the STOP behaviour. This step is mandatory for SIL 3 systems per IEC 61508-3.
Verification Checklist After Restart
Use this checklist to confirm that the F-CPU has returned to a valid safe state:
| Check | Method | Pass Criterion |
|---|---|---|
| F-CPU operating mode | TIA Portal Online → CPU operator panel | RUN, green |
| F-runtime group status | Safety Administration → F-Runtime Groups | All groups show "OK" |
| Passivated F-modules | Diagnostics → F-I/O | None passivated |
| F-tag live values | Watch table | All F-tags within declared range |
| Diagnostic buffer | Online → Diagnostics → Diagnostic buffer | No pending 16#75D1 event |
| Safety log | Web server → Safety log | Acceptance test entry recorded with timestamp and signature |
| F-signature | Safety Administration → F-Signature | Matches the value recorded in the safety acceptance report |
Related Diagnostic Background
Although the support entries focus on 16#75D1, the underlying overflow / underflow detection mechanism is shared with other TIA Portal diagnostics. For example, the ET 200SP analog input module AI Energy Meter CT ST (6ES7134-6PA01-0BU0) exposes an overflow / underflow diagnostic alarm on the voltage channel, configured via the "Tolerance factor overvoltage/undervoltage" parameter. The TIA Portal manual collection describes the tolerance-band logic in TIA Portal documentation for the ET 200SP AI Energy Meter. While the module's diagnostic is hardware-level rather than F-runtime-level, the same pattern of declaring an expected range and triggering an alarm on violation applies.
Troubleshooting Matrix
| Symptom | Most Likely Cause | Fix |
|---|---|---|
| STOP immediately after F-program download | F-signature mismatch | Re-accept safety program; verify F-signature in watch table |
| STOP after several hours of operation | F-tag range exceeded by runtime accumulation | Enable range check, clamp upper bound, add conditional reset |
| STOP after F-I/O module replacement | Passivation timeout on substitute value | Check F-I/O substitution value; verify channel range |
| STOP with 16#75D1 but no range-checked F-tag in the project | F-runtime group watchdog exceeded | Increase F-monitoring time; profile F-runtime group with trace |
| STOP with 16#75D1 immediately after power-up | Non-volatile F-tag loaded with out-of-range value | Inspect retentive F-tags; clear with initial value download |
| STOP with 16#75D1 only on S7-1500F, not on PLCSIM | PLCSIM does not emulate the F-runtime integrity check fully | Test on physical hardware for final qualification |
What does error 16#75D1 mean on a Siemens S7-1500 F-CPU?
It is a STOP-class diagnostic indicating that the F-runtime detected a safety-critical violation inside the safety program, such as an F-tag leaving its declared range, a division by zero, or an F-signature mismatch. The CPU cannot resume RUN until the operator clears the fault and re-accepts the safety program per Siemens Support Entry 109783988.
Why does my INT tag wrap from +32767 to -32768 without triggering 16#75D1?
The F-runtime only raises the error when the F-tag has the range-check attribute enabled and the resulting value falls outside the declared lower or upper bound. The default configuration disables the range check for performance, so a bare iTag := iTag + 1; statement performs modular two's-complement arithmetic without raising any diagnostic event.
How do I deliberately provoke a 16#75D1 overflow for testing?
Create an F-tag with type INT, enable its range-check attribute, set the upper bound to 30000, and force the value to 29999. The next cycle of the F-runtime group will raise 16#75D1 and STOP the F-CPU. Run this test on a physical S7-1500F, since PLCSIM does not emulate the full F-runtime integrity check.
Does the same error code apply to S7-300F and S7-400F?
Yes. 16#75D1 is raised on legacy controllers with identical semantics, as documented in Siemens Support Entry 16770414. The diagnostic buffer format and the F-signature regeneration steps differ from TIA Portal, but the STOP cause is the same.
Do I need to re-run the safety acceptance test after clearing 16#75D1?
Yes. Any modification to the F-block that addresses the overflow - including enabling the range-check attribute or adding a conditional reset - changes the F-signature and requires a complete safety acceptance test per EN ISO 13849-1 and IEC 61508. The acceptance record must be archived in the safety log before the F-CPU returns to RUN.