Ankündigung
Einklappen
Keine Ankündigung bisher.
[TUT] Wir basteln uns einen Größer-Kleiner-Gleich-Baustein
Einklappen
X
-
Die Logik wird in einem Schlag berechnet, ähnlich wie in einer SPS. In einem Zyklus werden alle Eingänge gelesen, die Formeln berechnet und am Ende des Zyklus die Ausgänge gesetzt. Ein einzelner Baustein in dem Sinn wird nicht berechnet.
-
Prima, danke für die Informationen. Ich habe das ins Wiki übernommen (siehe https://knx-user-forum.de/mediawiki/..._der_logik.dat) und gleich noch ein paar Fragen:
xA = Der Wert vor der Berechnung heißt in diesem Fall vor ALLEN Berechnungen oder der gerade laufenden (also eine 5012'er Zeile)?
xC = Die Änderung bezieht sich auf den Start der Berechnung im gesamten Baustein, oder nur einer 5012 Zeile?
Laut der aktuellen Beschreibung ist ON[i] undefiniert solange OC[i] == 0 ist. Was passiert bei einem Zugriff auf ON[i] wenn OC[i] != 0 ist? Gibt des HS dann eine Expection, ist der Wert undefiniert?
EI = "Die Berechnung findet innerhalb der Initialisierung" -> Von welcher Initialisierung wird da gesprochen? Vom Baustein für jeden Aufruf einzeln, oder den HS an sich?
Einen Kommentar schreiben:
-
SA[i] => Der Wert einer Speichervariable vor der Berechnung
Einen Kommentar schreiben:
-
Feld Typ BeschreibungEI Boolean 1 == Die Berechnung findet innerhalb der Initialisierung statt.0 == Der Wert der Variable hat sich nicht geändert.
0 == Die Berechnung findet ausserhalb der Initialisierung statt.
EA Array Der Wert des Eingangs vor der Berechnung.
EN Array Der aktuelle Wert des Eingangs.
EC Array of Boolean
1 == Der Eingang hat sich geändert.
0 == Der Eingang hat sich nicht geändert.
AA Array Der Wert des Ausgangs vor der Berechnung.
AN Array Der aktuelle Wert des Ausgangs.
AC Array of Boolean
1 == Der Wert des Ausgangs hat sich geändert.
0 == Der Wert des Ausgangs hat sich nicht geändert.
ON Array Enthält den in den Zeitspeicher geschriebenen Wert,
sobald der Zeitspeicher abgelaufen ist.
OC Array of Boolean
1 == Sobald der Zeitspeicher abgelaufen ist.
0 == Solange der Zeitspeicher läuft.
SA Array Der Wert einer Speichervariable vor der Berechnung.
SN Array Der aktuelle Wert einer Speichervariable.
SC Array of Boolean
1 == Der Wert der Variable hat sich geändert.
Einen Kommentar schreiben:
-
Ich versuche gerade den Treppenhauslichtbaustein zu verstehen. Dort gibt es neben EN[i] auch diverse andere Variablen/Konstanten. Nach meinem Verständnis ergibt sich:
EC[i] => Eingang i geändert
EN[i] => Zahlenwert Eingang Nummer i
AC[i] => Ausgang i geändert
AN[i] => Zahlenwert Ausang Nummer i
OC[i] => Timer Nummer i
ON[i] => Zahlenwert Timer Nummer i
SA[i] => ?
SN[i] => Zahlenwert Status Nummer i
Allerdings stimmt davon sicher nicht alles. Wie heißt es also richtig?
Einen Kommentar schreiben:
-
Tolles TUT
noch einen kleinen Fehler gefunden:
In der '5000'-Zeile fehlt zwischen dem Ausgang ...Kleiner|"Gleich... ein "
So sollte es gehen:
5000|"smh@213\Größer-Kleiner-Gleich"|0|2|"Eingang"|"Vergleichswert"|4|"Größer"| "Kleiner"|"Gleich"|"Ergebnis"
Einen Kommentar schreiben:
-
Langsam, langsam! Ich komm' ja gar nicht mehr hinterher
!
Wiki ergänzt.
Einen Kommentar schreiben:
-
Weiter geht es....
Wie zu erwarten, muss noch ein Byte-Ausgang her, damit man mit dem Ergebnis ein dynamisches KO ansteuern kann.
Wir benötigen also einen weiteren Ausgang "Ergebnis" und müssen demzufolge Zeile 5000 und 5001 erganzen.
5000 wird zu:
und 5001 zuCode:5000|"smh@213\Größer-Kleiner-Gleich"|0|2|"Eingang"|"Vergleichswert"|4|"Größer"|"Kleiner"|"Gleich"|"Ergebnis"
Dann muss natürlich der zusatzliche Ausgang definiert werden, also braucht es noch eine neue Zeile vom Typ 5004:Code:5001|2|4|0|0|0
Hier jetzt wichtig: Die zweite Null, denn der Ausgang soll ja einen Wert erhalten und nicht nur 0/1.Code:5004|4|0|0|1|0
Kommen wir zu den Formeln:
Da wir jetzt nicht das Ergebnis direkt auf den Ausgang schalten können (Ergebnis ist ja immer nur 0 oder 1 bei booleschen Berechnungen), kommt der Parameter Bedingung zum Einsatz.
Die Formel steht also jetzt bei Bedingung, und unter Formel in dem Fall ein Fixwert, der dann, wenn die Bedingung erfüllt ist, auf den Ausgang geschoben wird.
Also drei zusatzliche 5012er Zeilen:
Code:5012|0|"round(EN[1]*1000000) > round(EN[2]*1000000)"|"1"|""|4|0|0|0 5012|0|"round(EN[1]*1000000) < round(EN[2]*1000000)"|"2"|""|4|0|0|0 5012|0|"round(EN[1]*1000000) == round(EN[2]*1000000)"|"3"|""|4|0|0|0
Einen Kommentar schreiben:
-
So, das Tutorial habe ich jetzt mal ins Wiki überführt.
https://knx-user-forum.de/mediawiki/...tein_erstellen
Einen Kommentar schreiben:
-
Dachte mir, dass die Frage kommt :-)
Werden später den Baustein ergänzen.... :-)
Einen Kommentar schreiben:
-
Hallo MatthiasS
So weit bin ich in meinen versuchen auch schon gekommen.
Du benutzt 3 Ausgänge , die je nach eingangssignal 1 oder 0 sind, aber wie löse ich das, wenn ich nur einen Ausgang möcht und je nach Eingangssignal eine 1,2 oder 3 ausgeben will.
5012|1|"EN[1] < EN[2]-0.25"|"1"|""|1|0|0|0
5012|1|"EN[1] > EN[2]-0.25 and EN[1]< EN[2]+0.25"|"2"|""|1|0|0|0
5012|1|"EN[1] > EN[2]+0.25"|"3"|""|1|0|0|0
so habe ich es versucht aber ist wohl ein Fehler drin vermutlich bei der Formel oder Bedingung.
Vielleicht hast du ja noch eine Idee ?
Einen Kommentar schreiben:


Einen Kommentar schreiben: