Wie du das abfangen kannst weiß ich nicht. Das ist auch nur eine Vermutung von mir.
Was auf jeden Fall problematisch in der Funktion STIME sein kann, ist, wenn die SPS neu gestartet wird.
Denn dann fängt TIME_TCK() wieder bei 0 an. STIME erkennt den Neustart und setzt den Vergleichszähler "last_time" auf 0.
Das Vorzeichenbit das in STIME manuell in tx "eingebaut" wird bleibt auf dem alten Zustand bestehen, stört aber auch nicht weiter.
Was aber jetzt in Bezug auf ACTUATOR_PUMP stört ist, dass sich dieser Baustein den letzten Zeitpunkt des Ein- oder Ausschalten des Antriebes merkt.
Mal angenommen seit die funktion run_every, also dass die Pumpe auch wenn nicht angefordert für eine bestimmte Zeit eingeschaltet wird.
Angenommen last_change steht auf der Zeit T#23D und es ist gerade der run_every-Zyklus aktiv, und ich mache einen SPS-Neustart. Dann wird tx auf T#0 (oder auf max. negativ je nach bit31 aus STIME) gesetzt. Ergebnis ist dass der Antrieb 23 Tage durchlaufen würde obwohl nicht angefordert, wegen:
tx - last_change >= run_every
eingesetzte Beispielwerte:
T#0S - T#23D >= T#10000M
Die Bedingung wäre also sehr lange gültig.
Ich kann mir vorstellen dass das auch noch für andere Bedingungen Auswirkungen haben könnte, z.B. bei der min.-Ausschaltzeit.
Hast du deine SPS in der Zeit mal neu gestartet? Wenn nicht dann wüsste ich auch nicht woran es liegen könnte.