Hallo zusammen,Nachtrag: hat geschrieben: Das Phänomen ist nun abschließend geklärt.
Siehe dazu Beitrag Nr. 7.
ich habe hier so etwas wie einen Betriebsstundenzähler für mein Steuerungs-Programm programmiert, der als schönes Programmierbeispiel dienen könnte, wenn er denn richtig funktionieren würde. Das System bringt mich aber schier zur Verzweiflung, weil die Zeit hier anscheinend kurzzeitig mal rückwärts läuft. Hat vielleicht jemand eine Ahnung, wieso das so ist?
Code: Alles auswählen
***********************************************************************************************
** Objekt BetriebsZeit: [Zeichen]
** Variablen:
** Name Typ Startwert
** letzterStart [Zeit] DATUM+UHRZEIT
** Laufzeit [Zeit]
** gesamt [Zeit]
** jetzt [Zeit] [00:00:00]
** u [Uhr ]
** i [Zahl]
** r [Zahl] 0,00
** VZ [Zeichen]
**
** Erstaunlicherweise kann man als Startwert von Variablen auch Funktionen verwenden, was in
** der Hilfe nirgends dokumentiert ist! Funktioniert aber anscheinend, wie man via Ablauf-
** verfolgung nachprüfen kann: "letzterStart" enthält tatsächlich die Startzeit des Programms.
** Oder auch die Zeit 8 Sekunden vor dem Start? Siehe "Debug"-Anweisungen im Code!
** Uneklärliche Phänomene!
**
** BetriebsZeit.gesamt ist quasi der Betriebsstundenzähler dieses Programms und muss als
** persistenter Wert in *END gespeichert und in *INIT geladen werden.
**
** BetriebsZeit kann dann auch während des späteren Programmablaufs aufgerufen werden,
** um den visuellen Teil des Objekts zu aktualisieren.
**
** Da keine Objekte vom Typ [Zeit] bzw. [Uhr] vereinbart werden können, benötigt man - wie so
** häufig in diesem "System" - ein Würg-around, wenn man die "Betriebsstunden" in einer
** Visualisierungsansicht sichtbar machen will: Die Makro-interne Betriebszeit "gesamt" wird
** in den sichtbaren [Zeichen]-Teil des Objekts gespiegelt, wobei diese Zeit aus der
** ganzzahligen Komponente (Tage) und den Stunden im üblichen Zeitformat zusammengebaut werden
** muss, da es für Zeitdifferenzen >= 24 Stunden keine brauchbare Standard-Ausgabemethode gibt.
**
** *INIT muss
** BetriebsZeit.gesamt laden und dann
** BetriebsZeit aufrufen!
**
** *END muss ebenfalls
** BetriebsZeit aufrufen und dann
** BetriebsZeit.gesamt speichern!
***********************************************************************************************
jetzt:= DATUM + UHRZEIT
******* Debug ****************
wenn jetzt < letzterStart dann
Ticker:= "Fehler: 'jetzt' liegt zeitlich vor 'letzterStart'<<" +
letzterStart + " letzterStart" + "<<" +
jetzt + " jetzt " + "<<" + Ticker
******** einmalig ca. 8 Sekunden beim Programmstart!
endewenn
******* Debug ****************
** Falls man erlauben will, dass die Betriebszeit zurückgesetzt werden kann:
****************************************************************************
wenn BetriebsZeit = "*" dann
gesamt := 0
letzterStart:= jetzt
endewenn
****************************************************************************
Laufzeit := jetzt - letzterStart
gesamt := gesamt + Laufzeit
letzterStart:= jetzt
******* Debug only *************
Ticker:= Laufzeit + " Laufzeit" + "<<" +
gesamt + " gesamt" + "<<" + Ticker
******* Debug only *************
************************************************************************
** allgem. Lösung für formatierte Ausgabe einer Zeitdifferenz (auch < 0)
************************************************************************
r:= gesamt
wenn r < 0 dann
VZ:= "-"
**** r := -r <-- Bug, geht net!
r := 0-r
sonst
VZ:= "+"
endewenn
u:= gesamt
i:= r - 0,5
Betriebszeit:= VZ + i + " Tage " + u
Ich hoffe, dass man dieses Objekt mit einem Würg-around doch noch retten kann und mir hier keine prinzipiellen Denkfehler unterlaufen sind.
Mit der vordefinierten Variablen CT könnte man das Programm vielleicht noch etwas vereinfachen:
Mir ist aber noch nicht klar, bei welchen Ereignissen CT geändert wird (Zuweisung an BetriebsZeit?) und ob CT nur die Uhrzeit liefert oder auch das Datum, weil STOPPZEIT(CT) laut Hilfe ja nur eine Zeit zwischen 00:00:00 und 23:59:59 liefert. Vielleicht kann mich/uns da mal jemand aufklären! Bzw. der Hersteller die Hilfe diesbezüglich mal überarbeiten!Hilfe.Variablen.CT hat geschrieben:Es gibt eine vordefinierte Variable des Typs Uhrzeit für jedes Objekt. Der Name der Variablen ist CT (für ChangeTime). In dieser Variablen wird die jeweils letzte Änderungszeit eines Objekts gespeichert. Mit der Funktion STOPPZEIT(Objektname.CT) kann ermittelt werden wie lange ein Objekt sich in seinem aktuellen Zustand befindet.
Hilfe.STOPPZEIT hat geschrieben:STOPPZEIT(Zeitvariable)
Diese Funktion gibt die Zeitdauerdifferenz zwischen der aktuellen Uhrzeit und der in der Zeitvariablen hinterlegten Zeit zurück. Es wird die reine Uhrzeitdifferenz ermittelt, Tage werden nicht berücksichtigt, d.h. als Ergebnis kann es keinen Wert grösser als 23:59:59 geben.