Hallo, ich habe festgestellt, dass der EibPC bei einem Systemstart (neues Programm drauf) Telegramme auf den Bus schickt, die er eigentlich gar nicht senden sollte. Bei dem konkreten Fall geht es darum: Die Rollos fahren hoch wenn keine Freigabe für die Beschattung da ist (also z.B. zu dunkel, zu kalt). Wenn nun allerdings der Rollo manuell unten ist (also nachts) dann soll kein Telegramm gesendet werden. Um den manuellen Status sofort verfügbar zu haben, lesen die die GA bei Systemstart aus. Trotzdem sendet der EibPC bei Systemstart erstmal den Befehl zu hochfahren. Habe ich hier einen Denkfehler, oder werden die read-Befehle nicht als erstes ausgeführt? Danke, Felix
Ankündigung
Einklappen
Keine Ankündigung bisher.
Telegramme auf den Bus bei Systemstart
Einklappen
X
-
Die read-Befehle werden zwar sofort ausgeführt, müssen sich aber "durch den Stau quälen", sprich: es dauert etwas bis alle draußen sind und die Antworten wieder eintreffen.
Du solltest in Fällen, die 'sofort' eine Aktion ausführen, entweder erst eine gewisse Zeit X nach dem Systemstart anfangen oder auf den Event des entsprechenden Telegrammempfanges warten.
Ob letzteres bei den Reads jetzt geht oder nicht, kann ich aber nicht mehr sagen. Da gab es mal eine längere Diskussion und seither warte ich (also das Programm).
BR
Marc
-
Hab mal eben folgenden Vorschlag programmiert (aber noch nicht eingespieltwenn´s schief geht, gehen einige Rolläden hoch und der WAF in den Keller, da die Kinder schon schlafen).
Die Idee dahinter ist, dass man die ganze EibPC-Sektion erst dann ausführt, wenn eine gewisse Zeit seit Systemstart vergangen ist, und man nicht in jede kritische if-Abfrage noch eine extra Freigabe einbauen muss.
Code:[Macros] MyMakro1(vMakroFreigabe,Identifier1,"1/2/3"b01,1b01) [EibPC] // Konstandendefinitionen und Variablendeklarationen // cHEARTBEAT_MINUTES = 0 cHEARTBEAT_SECONDS = 50 cSENDDATETIME_MINUTES = 5 cSENDDATETIME_SECONDS = 0 vMacroFreigabe = 0 if eval(after(systemstart(),15000u64)) then { /* Freigabe für Makros setzen ///////////// */; vMacroFreigabe = 1; /* HEARTBEAT SIGNAL /////////////////////// */; if cycle(cHEARTBEAT_MINUTES,cHEARTBEAT_SECONDS) then { write("vom EibPC Command-12/0/0"u32,cEIBPCHEARTBEAT) } endif; /* SYSTEMZEIT und -DATUM //////////////// */; if cycle(cSENDDATETIME_MINUTES,cSENDDATETIME_SECONDS) then { write("Systemzeit-0/0/1"t24,settime()); write("Systemdatum-0/0/2"d24,setdate()) } endif } endif
1) Variablendeklarationen müssen vor der globalen if eval(... -Abfrage gemacht werden
2) Innerhalb der if eval(... -Abfrage dürfen nur Kommentare in der Form
/* xxxxxxxx */;
verwendet werden (man beachte das abschliessende ; (es sei denn, der Kommentar steht unmittelbar vor dem } endif der if eval(... -Abfrage) )
3) Am Ende des letzten Befehls vor dem } endif der if eval(... -Abfrage darf kein ; mehr stehen
Was mir noch nicht ganz klar ist: eval wird in jeder Schleife bearbeitet (das Validierungsschema wird also umgangen), damit der Bereich im Then - Teil immer abgearbeitet wird.
Werden dann aber auch immer alle inneren if-Abfragen auch immer bearbeitet, oder gilt da nach wie vor das Validierungsschema?Gruss Pio
Kommentar
-
Zitat von daF Beitrag anzeigenDanke für die Links.
Wär super, wenn man generell einstellen könnte, wieviele Sekunden nach dem Systemstart der EibPC mit der Verarbeitung beginnen soll.
Grüße,
Felix
Handbuch S. 150ff
[highlight=epc]
if systemstart() then sleep(EIN) endif
if after(systemstart(),1000u64) then {
sleep(AUS)
} endif
[/highlight]
Kommentar
-
Das wurde schonmal diskutiert und es gibt grosse Bedenken:
https://knx-user-forum.de/eibpc/8320...chulung-4.html
Post #32 ffGruss Pio
Kommentar
-
Zitat von pio Beitrag anzeigenWas mir noch nicht ganz klar ist: eval wird in jeder Schleife bearbeitet (das Validierungsschema wird also umgangen), damit der Bereich im Then - Teil immer abgearbeitet wird.
Werden dann aber auch immer alle inneren if-Abfragen auch immer bearbeitet, oder gilt da nach wie vor das Validierungsschema?
WOW !!!!! Der EibPC startet automatisch neu im Takt der mit after definierten Zeit.
Programmdownload funktioniert nicht mehr.
Hab jetzt erstmal reset gemacht.
Enertex, kann mir das mal einer erklären?
Was soll ich euch zuschicken?Gruss Pio
Kommentar
-
Zitat von pio Beitrag anzeigenWOW !!!!! Der EibPC startet automatisch neu im Takt der mit after definierten Zeit.
Programmdownload funktioniert nicht mehr.
Hab jetzt erstmal reset gemacht.
Enertex, kann mir das mal einer erklären?
Was soll ich euch zuschicken?
bitte
+ Programm
+ ESF-Datei
+ verwendete Makros
+ Ausgabe der Versionsinfos
+ Ausgabe des Ereignisspeichers
zuschicken.
Erklären kann ich das so nicht.
Werds mir aber am Montag mal angucken.
steffi
Kommentar
-
Zitat von pio Beitrag anzeigenWOW !!!!! Der EibPC startet automatisch neu im Takt der mit after definierten Zeit.
Programmdownload funktioniert nicht mehr.
Hab jetzt erstmal reset gemacht.
Enertex, kann mir das mal einer erklären?
Was soll ich euch zuschicken?
Probier doch mal so:
[highlight=epc]
if systemstart() then warten = EIN endif
if after(systemstart(),15000u64) then warten = AUS endif
if eval(warten== AUS) then {
/* Freigabe für Makros setzen ///////////// */;
vMacroFreigabe = 1;
/* HEARTBEAT SIGNAL /////////////////////// */;
if cycle(cHEARTBEAT_MINUTES,cHEARTBEAT_SECONDS) then {
write("vom EibPC Command-12/0/0"u32,cEIBPCHEARTBEAT)
} endif;
/* SYSTEMZEIT und -DATUM //////////////// */;
if cycle(cSENDDATETIME_MINUTES,cSENDDATETIME_SECONDS) then {
write("Systemzeit-0/0/1"t24,settime());
write("Systemdatum-0/0/2"d24,setdate())
} endif
} endif
[/highlight]BR
Marc
Kommentar
-
Zitat von saft6luck Beitrag anzeigenHm, liegt evtl. am after(). Könnte sein, dass er in jedem Durchlauf einen Timer aufzieht und den in die Schlange stellt.
Sollte aber in jedem Fall nicht dazu führen, dass auch die Befehle, die nicht innerhalb des eval-Konstrukts stehen, erneut ausgeführt werden. Das siehst Du nicht in meinem vorherigen Code-Beispiel, aber ich habe auch noch das hier davor stehen (fetter unterstrichener code) und das wird auch jedesmal komplett ausgeführt:
Code:[EibPC] [B] [U]if after(systemstart(), 3000u64) then { read(xxxxx); read(yyyyy); ... usw } endif[/U][/B] // Konstanten rrr = 0 sss = 1 if eval(after(systemstart(),20000u64)) then { ... dieses und jenes } endif
Gruss Pio
Kommentar
-
Zitat von pio Beitrag anzeigenif eval(after(systemstart(),15000u64)) then {
Aus dem Urlaub, aber weil so wichtig:
EVAL ist eine 'teuflische' Sache. Sie unterbricht das Validierungsschema und sorgt dafür, dass bei jedem zyklus die Auswertung der if-Anweısung ausgewertet werden.
Weiter unten ım Thread wırd davon nochmals gebraucht gemacht - in beiden Faellen ist die eval-Funktion ueberfluessig. Wenn man nıcht aufpasst, kann das zum Zumuellen des Buesses bis nıcht mehr ansprechbar bedeuten.offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
Enertex Produkte kaufen
Kommentar
-
Zitat von enertegus Beitrag anzeigen....Sie unterbricht das Validierungsschema und sorgt dafür, dass bei jedem zyklus die Auswertung der if-Anweısung ausgewertet werden.
..... - in beiden Faellen ist die eval-Funktion ueberfluessig.
Code:if after ( systemstart(), 20000u64)) then { if sunset() then write("Jalou 1/2/3", Hoch) endif } endif
Ich will aber, dass das innere IF erstmalig nach 20sec, und dann immer ausgeführt/geprüft wird.
Davor, d.h. in den ersten 10 sec nach Systemstart will ich sämtliche Variablen mittels read-Befehlen im EibPC aktualisieren.
Zur Zeit ist es nicht einfach möglich, den Ausführungszeitpunkt von Code zu definieren in der Art: dieses und jenes 20 sec nach Systemstart UND DANN IMMER WIEDER gemäss Validierungsschema.
.
Ich will NICHT in jede meiner IF-Abfragen auch noch eine Freigabe mit einbauen, die sagt, es ist 20 sec nach Systemstart.Gruss Pio
Kommentar
-
Zitat von enertegus Beitrag anzeigenWeiter unten ım Thread wırd davon nochmals gebraucht gemacht - in beiden Faellen ist die eval-Funktion ueberfluessig.
Und du hast eine Lösung, bei der man nicht bei JEDER Abfrage auf eine Systemstartfreigabevariable prüfen muss?
Wenn man nıcht aufpasst, kann das zum Zumuellen des Buesses bis nıcht mehr ansprechbar bedeuten.. Der besagte Code sollte dies allerdings nicht machen, oder?
BR
Marc
Kommentar
-
Zitat von pio Beitrag anzeigenVon einem oder 10 Timern sollte sich die Systemlast nicht beeindrucken lassen.BR
Marc
Kommentar
Kommentar