Step 7 S5TIME Vergleich mit 8192

wolfgang_m

Level-2
Beiträge
20
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Forum,
Ich habe wieder mal Kontakt mit einer alten Anlage. S7-300 CPU314 IFM (6ES7 314-5AE03-0AB0). Das Projekt darauf ist aus dem Jahr 2000.

Ich habe das Programm auf dieser Anlage schon mal rückgelesen und mit dem Originalstand von damals gemerged, sodass aktuell wieder eine Version verfügbar ist, die die Kommentare und Symbole enthält und auch die minimalen Änderungen, die im Lauf der Jahre von verschiedenen Leuten/Firmen gemacht wurden. Beim Erstellen der Merge-Version habe ich auch diverse einzelne POUs runtergeladen. Einige wenige FCs und auch DBs wegen Angleichung der Aktualwerte.

Kann es sein, dass durch den Download (Altstand: mit älterer SimaticManager-Version/Compiler aus Jahr 2000; Neustand mit SimaticManager 5.7) folgende Vergleiche von S5TIME-Variablen mit fixen Integerwerten nicht mehr wie gewünscht funktionieren?
DBW4 ist eine S5TIME-Variable.
Aktuell ist DB4 auf 1s eingestellt und ergibt einen Integerwert von 256. Damit ist der Vergleich immer FALSE und mein UND_glied danach immer FALSE.


Screenshot 2025-10-10 110306.png
 
Die Frage wäre, welche Zeitbasis. Wenn hier größer 8192 abgefragt wird, wird offensichtlich eine Zeitbasis von einer Sekunde erwartet, wenn du 256 siehst, ist demnach eine Zeitbasis von 10ms (Standard) angewählt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was siehst du das nicht funktioniert ?

Aktuell ist DB4 auf 1s eingestellt und ergibt einen Integerwert von 256
DB4 ist ein Datenbaustein, nicht ein Wort in ein Datenbaustein.

In das Screenshot sieht man nur "DBW4".
DBW4 ist Datenwort 4 in den aktuell offene DB.
Wenn irgendwo in die Code vor diesen Netzwerk ein DB adressiert ist, egal welchen Befehl, egal welchen DB, dann ist diese DB die aktuell offene DB.
Ist mMn. einfach schlechten Programmierstil.
Besser wäre das man eksplicit den ganzen Variabeladdresse spezifiziert, z.B. "DB1.DBW4".
 
Und wo ist jetzt das Problem? 256 ist nun mal kleiner als 8192...

Was soll denn in DW4 stehen?

8192 ist Hex 2000 Sieht verdächtig nach der Zeitbasis aus und nicht nach dem eigendlichen Zeitwert.

Geh mal auf die Suche wo der Zeitwert herkommt und wo die Zeitbasis generiert wird. Der Quatsch war BCD.
 
Die Vermutung ist:

Mein DB12.DBW4 ist eben definitiv vom Datentyp S5TIME. Der Wert ist fix im Datenbaustein vorgegeben. Man könnte den voreingestellten Wert von 1s bei Bedarf im Datenbaustein ändern.

Im Programm, das anno 2000 in die Maschine eingespielt wurde, hat der Vergleich mit 8192 funktioniert. D.h wenn 1s eingestellt war, gab das Programm für den Vergleich TRUE aus und die Sachen dahinter liefen alle wie gewünscht.

Prinzipiell muss ich auch noch sagen, DB12.DBW4 wird als Preset für einen Timer-Baustein verwendet. Am Eingang TW eines S_EVERZ-Baustein.

Konkret gibt es 2 Vergleiche.
Einmal DB12.DBW4 > 8192: Das soll vermutlich eine Abfrage sein, ob eine Zeit > 0 eingestellt war. Wenn ja musste die Logik quasi auf den Timer warten und ansonsten ging es direkt weiter.
Und dann noch DB12.DBW4 = 8192: Das sollte vermutlich prüfen, ob 0 als Vorgabezeit eingestellt war. Dann konnte es direkt weitergehen ohne auf den Timer zu warten.

Die eigentliche Vermutung:
Der alte Compiler im Jahr 2000 hat den Datenbaustein so übersetzt, dass als Zeitbasis 1 Sek verwendet wurde und 8192 also dem Wert 0 entsprach.
Ich habe heuer eine Merge-Version für das Programm erstellt und Teile neu übersetzt und runtergespielt. So auch den betreffenden FC und auch den Datenbaustein DB12 mit dem DB12.DBW4. Eventuell übersetzt der neuere Compiler so, dass als Zeitbasis 10ms verwendet wird. Bei einer Zeitbasis von 10ms entspricht 1s dem Integer Wert 256. Aber der Vergleich 256<8192 wäre demnach immer FALSE.

Demnach sollte ich den Vergleich auf den fixen Wert 8192 in geeigneter Weise umbauen, damit das auch mit Zeiten basierend 10ms Zeitbasis funktioniert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einmal DB12.DBW4 > 8192: Das soll vermutlich eine Abfrage sein, ob eine Zeit > 0 eingestellt war.
Das war auch meine Vermutung: der Sinn des Vergleichs ist "Ist überhaupt eine Zeit > 0 eingestellt?"

Aber Achtung - genau hinsehen! Da wird nicht wirklich DB12.DBW4 verglichen, sondern das DBW4 des an der Programmstelle gerade geöffneten DB. Das soll vermutlich der DB12 sein, aber wenn da irgendjemand nach dem "AUF DB 12" und dem Vergleich "DBW4 > 8192" eine Programmänderung gemacht hat und dabei auf einen anderen DB zugreift als den DB12, dann wird mit dem DBW4 dieses DB verglichen - das ist eine ganz andere Variable. Vielleicht ist das auch die Ursache des nicht mehr funktionierenden unsinnigen Vergleichs mit dem Wert 256
Darauf hat auch @JesperMP schon in Beitrag #3 hingewiesen.
 
Zurück
Oben