Zeitvariablen: Eigenheiten & Anzeige von Zeitdifferenzen

Programmierung der FHZ-Zentralen mit contronics homeputer Standard / homeputer Studio & WEB-Server

Moderator: Co-Administratoren

Antworten
SpiRu
Beiträge: 74
Registriert: 18.09.2012, 23:05
Wohnort: Deutschland.Freiburg

Zeitvariablen: Eigenheiten & Anzeige von Zeitdifferenzen

Beitrag von SpiRu » 08.10.2012, 00:06

Code: Alles auswählen

***********************************************************************************************
** Objekt BetriebsZeit: [Zeichen]
**   Variablen:
**   Name           Typ             Startwert
**   letzterStart  [Zeit]           ZEIT
**   aktuelle      [Zeit]
**   gesamt        [Zeit]           0:0:0,00000000000001 wenn noch nicht persistent angelegt
**   jetzt         [Zeit]
**   u             [Uhr ]
**   i             [Zahl](Integer)  0
**   r             [Zahl](Real)     0,000000000000000000
**   VZ            [Zeichen]        +
**   PIN           [Zeichen]        ****
**
** "BetriebsZeit.gesamt"
** ist quasi der Betriebsstundenzähler dieses Programms und wird als persistenter Wert gehalten.
**
** *INIT muss
**     BetriebsZeit.gesamt laden und dann
**     BetriebsZeit aufrufen!
**
** *END muss ebenfalls
**     BetriebsZeit aufrufen und dann
**     BetriebsZeit.gesamt speichern!
**
Durch Ausführung dieses Makros kann auch sonst jederzeit ein Schnappschuss gemacht werden, um den visuellen Teil des Objekts zu aktualisieren. Der Zähler läuft dabei stets weiter.

Code: Alles auswählen

** Falls man erlauben will, dass die Betriebszeit zurückgesetzt werden kann:
****************************************************************************
wenn BetriebsZeit = PIN dann
     gesamt      := 0
     letzterStart:= ZEIT
endewenn
****************************************************************************

   jetzt        := ZEIT
** aktuelle     := jetzt  - letzterStart
** gesamt       := gesamt + aktuelle
   gesamt       := gesamt + (jetzt  - letzterStart)
   letzterStart := jetzt

************************************************************************
** allgem. Lösung für formatierte Ausgabe einer Zeitdifferenz (auch < 0)
************************************************************************
r:=  gesamt
wenn r < 0 dann
**** r :=  -r      <-- Bug, geht net!
     r := 0-r
     VZ:= "-"
sonst
     VZ:= ""
endewenn
u:=  r
i:=  r - 0,5
Betriebszeit:= VZ + i + " Tage " + u
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 visualisierten [Zeichen]-Teil des Objekts geschrieben. 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 Format-Schablone wie "JJJJ-MM-TT HH.mm:ss" für [Zeit], "JJJJ-MM-TT" für [Datum] und "HH.mm.ss" für [Uhr] gibt bzw. keinen Zeit-Typ [Dauer] oder [Zeitraum], dem eine Schablone wie etwa "±t Tage HH:mm.ss" zugeordnet wäre.

Aufgrund eines "sehr originellen" undokumentierten System-Features kann man Zeitvariable nicht mit exakt 0 vorbelegen! In dem Fall, oder bei Eingabe von ungültigen Werten, werden die Variablen mit der Startzeit des Systems initialisiert!!! Zur Verdeutlichung, wenn dies vom Programm auch erwartet wird, kann man dann z.B. ZEIT (oder INSANE oder BRAINDAMAGED) als Startwert eintragen, was - sinnigerweise ohne jeglichen Compilerkommentar - als ungültiger Startwert betrachtet wird. Dadurch wird die Variable aber dann irrerweise tatsächlich mit ZEIT initialisiert.

Da Zeit-Variablen eigentlich "type-gecastete" Real-Variablen sind, (bei denen 1 Tag dem Wert 1,0 entspricht,) kann mann diese auch mit Sekunden-Bruchteilen initialisieren. Z.B. 0:0:0,00000000000001. Das sind 10 Femto-Sekunden! Noch mehr Nullen hinter dem Komma sind wegen der Begrenzung auf 20 Zeichen an dieser Stelle nicht möglich. Ansonsten wären noch ETLICHE Zehnerpotenzen weniger möglich, da Real-Variablen im PC-üblichen Format einen Wertebereich von rund 1*10^±300 haben. Mit der Exponentialschreibweise von Real-Konstanten kommt der Compiler allerdings eh nicht klar.

Irrtümlich hatte ich statt des Funktionsaufrufs ZEIT Anfangs (DATUM+UHRZEIT) verwendet. Dadurch ergab sich beim erstmaligen Aufruf des Makros der kuriose Effekt, dass die aktuelle Laufzeit als (DATUM+UHRZEIT)-ZEIT immer knapp 24 Stunden ergab - und eben nicht 0, wie ursprünglich angenommen.

Grund1: UHRZEIT liefert die Zeit auf glatte, ohne Rest durch 5 teilbare Sekunden, während ZEIT die aktuelle Zeit auf Sekundenbruchteile genau liefert, so dass sich immer eine Differenz bis zu 5 Sekunden ergibt.

Grund2: Ein weiteres undokumentiertes Kuriosum ist, dass man bei der Subtraktion von Zeitwerten keine negativen Werte erhält, sondern immer nur Modulo 24 Stunden! -3 Sekunden werden dabei zu "23:59:57"! Die Addition und Subtraktion von Zeitwerten verhält sich also nicht symmetrisch, allerdings erst, wenn das Ergebnis negativ würde. Das ist nicht gerade das, was ein "normaler" Mensch erwartet, zumal wenn dieses "Feature" auch noch undokumentiert ist. Wenn man dieses "Feature" abschalten will, muss man Zeitwerte als Real-Werte verarbeiten. Da gelten die normalen Additions- und Subtraktionsregeln und nur damit kann man auch negative Zeitwerte erhalten.
Anders ausgedrückt, hat man hier also zwei unterschiedliche "-" Operatoren für Zahlen und Zeit-Operanden, während sich der "+" Operator bei beiden Operanden-Typen gleich verhält. Egal ob ich die Operanden als Real- oder Zeit-Werte addiere. Da in diesem "System" aber auch gemischte Operanden zulässig sind, wie "Zeitvariable:= Zeitvariable-1,0", lässt sich kaum voraussagen, welchen "-" Operator der Compiler wohl verwenden wird oder ob er (kommentarlos!) überhaupt keinen Code erzeugt, was oft genug vorkommt! :roll:

Da UHRZEIT auf glatte 5 Sekunden abgerundet ist, müsste

Code: Alles auswählen

ZEIT - (DATUM+UHRZEIT)  zwischen  "00:00:00" und "00:00:05"
(DATUM+UHRZEIT) - ZEIT  zwischen  "23:59:55" und "23:59:59,999..."
liegen.
FHZ 1000 PC, Homeputer Studio V2.0 Rel. 120301
FHT80b-Raumregler, Windows XP (SP3)

Bugs? - Das sind keine Bugs! Das sind Features!

Antworten

Zurück zu „homeputer Studio / Standard: Programmierbeispiele“