Rechnen mit Zeiten zum Sonnenstand

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

Moderator: Co-Administratoren

Antworten
herbylfs
Beiträge: 45
Registriert: 07.04.2018, 16:59
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Rechnen mit Zeiten zum Sonnenstand

Beitrag von herbylfs » 09.09.2020, 17:39

Hallo,
ich komme nicht mehr klar.
Kopf vedreht oder Knoten drin.
tageszeiteigene.JPG


Soll angezeigt werden in Homeputer "TageszeitistEigene" in der Visu und als Variable zum Ausführen von Aktionen.
Bewohner im Schichtdienst, Kinder zur Schule.
Gezielt Lichter (FS20 Schaltsteckdosen) und Rollos (Aktoren FS20 MS) Schalten .
Die werden noch mit dem alten Homeputer Programm und der F812 von Contronics über Serielle Schnittstelle gesteuert.
Die Programmierung ist über 20 Jahre her und mit Ü70ig fällt es schwer sich da nochmal reinzudenken, heute findet man kein Notebook oder PC mehr mit Serieller Schnittstelle, damit man da was ändern kann. USB zu Seriell Adapter funktionieren nicht.
Daher soll das jetzt auf Homeputer CL Studio HomeMatic und FHZ umziehen.

Nacht vor SA ist von "00:00:00" bis SA -"01:45:00"
Astron. Dämmerung vor SA ist von SA-"01:45:00" bis SA-"01:00:00" (oder Elevation zwischen -18 und -12)
Naut. Dämmerung vor SA ist von SA-"01:00:00" bis SA-"00:30:00" (oder Elevation zwischen -12 und -6)
Bürgerl. Dämmerung vor SA ist von SA-"00:30:00" bis SA (oder Elevation zwischen -6 und 0)
Morgens ist von SA bis SA+"01:00:00"
Vormittag ist von SA+"01:00:00" bis "11:00:00"
Mittag ist von "11:00:00" bis "14:00:00"
Nachmittag ist von "14:00:00" bis SU-"01:00:00"
Abend ist von SU-"01:00:00" bis SU
Bürgerl. Dämmerung nach SU ist von SU bis SU+"00:30:00" (oder Elevation zwischen 0 und -6)
Naut. Dämmerung nach SU ist von SU+"00:30:00" bis SU+"01:00:00" (oder Elevation zwischen -6 und -12)
Astro. Dämmerung nach SU ist von SU+"01:00:00" bis SU+"01:45:00" (oder Elevation zwischen -12 und -18)
Nacht nach SU ist von SU+"01:45:00" bis "23:59:00"
Hinbekommen als Anzeige bisher nur den Mittag.
tageszeiteigene1 .JPG Bei anderen Zeiten gibts Syntaxfehler. Nach Speichern und gelben Blitz [attachment=0]tageszeiteigene2.JPG
Dateianhänge
tageszeiteigene2.JPG
tageszeiteigene1 .JPG
Wo kämen wir denn hin, wenn alle sagten "Wo kämen wir denn hin" und niemand ginge um zu sehen, wohin wir kämen, wenn wir gingen!?!
Ich hab so Hunger, dass ich vor lauter Durst gar nicht weiß was ich rauchen soll, so müde bin ich!!!
Spezialisten wissen immer mehr über immer weniger, bis Sie alles über nichts wissen.
Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher.

Familienvater
Beiträge: 7111
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 20 Mal

Re: Rechnen mit Zeiten zum Sonnenstand

Beitrag von Familienvater » 10.09.2020, 11:10

Hi,

wie ich Dir schon im anderen Thread versucht habe zu erklären:
Versuche die zyklische Programmierung soweit es geht zu vermeiden!

Für Dein Tagesabschnitt-Problem:
Splitte es in x-eigenständige Makros, und jedes Makro hat genau EINEN Ausführungszeitpunkt, die mit fixen Uhrzeiten sind dabei die einfachsten, weil es IMMER um 11 Uhr "Mittag" wird, und um 14 wird es IMMER Nachmittag, das braucht man nicht jede Minute oder alle 5 Minuten erneut prüfen.
Das einzige Problem, was man mit der strikt Event-Basierten Methode hat:
Nach einem Programmstart kann es zu falschen Tageszeiten kommen, da muss man ggf. mit einem Startmakro noch mal mit einem "selektiven" Tritt nachhelfen.

Aus den Zeiten, wo mein Vater Programmieren gelernt hat, waren Operationen "teuer", vor allem, wenn sie wiederholt das gleiche Ergebnis bringen.
Es macht also keinen Sinn, 288x am Tag (alle 5 min) "dynamisch" bzw. "on the fly" (in der Bedingung) 1h vom Sonnenuntergang abzuziehen, das Ergebnis ist bis zum Tageswechsel immer das gleiche! Und gerade bei HPCL ist es aus leidvoller Erfahrung leider immer besser, vorher "explizit" und möglichst typsicher zu Rechnen, als darauf zu vertrauen, das es der Compiler schon richtig verstehen wird.
Versuche zu verstehen, das es für den Compiler etwas anderes sein kann, wenn Du "01:00:00" + Sonnenaufgang schreibst als Sonnenaufgang + "01:00:00". Im ersten Fall könnte der Compiler daraus "01:00:0007:28:00" machen, nicht weil er "doof" ist, sondern weil das erste Argument ein String sein könnte/ist, und das "+" gilt sowohl für Mathematische Additionen als auch für Zeichenketten anhängen.
Also nutze eine/mehrere Hilfsvariablen vom richtigen Typ, und initialisiere diese entsprechend, dann kann man damit "einfach" in Bedingungen arbeiten.

Ich habe z.B. ein Makro mit "Konstanten", wobei die halt nicht wirklich Konstant sind, aber die ändern sich eigentlich nur 1x pro Tag, nach dem Datumswechsel. Ausnahme: Beginn Sommer/Winterzeit, da ändern die sich noch mal zwischen 2 und 3 Uhr:

Code: Alles auswählen

//! ============================================================
//! OBJEKT konstanten
//! ============================================================
//! OBJEKT-TYP              : Makro
//! BEZEICHNUNG             : konstanten
//! STARTWERT               :
//! ------------------------------------------------------------
//! AUSFÜHRUNGSINTERVALL    : nein
//! AUSFÜHRUNG BEI EINGABE  : ja
//! AUSFÜHRUNG BEI EMPFANG  : nein
//! AUSFÜHRUNG BEI ÄNDERUNG : nein
//! ------------------------------------------------------------
//! KONF.:ALLV=0
//!
//! ============================================================
//! ZEIT-TABELLE (kann [noch] nicht im Editor verändert werden)
//! ============================================================
//! TAG             UHRZEIT
//! ------------------------------------------------------------
//! Täglich         04:02:00
//! Täglich         16:00:00
//! Täglich         00:02:00
//!
//! ============================================================
//! VARIABLENDEFINITIONEN
//! ============================================================
//! NAME                TYP                 STARTWERT
//! ------------------------------------------------------------
//! SUplus30            Uhr
//! SAminus30           Uhr
//! SUplus45            Uhr
//! SAminus45           Uhr
//! SA                  Uhr
//! SU                  Uhr
//! SUminus30           Uhr
//! SAplus30            Uhr
//! zeitLastRun         Zeit
//! uhrWartezeit        Uhr
//! SUplus15            Uhr


// Ausführung auf jeden Fall nach 3 Uhr, falls Sommer/Winterzeit-Umstellung

konstanten.SUminus30 := SONNENUNTERGANG - "00:30:00"
konstanten.SUplus15 := SONNENUNTERGANG + "00:15:00"
konstanten.SUplus30 := SONNENUNTERGANG + "00:30:00"
konstanten.SUplus45 := SONNENUNTERGANG + "00:45:00"
konstanten.SU := SONNENUNTERGANG

konstanten.SAminus30 := SONNENAUFGANG - "00:30:00"
konstanten.SAminus45 := SONNENAUFGANG - "00:45:00"
konstanten.SAplus30 := SONNENAUFGANG + "00:30:00"
konstanten.SA := SONNENAUFGANG

startwatch zeitLastRun

if uhrzeit between "00:00:00" and "02:00:00" then
  uhrWartezeit  := "02:04:33"
  uhrWartezeit := uhrWartezeit - uhrzeit
  wait uhrWartezeit
  run konstanten
endif

if uhrzeit between "02:00:00" and "04:00:00" then
  uhrWartezeit  := "04:03:22"
  uhrWartezeit := uhrWartezeit - uhrzeit
  wait uhrWartezeit
  run konstanten
endif

if uhrzeit between "04:00:00" and "16:00:00" then
  uhrWartezeit  := "16:06:44"
  uhrWartezeit := uhrWartezeit - uhrzeit
  wait uhrWartezeit
  run konstanten
endif
Dieses Makro müsste eigentlich nicht auch noch um 16 Uhr laufen, das ist aber ein "Sicherheits-Lauf", falls die Ausführung vor 16 Uhr neu gestartet wurde, und es wurden keine gespeicherten Variablen-Werte neu eingelesen, um 17 Uhr läuft meine Rolladensteuerung, und die erwartet natürlich aktuelle Werte in den SU +/- - Variablen. Das Makro auch aus einem meiner Init-Makros aufgerufen, eigentlich sollten immer die Werte Richtig sein, es gab aber irgendwann mal Probleme, weshalb da noch die manuellen "Tritte" zur Ausführung drin sind, falls ein Zeittabellen-Eintrag nicht gefeuert hätte.

Falls Du Dich gar nicht mit einer Event-Gesteuerten Programmierung anfreunden kannst:
Baue gezielt Abfragen ein:

Code: Alles auswählen

Wenn Uhrzeit zwischen "11:00:00:" und "14:00:00" dann
  wenn TageszeitistEigene = "Mittag" dann
    verlassen
  endewenn
  TageszeitistEigene := "Mittag"
  startuhr(uhr19)
  Anzeige19:=uhr19
  verlassen
endewenn

Wenn Uhrzeit zwischen "14:00:00:" und SUminus60 dann
  wenn TageszeitistEigene = "Nachmittag" dann
    verlassen
  endewenn
  TageszeitistEigene := "Nachmittag"
  startuhr(uhr19)
  Anzeige19:=uhr19
  verlassen
endewenn
Warum so?
Weil damit, wenn schon zyklisch, dann "effektiver" mit der Ressource Computer umgegangen wird, und es in HPCL kein "SonstWenn" gibt, aber hat eine zeitliche Bedingung zugetroffen, macht es keinen Sinn, weitere Bedingungen zu prüfen, sonst wäre es nicht eindeutig, deshalb kann das Makro verlassen werden.
Und Du brauchst die Tageszeit nur einmal ändern, wenn sie noch nicht "richtig" ist, alles andere ist doppelt/falsch, weil der Startzeitpunkt, den Du glaube ich in Uhr19 "festhalten" willst, sonst alle 5 min geändert wird, und damit der letzte Ausführungszeitpunkt drin steht.

Der Familienvater

herbylfs
Beiträge: 45
Registriert: 07.04.2018, 16:59
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Rechnen mit Zeiten zum Sonnenstand

Beitrag von herbylfs » 10.09.2020, 21:36

Hallo Familienvater,
ich habe das mal versucht, in kleinen schritten.
Zum verstehen.
Aber es kommt ein Syntaxfehler.
fehler.JPG
herby
fehler.JPG
Ich blicke es nicht.
Trotzdem Danke für deine Antworten.
Dateianhänge
fehler1.JPG
Wo kämen wir denn hin, wenn alle sagten "Wo kämen wir denn hin" und niemand ginge um zu sehen, wohin wir kämen, wenn wir gingen!?!
Ich hab so Hunger, dass ich vor lauter Durst gar nicht weiß was ich rauchen soll, so müde bin ich!!!
Spezialisten wissen immer mehr über immer weniger, bis Sie alles über nichts wissen.
Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher.

Familienvater
Beiträge: 7111
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 20 Mal

Re: Rechnen mit Zeiten zum Sonnenstand

Beitrag von Familienvater » 10.09.2020, 22:41

Hi,

die Variable SUminus60 musst Du natürlich anlegen, und auch entsprechend berechnet setzen, und wenn Du das wie ich z.B. in einem Makro "konstanten" machen würdest, dann musst Du natürlich auch das "Objekt" davor schreiben, und dann die Variable entsprechend mit konstanten.SUminus60 ansprechen.

Der Familienvater

EDIT:
Und natürlich solltest Du KEINE Variablen mit dem Namen SONNENAUFGANG bzw. SONNENUNTERGANG anlegen, das sind vordefinierte Funktionsnamen/Objekte von HPCL. Wenn Du die selbst anlegst, dann wird evtl. Deine Variable benutzt, und nicht mehr die eingebaute Funktionalität.
Guckst Du mal in die Hilfe, und suchst nach SONNENAUFGANG bzw SONNENUNTERGANG

Antworten

Zurück zu „homeputer Studio / Standard: allgemeine Fragen“