Ankündigung

Einklappen
Keine Ankündigung bisher.

Berechnung nur bei Änderung eines Eingangswerts / Schreiben nur bei Abweichung > 2

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

    X1 Berechnung nur bei Änderung eines Eingangswerts / Schreiben nur bei Abweichung > 2

    Hallo zusammen,
    vermutlich ziemliche Anfängerfragen, aber ich bin irgendwie zu keiner (für mich) einfachen Lösung gekommen, daher hoffe ich, Ihr könnt mir einen Tipp geben.

    Und zwar geht es darum, dass ich eine Berechnung (konkret ist es ein Baustein "Grundrechenart" mit einer Subtraktion) nur ausgeführt werden soll, wenn sich der erste der beiden Eingänge ändert (d.h. Änderungen am zweiten Eingang "triggern" nicht, sondern gehen nur in die Berechnung ein, wenn sich der erste Eingang ändert) Leider hat der Baustein keinen Trigger Eingang (und ich bin auch unsicher, wie ich den im konkreten Fall belegen sollte, da der sich ändernde Eingang kein Binärwert ist). Gibt es für so eine Anforderung eine einfache Lösung, oder muss ich - so wie es mir im Moment vorstelle) - doch einiges an Zusatz-Logik dazwischen bauen?

    Das zweite Thema geht in eine Ähnliche Richtung und schliesst sich im Prinzip daran an und zwar möchte ich, dass das Ergebnis der Berechnung nur an einen Ausgang geschrieben wird, wenn es sich mehr als einen bestimmten Wert vom aktuellen Zustand dieses Ausgangs unterscheidet. Die Prüfung ob die Differenz groß genug ist, kann ich ja wieder mit einem neuen Subtrahierer und danach einem Vergleicher machen (dann bekomme ich z.B. eine 1 wenn ich den Wert übernehmen möchte und eine 0 wenn nicht), aber wie baue ich dass dann in die Logik ein um den ursprünglichen Wert an den Ausgang zu schreiben?
    In Prosa klingt das viel kompliziert, als "Formel" würde ich es so in etwa schreiben:
    wenn Absolutwert(Differenz(A,B) > 2) dann A=B, sonst A bleibt unverändert.

    Sorry für die Anfängerfragen, aber irgendwie habe ich da wohl gerade eine Knoten im Kopf

    Danke und Gruß
    Martin

    #2
    Das scheint mir ein typischer Fall für diesen Logikbaustein zu sein.

    Kommentar


      #3
      Also für den zweiten Punkt habe ich jetzt auch schon eine Lösung mit der Formelberechnung entwickelt, dachte aber eigentlich, das wäre etwas gängiges, dass es auch mit "standard Logikbaustenen" gehen müsste.

      Falls es von Interesse ist, das ist die Formel für meine Lösung:
      (Math.Abs({AltSoll:N} - {NeuSoll:N}) > 2) ? {NeuSoll} : {AltSoll:N}

      Und um zu verhindern dass ständig der Alte Sollwert neu geschrieben wird, wenn die Differenz zu gering ist, habe ich dahinter dann noch einen Sent-by-Change Baustein gepackt.

      Für mein erstes Problem, dass eine Berchnung/Ausgabe nur bei Änderung eines bestimmten (in meinem Fall ersten) Eingangs berechnet werden soll, habe ich aber noch nicht gefunden.

      Kommentar


        #4
        hyman hat in seinen Logikbaustein "Send-By-Difference" eingebaut

        Kommentar


          #5
          Zitat von martiko Beitrag anzeigen
          Leider hat der Baustein keinen Trigger Eingang (und ich bin auch unsicher, wie ich den im konkreten Fall belegen sollte, da der sich ändernde Eingang kein Binärwert ist).
          Vielleicht kann man es über einen Wertgenerator lösen.

          Das Berechnungsergebnis geht in das Wert-Feld eines Wertgenerators, sendet also nicht automatisch. Der Trigger des Wertgenerators wird über einen Typkonverter aus dem einen Eingangswert erzeugt. Bei der Typkonvertierung nach Binär wird jeder Wert ungleich 0 zu einer 1, sagt jedenfalls die Doku. Also sollte jeder Wert ungleich 0 den Trigger des Wertgenerators auslösen. Damit die Berechnung vor dem Triggern fertig ist würde ich noch eine kleine Verzögerung einbauen.


          Kommentar


            #6
            Zitat von knxPaul Beitrag anzeigen
            hyman hat in seinen Logikbaustein "Send-By-Difference" eingebaut
            Diese Bausteine hatte ich tatsächlich noch gar nicht installiert, habe ich gleich nachgeholt, danke für den Tipp!
            Im konkreten Fall passt der Sent-by-Difference für mich aber dann doch nicht: Ich vergleiche ja einen neu berechneten Wert mit einem anderen (alten) und will den neuen nur bei einer größeren Abweichung übernehmen. Bei dem "Sent-by-Difference" wird ja aber immer ein Wert mit dem vorherigen Wert verglichen (d.h. eine langsame Steigerung würde dann nie übernommen (denke ich).

            Zitat von 6ast Beitrag anzeigen
            Vielleicht kann man es über einen Wertgenerator lösen.

            Das Berechnungsergebnis geht in das Wert-Feld eines Wertgenerators, sendet also nicht automatisch. Der Trigger des Wertgenerators wird über einen Typkonverter aus dem einen Eingangswert erzeugt. Bei der Typkonvertierung nach Binär wird jeder Wert ungleich 0 zu einer 1, sagt jedenfalls die Doku. Also sollte jeder Wert ungleich 0 den Trigger des Wertgenerators auslösen. Damit die Berechnung vor dem Triggern fertig ist würde ich noch eine kleine Verzögerung einbauen.
            Puh, ganz schön kompliziert, aber (bis auf die Ideen mit dem Wertgenerator und Typconverter) hatte ich es mir vorgestellt. Werde ich mal versuchen zusammen zu basteln. Danke Dir für den Tipp.

            PS: Ist das echt so eine ungewöhnliche Anwendung, dass man nur bestimmte Eingänge Triggern lassen möchte und andere dann nur in eine Berechnung einfließen, wenn der/die gewünschten Eingänge neue Werte haben? Ich hätte echt gedacht, dass es dafür eine einfachere "Standard-Lösung" gibt, was ja scheinbar nicht dar Fall ist.

            Kommentar


              #7
              Ich hab mich mal in der Logik versucht. Meine erste Logik im GPA.

              In der Simu geht es. Beim Start der Logik muss 2 mal eine Wertänderung am Sub 1 erfolgen danach Rechnet es glaub so wie gewollt.

              Gira Logik.png

              Kommentar


                #8
                ollu77
                Vielen Dank für Deine Rückmeldung, aber ich gebe zu, das sieht mir zu kompliziert aus :-)

                Gast1961
                In der Beschreibung klang es komplizierter als es dann in der Umsetzung war, hat genau so funktioniert, wie Du es vorgeschlagen hast, sieht dann so aus:
                Trigger.png

                Kommentar


                  #9
                  Ja so meinte ich das. Freut mich, wenn es so funktioniert!

                  Kommentar


                    #10
                    Hallo Martin,

                    Zitat von martiko Beitrag anzeigen
                    Bei dem "Sent-by-Difference" wird ja aber immer ein Wert mit dem vorherigen Wert verglichen (d.h. eine langsame Steigerung würde dann nie übernommen (denke ich).
                    Doch, wird sie. Jeder neue Wert wird mit dem zuletzt gesendeten verglichen. Ist die Mindestdifferenz (oder mehr) gegeben, wird neu gesendet.

                    Wenn Du aber ohnehin die Formelberechnung (neueste Version!) verwendest, dann kannst Du das auch direkt da drin machen:
                    Code:
                    (Math.Abs({NeuSoll:N} - _previousOut1_) > 2) ? (double?){NeuSoll} : null
                    _previousOut1_ ist der zuletzt an den Ausgang 1 gesendete Wert. Wenn die Formel nicht als Formel 1 verwendet wird, muss die Nummer entsprechend angepasst werden. null sendet einfach gar nichts; das Verhalten ist also genau wie mit Send-by-Difference.

                    Grüße von Horst
                    Zuletzt geändert von hyman; 02.02.2021, 19:17.

                    Kommentar


                      #11
                      Hallo Horst,

                      danke für die Tipps, echt genial, was du da inzwischen in Deine Logikbausteine eingebaut hast!

                      Ob ich das mit dem _previousOut1 verwende, muss ich mir noch mal genau anschauen, wenn der Wert von „AltSoll“ auch an anderer Stelle geändert werden könnte (habe ich aktuell nicht im Kopf) wäre es sicherer, es soch über einen 2. Eingang zu lösen.
                      Der Hinweis das mit „null“ gar nichts gesendet wird ist aber in jedem Fall super, das baue ich natürlich ein, dann kann ich mir den anschließenden Sent-by-Change sparen.
                      kurze Frage noch, was bedeutet das (double?) ? Zum einen, warum wandelst Du in Double um und was bewirkt das Fragezeichen?

                      Gruss
                      Martin

                      Kommentar


                        #12
                        Auch wenn es nicht zu meinem eigenen Thema passt, hänge ich hier noch mal eine andere Frage an, die in meinem Fall auch zur gleichen Anwendung gehört:
                        Ich möchte einen Lüfter (der über eine Dimmaktor gesteuert wird) nicht zu lange laufen lassen. Die eigentliche Regelung mache ich über einen Heiz-Kühlregler Baustein, der dann eine Drehzahl liefert. Aber ich möchte verhindern, dass der Lüfter permanent läuft und darum soll nach einer gewissen Zeit (z.B. 2h) eine Pause eingelegt werden (z.B. 1h).
                        Ich denke ich habe es hinbekommen, mit einer Kombination aus Betriebsstundenzähler („Alarm“ nach 2h), der dann (bei Steigender Flanke) ein „Treppenlicht“ startet, welches über eine Formelberechnung dann dann die Drehzahl vom Regler „durchlässt“ oder auch nicht (dabei ändere ich auch gleich alles unter 25% in 0%, damit der Regler auch mal ausgeht).
                        (Der Betriebsstundenzähler wird zurückgesetzt wenn der Lüfter aus ist).

                        Macht das für Euch so Sinn, oder könnte man das nicht auch irgendwie einfacher bauen?

                        Gruss
                        Martin

                        Kommentar


                          #13
                          Ja, das macht schon Sinn 😃
                          1. Wenn die Regelung nur kurz lüftet, wird beim Ausschalten durch die Regelung auch der Betriebsstundenzähler zurückgesetzt
                          2. Wenn der Lüfter eigentlich nicht reicht (anderes Extrem), dann wird er nach 2h ausgeschaltet, der I-Anteil Regler läuft hoch, und nach der Pause wird wieder volle Drehzahl gelüftet.
                          Alles für mich plausibel.

                          Zur Sperre könnte auch der Logik-Baustein mit gleichem Namen im GPA taugen, mit dem DP vom „Treppenlicht“. Ich überblicke aber nicht, ob es damit wirklich einfacher wird wegen der 25 % Grenze.

                          Kommentar


                            #14
                            Zitat von martiko Beitrag anzeigen
                            kurze Frage noch, was bedeutet das (double?) ? Zum einen, warum wandelst Du in Double um und was bewirkt das Fragezeichen?
                            Das ist ein Typumwandlungsoperator, der aus dem EIngangswert (der schon den Typ double hat) ein nullable double macht; dazu dient das Fragezeichen. Notwendig ist das, um im anderen Zweig des Bedingungsoperators null zurückgeben zu können. Es muss nämlich in beiden Zweigen der gleiche Typ zurück gegeben werden.

                            Kommentar


                              #15
                              Hallo Horst,
                              wie ich gesehen habe, habe ich eine relativ veraltete Version des Logikbausteins (V1.25) installiert... Zu Deinem Textformatierer (der ja im gleichen Paket ist und den ich ebenfalls im Einsatz habe), habe ich mir Deine folgenden Infos für ein Update notiert:
                              Update Schritt für Schritt

                              Um Probleme und Datenverluste zu vermeiden, beim Update bitte genau wie folgt vorgehen:

                              Play it safe – Backup und Dokumentation

                              Das Projekt duplizieren und die Kopie des Projekts öffnen; darin den Logik-Editor öffnen.
                              Für alle vorhandenen Textformatierer-Bausteinen auf allen Logikblättern die vorhandenen Verbindungen an den Ein- und Ausgängen dokumentieren (z. B. durch Bildschirmfotos).
                              Die Formatvorlagen aus den Eingabefeldern der Baustein-Eigenschaften in einen Texteditor kopieren.

                              Projektkopie aktualisieren

                              Bei allen vorhandenen Textformatierer-Bausteinen auf allen Logikblättern die Verbindungen aller Ein- und Ausgänge löschen.
                              Erst wenn sicher keine Ein- und Ausgänge mehr angeschlossen sind: Mit "Logikbausteine hinzufügen" die neue Version in den GPA importieren und die "Logikbausteine aktualisieren".
                              Im Dialog den Update bestätigen. (Das Projekt schließt sich.)
                              Die Kopie des Projekts und darin den Logik-Editor erneut öffnen.
                              Alle Logikblätter, die Textformatierer-Bausteine enthalten, erneut öffnen. (Die Formatvorlagen und Eingänge sind verschwunden.)
                              Die Formatvorlage in neuer Syntax aus dem Texteditor ins entsprechende Eingabefeld der Baustein-Eigenschaften kopieren. Wenn die Syntax richtig ist, erscheinen die Eingänge wieder (möglicherweise mit anderen Namen).
                              Die vorher dokumentierten Verbindungen aller Ein- und Ausgänge wieder herstellen.
                              Wenn alle Logikblätter aktualisiert worden sind, das Projekt auf Fehler prüfen und ggf. nacharbeiten.

                              Sollte dieses Vorgehen nicht zum gewünschten Erfolg führen – oder gar zu Logikblättern, die sich nicht mehr öffnen lassen – dann sind sehr wahrscheinlich Ein- oder Ausgänge vergessen worden, die nach dem Update verwaiste – nicht darstellbare und nicht löschbare – Verbindungen haben. Dann hilft nur: Diese Anleitung nochmal von vorne, und diesmal wirklich keinen einzigen Baustein und keine einzige Verbindung vergessen.

                              Grüße von Horst
                              Nur zur Sicherheit, das gilt auch weiterhin und vermutlich in identischer Form auch für die Logikberechnung, richtig?

                              Puh... dann habe ich leider einige vor mir ich habe ca. 10 Logikblätter alle mit mehreren Formeln und/oder Textformatierungen...

                              PS: Bisschen Blöd, dass Gira da nicht ein einfacheres Verfahren anbietet um "externe" Bausteine zu aktualisieren, bei den "internen" geht es ja auch ohne so viel händische Arbeit...

                              Kommentar

                              Lädt...
                              X