Ankündigung

Einklappen
Keine Ankündigung bisher.

Neue Logikbausteine für den L1/X1: Formelberechnung, Statistik und mehr...

Einklappen
Dieser Beitrag wurde beantwortet.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hallo nochmal,

    ich habe eine Lösung gefunden. Ob es eleganter geht, kann ich nicht sagen, aber es tut:



    Gruß
    Michael
    Angehängte Dateien

    Kommentar


      Ob Deine Formeln stimmen, habe ich jetz nicht genau verglichen. Im Prinzip reicht es, "Sekunde" in "Minute" umzubenennen und den Telegrammgenerator auf minütliches Senden zu stellen.

      Zitat von MrSetup Beitrag anzeigen
      Wie schaffe ich es, das wenn der Auslöser wieder auf "Null" gesetzt wird (also ein Abbruch)
      Ich glaube hier liegt ein Missverständnis vor. Ein Abbruch ist in der von mir vorgeschlagenen Logik gar nicht vorgesehen. 0 Am Eingang zählt runter.

      Zitat von MrSetup Beitrag anzeigen
      dass bei einem Neustart der Zähler wieder von Vorne beginnt?
      Genau das tut er bei einer 1 am Eingang.

      Oder sollte ich Deine Frage völlig falsch verstanden haben?

      Zitat von MrSetup Beitrag anzeigen
      eine Lösung gefunden
      OK. Und für welches Problem ist das die Lösung? Dass das erste Zeitintervall zu kurz ist, weil bei meiner Primitivlösung der Telegrammgenerator ncht mit dem Start synchronisiert ist? Das stört natürlich bei Sekunden deutlich weniger ls bei Minuten ...
      Zuletzt geändert von hyman; 29.04.2022, 17:00.

      Kommentar


        Zitat von hyman Beitrag anzeigen
        OK. Und für welches Problem ist das die Lösung? Dass das erste Zeitintervall zu kurz ist, weil bei meiner Primitivlösung der Telegrammgenerator ncht mit dem Start synchronisiert ist? Das stört natürlich bei Sekunden deutlich weniger ls bei Minuten ...
        Die Lösung ist für das Problem "Abbruch" und "Neustart". Das die Zeitintervalle in deinem Beispiel kurz gewählt waren habe ich schon verstanden und war auch nicht meine Frage.
        Mein Beispiel zeigt nun den Auslöser und den Telegrammgenerator mit deiner Formel in Minuten angepasst (siehe Post vorher). Der Verzögerer war notwendig, da sonst der Telegrammgenerator nicht angesprungen wäre. Was ich jetzt noch einbauen werde, ist ein Eingang bei den Minuten, welche dann individuelle Werte durch einen Schieberegler entgegen nehmen kann.

        Fazit: Es tut alles wie es gehen soll. Nochmals Danke für die Unterstützung.

        Kommentar


          Wieder mal ein Problem bei dem die Formelberechnung helfen kann: Vier Stati (Haustür offen, Fenster offen, Wenn alles zu dann Haustür abgeschlossen oder nicht) sollen unter Verwendung von Sonderzeichen auf einem Info-Display (Merten 6295) dargestellt werden. Zugegeben sind diese Info-Displays etwas Retro, aber die Auswahl von Geräten die auch akustische Alarme geben können ist begrenzt, deshalb habe ich die immer noch im Einsatz (und auch Ersatz liegen, wenn mal eins kaputt gehen sollte). Sonderzeichen können diese Displays nur bei der Darstellung von Schaltzuständen als Text. Um nun die genannten vier Stati in Form vier verschiedener Texte darstellen zu können, muss u. a. ein Zwangsführungsobjekt bedient werden.

          Dies ist mit der folgenden Logik möglich, die abhängig von zwei Binäreingangsvariablen drei mögliche Zustände auf ein KO vom Typ 2.x: ausgeben kann:
          • $03 | Priorität, Ein (bedeutet bei mir: Haustür steht offen)
          • $02 | Priorität, Aus (bedeutet bei mir: Ein Fenster steht offen)
          • $00 | Keine Priorität, Aus (bedeutet bei mir: Nix steht offen)
          1.png
          Man könnte die Formel 3 leicht so erweitern, dass sie auch den vierten möglichen Zustand ($01 | Keine Priorität, Ein) ausgeben kann. Das ist aber in meiner Anwendung nicht notwendig, weil es für die Darstellung "Keine Priorität" ein zweites Kommunikationsobjekt gibt (das mitteilt ob die Haustür abgeschlossen ist oder nicht).

          Der Trick ist, dass man zwei verschiedene Gruppenadress-Datenpunkte verschiedener Typen auf der gleichen Gruppenadresse definiert:

          2.png

          Schreibt man auf den ersten, so wird Priorität immer gesetzt. Beim Schreiben auf den zweiten wird Priorität weg genommen. Beide schreiben den gegebenen Binärwert als Schaltzustand. Danke an doenke für diesen Hinweis, der mich auf die richtige Fährte gesetzt hat.
          Zuletzt geändert von hyman; 05.06.2022, 09:18.

          Kommentar


            Moin,
            ich habe hier ein Logikblatt (relativ umfangreich) in dem ich eine Formelberechnung geändert habe (Eingänge). Da ist der GPA gleich einmal abgeschmiert. Nach einem Restart, Löschen und neu Einfügen des Bausteins hat wieder alles funktioniert.
            Nach einem erneuten Öffnen des Projekts kann ich das Logikblatt leider überhaupt nicht mehr öffnen. Ich bekomme den "Klick-Effekt" und dann passiert nichts. Geändert habe ich tatsächlich nur die Formelberechnung. Andere Logikblätter mit entsprechenden Bausteinen funktionieren tadellos.
            Irgendeinen Tipp, wie ich wieder ins Blatt komme?

            Viele Grüße

            P.S.: Version des Bausteins ist 1.4.5, GPA 4.7

            Edit: Copy & Paste des Logikblattes führt reproduzierbar zum Absturz des GPA.
            Zuletzt geändert von Brainbug; 19.07.2022, 17:39.

            Kommentar


              Hatte ich tatsächlich noch nie, obwohl ich oft an meinen Formelberechnungen ändere. Allerdings verwende ich noch GPA 4.5.

              Was genau hast Du denn geändert, bevor es zu dem kaputten Verhalten kam?

              Hast Du das Projekt mal exportiert und wieder importiert?

              Kommentar


                Ich hatte an den Variablen rumgespielt (in andere Formeln verschoben) und vorher nicht dir Verbindungen entfernt. Dann ist der GPA einmal abgestürzt. Nach einem Neustart habe ich die Verbindungen entfernt und neu gesetzt. Danach ging die Simulation auch. Als ich das Logikblatt dann erneut öffnen wollte, kam das oben beschriebene Verhalten.

                Den Tipp mit dem Ex- und Import probiere ich heute mal aus.

                Viele Grüße

                Kommentar


                  In solchen Fällen hat mir der Editor eigentlich immer die Verbindungen von alleine gelöscht. Dass Ein- und Assgänge von Bausteinen abhäng von der Parametrierung verschwinden, kommt ja auch bei den Original-Gira-Bausteinen vor ... sollte der Editor also mit umgehen können. Wenn danach sogar eine Simulation funktioniert hat, war evtl. zu dem Zeitpunkt noch/wieder alles in Ordnung. Fragt sich also auch, was danach bis zum Wieder-Öffnen des Blatts sonst noch so passiert ist ...

                  Kommentar


                    Hier ist tatsächlich nichts weiter passiert.
                    Es sieht so aus, dass der GPA es nicht mag, wenn man Eingänge/Ausgänge verändert und vorher die Verknüpfungen nicht löst: Habe ich bei der Formelberechnung eine Variable in einer Formel definiert, mit einem anderen Baustein verknüpft und ändere/lösche ich dann die Variable => reproduzierbarer Absturz des GPA und Probleme, das Logikblatt erneut zu öffnen. Habe ich vorher die Verknüpfung gelöscht, passiert nichts.
                    Das tritt bei mir übrigens auch beim XML/JSON-Parser auf. Anzahl Ausgänge definiert, verknüpft und dann die Anzahl der Ausgänge reduziert => reproduzierbarer Absturz des GPA.
                    Kann ich das irgendwo im GPA loggen?

                    Viele Grüße

                    Kommentar


                      Zitat von Brainbug Beitrag anzeigen
                      Anzahl Ausgänge definiert, verknüpft und dann die Anzahl der Ausgänge reduziert => reproduzierbarer Absturz des GPA.
                      Bei mir (GPA 4.5.0, Build 6557) definitiv nicht -- gerade nochmal ausprobiert.

                      Zitat von Brainbug Beitrag anzeigen
                      Kann ich das irgendwo im GPA loggen?
                      Meinst Du jetzt in einem Logfile nähere Infos zum Absturz finden (das wäre im Menü unter Log-Informationen ...) oder bei Gira einen Bugreport abgeben (keine Ahnung) ?

                      Kommentar


                        Guten Morgen hyman

                        Bin gerade dabei mit Deinem sensationellen Baustein wieder einmal eine Problemlösung zu basteln...

                        Nun ergibt sich folgende Fragestellung:

                        Zur Steuerung eines DigitalSignage-Systems (insgesamt 5 Screens in 3 Räumen) wollte ich die X1-Funktion Audiosteuerung "zweckentfremden" und ein Logikblatt bedienen lassen. In diesem Logikblatt verrichten unter anderem der "UpDownCounter" von Roeller (zum Zappen in der Playlist) und der "WebRequest" von Kai Burkard (zur HTTPS-Nutzung) ihre Dienste.

                        Grundsätzlich ist mein Vorhaben möglich ABER ich würde gerne die Playliste allen Mediensteuerung dynamisch zur Verfügung stellen. Gibt es irgendwie die Möglichkeit dem Logikbaustein eine Formel als Variable/dynamischer Text/was auch immer zur Verfügung zu stellen? Den Content kann ich mir per WebRequest holen aber dann irgendwie weiternutzen wollen.

                        Als Beispiel hier die aktuelle Formatvorlage in der Formelberechnung:

                        {Sync:B} ? "SYNC Modus" : ( {Playlist:N} == 1 ? "Termine" : ( {Playlist} == 2 ? "ToDo" : ( {Playlist} == 3 ? "Menschen" : ( {Playlist} == 4 ? "Menschen (Portrait)" : ( {Playlist} == 5 ? "Menschen (Business)" : ( {Playlist} == 6 ? "Menschen (Beauty)" : ( {Playlist} == 7 ? "Menschen (Fashion)" : ( {Playlist} == 8 ? "Menschen (Gruppen)" : ( {Playlist} == 9 ? "Menschen (Nude)" : ( {Playlist} == 10 ? "Menschen (Frauen)" : ( {Playlist} == 11 ? "Menschen (Männer)" : ( {Playlist} == 12 ? "Dinge" : ( {Playlist} == 13 ? "Dinge (Still)" : ( {Playlist} == 14 ? "Dinge (Architektur)" : ( {Playlist} == 15 ? "Sammlungen" : ( {Playlist} == 16 ? "Sammlungen (Repro)" : ( {Playlist} == 17 ? "Sammlungen (Ausstellung)" : ( {Playlist} == 18 ? "Fineart" : ( {Playlist} == 19 ? "Customer" : "" ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )


                        Genau diese Playlist würde ich gerne "dynamisch" einfügen wollen.

                        Hast Du vielleicht eine Idee?

                        Gruss André



                        PS: mit dem UpDownCounter funktioniert das Umschalten/Zappen durch die Playlist schonmal perfekt und die Formelberechnung generiert mir den Text zur Anzeige in der Audiosteuerung.

                        Kommentar


                          Hallo André,

                          wenn ich Dein Problem richtig verstanden habe, willst Du als Eingänge:
                          • Eine dynamisch generierte Liste von textuellen Playlist-Einträgen
                          • Einen Index, der einen davon auswählt
                          Der gewählte Text soll dann am Ausgang erscheinen.

                          Wenn das so richtig ist, dann ist die Formel dafür:
                          {commaSeparatedPlaylist:S}.Split(',')[{playlistIndex:I}]

                          Bleibt noch die Frage, woher der Up-/Down-Counter wissen soll, wo die Obergrenze für gültige Indizes liegt. Eine zweite Formel gibt diesen Maximalindex aus:
                          {commaSeparatedPlaylist:S}.Split(',').Length - 1

                          Leider kann man den gemeinsamen Teil {commaSeparatedPlaylist:S}.Split(',') nicht wiederverwenden, weil es keinen passenden Ausgabetyp für Arrays gibt. Man muss also das Array noch im gleichen Ausdruck so weiter verarbeiten, dass wieder ein gültiger Ausgabetyp entsteht. In der ersten Formel geschieht das durch Auswahl einen Eintrags (vom Typ string), in der zweiten durch die Auswahl des Attributs Length, (das den typ int hat)

                          Jetzt könnte man noch -- ähnlich wie im Beispiel Zustandsautomat in der Anleitung zur Formelberechnung gezeigt -- den Auf-/Abwärtszähler gleich mit realisieren, dann braucht man dafür keinen separaten Baustein.

                          Grüße von Horst
                          Zuletzt geändert von hyman; 12.08.2022, 00:35.

                          Kommentar


                            Guten Morgen Horst,

                            vielen Dank für diesen Ansatz - habe gerade schon mal etwas getestet und es funktioniert wunderbar mit der dynamischen Playliste. Halte Dich auf dem Laufenden hier.

                            Es ist immer wieder unglaublich, was Dein Baustein alles kann: The Swiss Army Knife for the X1 :-)

                            Gruss André

                            Kommentar


                              Zitat von araeubig Beitrag anzeigen
                              The Swiss Army Knife for the X1
                              Das ist alles nur möglich dank des Mono.CSharp.Evaluator-Services, den ich eingebunden habe.

                              Kommentar


                                Das klingt sehr bescheiden, aber Du hast das Lob wirklich verdient.
                                Sehr umfangreiche und generische Bausteine mit einer vorbildlichen Doku!
                                Gruß Bernhard

                                Kommentar

                                Lädt...
                                X