Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Berechnung nur bei Änderung eines Eingangswerts / Schreiben nur bei Abweichung > 2
puh, danke für die sehr positive Rückmeldung! Habe zur Sicherheit trotzdem eine Projektkopie gemacht, hat aber alles genau wie von Dir beschrieben funktioniert!
Danke noch mal für Deine tollen Bausteine und auch die vielen Hilfestellungen, die Du hier gibst, finde ich echt klasse!
Nur zur Sicherheit, das gilt auch weiterhin und vermutlich in identischer Form auch für die Logikberechnung, richtig?
Nein, das ist für Dich nicht mehr relevant. Das gilt nur, wenn Du von einer sehr alten Betaversion updatest. Für alle anderen Fälle -- so auch für Deinen -- kann man das ignorieren. Einfach die neuen Bausteine importieren, das Projekt updaten, erneut öffnen, fertig. Steht eigentlich auch so in der Anleitung...
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...
Es gab während der Betaphase mal eine Umstellung, die Komplikationen verursacht hat. Danach war und ist das genau so, wie bei den Gira-eigenen Bausteinen.
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...
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 nullabledouble macht; dazu dient das Fragezeichen. Notwendig ist das, um im anderen Zweig des Bedingungsoperatorsnull zurückgeben zu können. Es muss nämlich in beiden Zweigen der gleiche Typ zurück gegeben werden.
Wenn die Regelung nur kurz lüftet, wird beim Ausschalten durch die Regelung auch der Betriebsstundenzähler zurückgesetzt
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.
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?
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?
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:
_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.
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
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).
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.
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.
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.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: