Ankündigung

Einklappen
Keine Ankündigung bisher.

Telegramme auf den Bus bei Systemstart

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Telegramme auf den Bus bei Systemstart

    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

    #2
    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

    Kommentar


      #3
      Zitat von saft6luck Beitrag anzeigen
      Da gab es mal eine längere Diskussion und seither warte ich (also das Programm ).
      Yep, z.B. hier, da oder dort.

      Kommentar


        #4
        Danke 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

        Kommentar


          #5
          Hab mal eben folgenden Vorschlag programmiert (aber noch nicht eingespielt wenn´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
          Damit das compiliert wird ist folgendes zu beachten:
          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


            #6
            Zitat von daF Beitrag anzeigen
            Danke 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
            vielleicht hilft hier die Sleep-Funktion weiter.
            Handbuch S. 150ff

            [highlight=epc]
            if systemstart() then sleep(EIN) endif
            if after(systemstart(),1000u64) then {
            sleep(AUS)
            } endif
            [/highlight]
            Enertex Bayern GmbH - www.eibpc.com

            Kommentar


              #7
              Das wurde schonmal diskutiert und es gibt grosse Bedenken:

              https://knx-user-forum.de/eibpc/8320...chulung-4.html
              Post #32 ff
              Gruss Pio

              Kommentar


                #8
                Zitat von pio Beitrag anzeigen
                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?

                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


                  #9
                  Zitat von pio Beitrag anzeigen
                  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?
                  Hi,

                  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
                  Enertex Bayern GmbH - www.eibpc.com

                  Kommentar


                    #10
                    Zitat von pio Beitrag anzeigen
                    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?
                    Hm, liegt evtl. am after(). Könnte sein, dass er in jedem Durchlauf einen Timer aufzieht und den in die Schlange stellt.

                    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


                      #11
                      Zitat von saft6luck Beitrag anzeigen
                      Hm, liegt evtl. am after(). Könnte sein, dass er in jedem Durchlauf einen Timer aufzieht und den in die Schlange stellt.
                      Von einem oder 10 Timern sollte sich die Systemlast nicht beeindrucken lassen. Werds aber morgen mal probieren.
                      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


                        #12
                        Zitat von pio Beitrag anzeigen
                        if 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


                          #13
                          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.
                          Man korrigiere mein Verständniss vom Validierungsschema:

                          Code:
                          if after ( systemstart(), 20000u64)) then {
                             if sunset() then write("Jalou 1/2/3", Hoch) endif
                          } endif
                          führt das innere IF genau einmal nach genau 20 sec aus, zumindest, wenn sunset() = 1b01 !

                          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


                            #14
                            Zitat von enertegus Beitrag anzeigen
                            Weiter unten ım Thread wırd davon nochmals gebraucht gemacht - in beiden Faellen ist die eval-Funktion ueberfluessig.
                            Das, was du meinst, ist, dass man es auch anders lösen kann.
                            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.
                            Das kann man mit Programmierfehlern sehr leicht machen. Ist mir schon sehr oft passiert (und nur ohne eval()!) und bisher ist noch kein Gerät dabei gestorben . Der besagte Code sollte dies allerdings nicht machen, oder?
                            BR
                            Marc

                            Kommentar


                              #15
                              Zitat von pio Beitrag anzeigen
                              Von einem oder 10 Timern sollte sich die Systemlast nicht beeindrucken lassen.
                              Von 10 nicht, aber von 20000, denn das Programm wird ja 1 mal pro ms aufgerufen. Du könntest testen, ob z.B. bei 60000 der 'reset' auch erst bei 60 sec auftritt oder doch schon früher.
                              BR
                              Marc

                              Kommentar

                              Lädt...
                              X