Lösung mit der S7
Wenn du mit einer S7 arbeitest gibt es hierführ eine erheblich bessere möglichkeit.
In HW-Config aktiviert du für deine CPU das Taktmerkerbyte.
Das Taktmerkerbyte liefert Impulsfolgen von Frequenz
(Hz):0,5; 0,625; 1; 1,25; 2; 2,5; 5; 10 für die Bit's 7..0
des von dir angegebenen Bytes.
Hast du z.B. das MB50 als Taktmerkerbyte "verbraten" dann
erzeugst du hiermit so 8-verschiedene Trigger:
L MB50 // Taktmerker laden
L MB52 // Taktmerker bei letztem OB1 durchlauf
XOW // --> Triggerflags erzeugen
T MB51 // ... sichern der Flags für spätere Zeitmessungen
L MB50 // derzeitige Taktmerker für nächsten OB1 sichern
T MB52 // ...
Da ich hierbei immer ein xor verwende bekommst du bei jedem
Flankenwechsel eines Taktmerkerbit's eine "1" im zugeortneten Triggerbit.
Beispiel: dein SPS-Programm hat eine Zykluszeit von 10ms dann liefer M51.7 in jedem 5-OB1 Zyklus eine "1" sonst immer eine NULL
eine Zeitfunktion realisierst du jetzt so:
UN M51.7 // Trigger nicht gesetzt, Zeit noch nicht abgelaufen
ON #EnableUsertimer_0 // dein Timer soll nicht laufen
SPB nTrg // ...
L MB99 // Deine Zeitvarible hier ein Byte als geht das von
L 1 // (1..256)*50ms also Zeiten bis 12,8sec
-I
spm nTrg // Zeit war schon NULL, kein update
T MB99 // Zeit übernehmen
spp nTrg // noch kein Timeout
S #Timeout_0 // dein Timer_0 ist abgelaufen
//__________Timerbearbeitung ende______________________
nTrg: ... // da geht es mit deiner Anwendung weiter.
Wenn du länger Zeiten benötigst kannst du eine anderes Triggerflag
verwenden z.B. 51.0 für 1sec Auflösung oder statt mit 16-Bit oder 32-Bit
Variablen arbeiten.
:lol:
Die Zeit läuft jetzt so lange wie du dein Freigabe gesetzt läst.
Wenn du mehr Auflösung benötigst kannst du den SFC64 benutzen um die Systemzeit in 10ms oder 1ms der CPU auszulesen.
Viel Erfolg,
U.Klakow