Vergangene Sekunden ab Zeit X berechnen in SCL

ssyn

Level-2
Beiträge
230
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine Frage. Will die Sekunden ab bestimmte Ereignis berechnen und danach bestimmte Prozedur starten.
Ich versuchte es mit TON und TOF machen, aber konnte nicht da die Lösung finden, wenn die PV nicht bekannt ist.

Dann finde die Lösung - einfach die Intervall vom Task benutzen. Z.B. Intervall ist t#20ms, dann geht es mit folgende Code

Code:
IF maschine2.OnOff AND testing < 1000 THEN
    testing:= testing + 1;  
ELSE
    maschine1.OnOff:=TRUE;  
END_IF

Sobald ist die "Maschine2" ist TRUE, dann nach 20 Sekunden startet "Maschine1".

Aber weiß nicht ob es ist gute Code, weil in Zukunft das Intervall geändert werden könnte. Gibt es die Alternative ohne Intervall solche Aufgabe zu lösen?

P.S. Die Aufgabe ist NICHT einfach nach 20 Sekunden etwas machen, sondern die Anzahl von Sekunden ab Ereignis berechnen.
 
Zuletzt bearbeitet:
Ich versuchte es mit TON und TOF machen, aber konnte nicht da die Lösung finden, wenn die PV nicht bekannt ist.
Was meinst Du mit "PV nicht bekannt"?
Auf welchem System programmierst Du?
Die Intervall-Lösung ist nicht schön, da sich durch Unterbrechungen ggf. die Zyklen verlängern können - je nach dem, wei genau Du die Zeit haben mußt. - Neben dem bereits von Dir genannten Grund.
Außerdem ist der Code nicht offensichtlich zu verstehen, man muß erst die Zusatzinformation "Zykluszeit" einholen.

Am besten ist, ein TON zu verwenden. Aber damit hast Du ja irgendein Problem... welches?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Am besten ist, ein TON zu verwenden. Aber damit hast Du ja irgendein Problem... welches?

Sorry, ich hab falsch es erklärt. Ich will genau die Anzahl von Sekunden ab Ereignis X berechnen. Danach benutze sie weiter. So, Stoppuhr für Sekunden und ich weiß nicht, wann muss sie gestoppt werden, das hängt von andere Variables ab.
 
Dein Code-Beispiel sagt aber was Anderes: Du schaltest Maschine1 erst X Sekunden nach Maschine2 ein. Das ist ein TON.

Wenn Du nur Zeit messen willst: Systemzeit auslesen, wegspeichern und bei Ereignis 2 dann die Systemzeit erneut auslesen, voneinander abziehen und Du hast mit der Differenz die vergangene Zeit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Problemstellung korrekt und verständlich formulieren ist meistens schon die halbe Lösung.

Man könnte in einer zyklischen Task (z.B. OB35 alle 100 ms) einen endlos-Zähler (DINT) programmieren, und im "normalen" Programm beim Ereignis den Zählerstand lokal speichern. Dann ist die seit dem Ereignis vergangene Zeit die Differenz zwischen Zählerstand jetzt und gemerktem Zählerstand. (Man könnte auch vorwärts in die Zukunft rechnen.)

Um wieviele Sekunden maximal geht es? Wie genau / mit welcher Auflösung muß die Zeit abgemessen werden?

Harald
 
Jetzt nur lerne SCL, prüfe Code in Simulation in Codesys V3.5.

Name: CODESYS Control Win V3
Hersteller: 3S - Smart Software Solutions GmbH
Kategorien: Steuerungen (SPS)
Typ: 4096

P.S. DeltaMikeAir, eigentlich in Code gibts nix, habe nur ein Struct und Enum erstellt.

Code:
timee:= TIME();

WERT: T#5h56m30s310ms (noch läuft weiter).
 
Zuletzt bearbeitet:
Versuchte es zu machen gleich, kriege seltsame Zeit - T#5h6m13s177ms
time() zeigt die Zeit ab Steuerungstart an (in ms). Wenn Du bei Steuerung Strom nimmst und wieder gibst dann startet Zeit neu bei 0ms. Ist in der Hilfe leider verzwickt den Befehl zu finden da es einen gleichnamigen Datentyp gibt.
einmal den Startzeipunkt deiner Messung erfassen. dann während die Messung aktiv ist den aktuellen Zeitwert damit offsettieren = Messzeit.
eventuell das Resultat wandeln => time_to_dint(resultat) /1000 damit es in Sekunden ist.
 
Zuletzt bearbeitet:
idtell, danke für tipp, ich fand gerade schon selbst die Konventierung TIME_TO_LREAL gefunden und hatte gedacht, ob es für mich eine Lösung wäre.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
IF maschine2.OnOff AND testing < 1000 THEN
    testing:= testing + 1;
ELSE
    maschine1.OnOff:=TRUE;
END_IF
Statt ...
Code:
    testing := testing + 1 ;
... wäre es "lesbarer" ...
Code:
    testing := testing + 20 ; // ZyklusZeit 20 ms addieren
... zu schreiben.
Und ja, natürlich kann man in ...
Code:
IF maschine2.OnOff AND testing < 1000 THEN
// oder 
IF maschine2.OnOff AND testing < 20 * 1000 THEN
... statt mit einer Konstatnen '1000' oder '20 * 1000' mit einer Variablen vergleichen.
Z.B.:
Code:
IF maschine2.OnOff AND testing < anzahlSekunden * 1000 THEN

idtell, danke für tipp, ich fand gerade schon selbst die Konventierung TIME_TO_LREAL gefunden und hatte gedacht, ob es für mich eine Lösung wäre.
Warum per 'TIME_TO_LREAL' in LREAL konvertieren? Dann müsstest aber beide zu vergleichenden Werte in LREAL konvertieren --> unnötiger, überflüssiger, irreführender Umweg!
'TIME_TO_DINT' sollte es auch geben (aber eigentlich hier unnötig sein?).
 
Heinileini, als ich verstehe,

Code:
time1:= TIME_TO_DINT (TIME());
//Ereignis 1
time2:= TIME_TO_DINT (TIME());
//Ereignis 2
sekunden:= time2-time1;


bringt mir anzahl von Sekunden zwischen time2 und time1 ?
 
Zurück
Oben