Formel| Mit
diesem Baustein wird eine frei eingegebene Rechnung über die
Eingänge ausgeführt. Statt mehrere Rechen- und Vergleichsbausteine
hintereinander zu schalten, wird die Rechnung als Text
hingeschrieben, zum Beispiel (E1+E2)/2 oder if E1>20
then E2 else E3. Die Formel wird über den Knopf neben dem Parameter "Formel" bearbeitet. Der Editor prüft die Eingabe laufend und zeigt an, an welcher Stelle etwas nicht stimmt; übernehmen lässt sich nur eine fehlerfreie Formel. Der Baustein rechnet ausschließlich mit den Werten, die gerade an den Eingängen anliegen. Er merkt sich nichts, kennt keine Schleifen und greift auf nichts anderes zu. Wird mehr gebraucht, ist das Lua Skript das richtige Werkzeug. |
Eingänge |
||
| TR |
Trigger |
Löst die Berechnung aus, wenn als Berechnung
"Nur bei Trigger" eingestellt ist. Gerechnet wird bei der
steigenden Flanke, also beim Wechsel von 0 auf einen Wert ungleich
0. Bei den anderen Betriebsarten bleibt der Eingang ohne Wirkung und
kann unbelegt bleiben. |
| E1 ... E8 |
Eingang 1 bis 8 |
Die Werte, mit denen gerechnet wird. Unter genau
diesen Namen werden sie in der Formel angesprochen. Wie viele
Eingänge der Baustein hat, legt der Parameter "Anzahl
Eingänge" fest. Ein nicht verknüpfter Eingang liefert 0. |
Ausgänge |
||
| AW |
Ergebnis |
Das Ergebnis der Formel. |
| AB |
Ergebnis als Bit |
1, solange das Ergebnis nicht 0 ist, sonst 0.
Praktisch bei Formeln, die eine Bedingung prüfen, denn Vergleiche
liefern immer 1 oder 0. |
| FE |
Fehler |
1, solange die Formel nicht gerechnet werden kann -
entweder weil sie fehlerhaft ist oder weil beim Rechnen etwas nicht
aufgeht, zum Beispiel eine Division durch Null. Sonst 0. |
Parameter |
||
| Formel |
Öffnet über den Knopf den Editor, in dem die Rechnung
eingegeben wird. Welche Schreibweise erlaubt ist, steht weiter
unten. |
|
| Anzahl Eingänge |
Wie viele Werteingänge der Baustein bekommt, 1 bis 8.
In der Formel darf nur auf vorhandene Eingänge zugegriffen werden. |
|
| Berechnung |
Wann gerechnet wird:
|
|
| Zykluszeit |
Abstand zwischen zwei Berechnungen in Sekunden. Wird
nur angezeigt, wenn als Berechnung "Zyklisch" gewählt ist. |
|
| Nachkommastellen |
Auf wie viele Nachkommastellen das Ergebnis gerundet
wird. -1 bedeutet, dass nicht gerundet wird. |
|
| Bei Fehler |
Was der Ausgang AW zeigt, solange nicht gerechnet
werden kann:
|
|
Aufbau einer Formel |
||
| Eingänge |
Die Eingangswerte heißen in der Formel E1 bis
E8 - genau so, wie sie am Baustein beschriftet sind. Der
Trigger-Eingang TR wird in der Formel nicht verwendet. |
|
| Groß- und Kleinschreibung |
Spielt keine Rolle. E1, e1, IF
und if sind gleichwertig. |
|
| Zahlen |
Immer mit Dezimalpunkt: 0.5, nicht
0,5. Das Komma trennt in der Formel die Werte einer Funktion. |
|
| Leerzeichen |
Dürfen beliebig gesetzt werden. E1+E2 und
E1 + E2 sind dasselbe. Auch ein Zeilenumbruch ist erlaubt,
damit sich lange Formeln übersichtlich schreiben lassen. |
|
| Wahr und falsch |
Es gibt keine eigenen Wahrheitswerte. Ein Vergleich
liefert 1 für zutreffend und 0 für nicht zutreffend.
Umgekehrt gilt in einer Bedingung jeder Wert ungleich 0 als
zutreffend. |
|
Rechnen |
||
| Zeichen |
Bedeutung |
Beispiel mit E1 = 20 und E2 = 8 |
| + |
Addition |
E1 + E2 ergibt 28 |
| - |
Subtraktion |
E1 - E2 ergibt 12 |
| * |
Multiplikation |
E1 * E2 ergibt 160 |
| / |
Division |
E1 / E2 ergibt 2.5 |
| % |
Rest einer Division |
E1 % E2 ergibt 4, weil 20 geteilt durch 8 zwei
Mal aufgeht und 4 übrig bleiben |
| - |
Vorzeichen |
-E1 ergibt -20 |
| ( ) |
Klammern |
Ohne Klammern gilt Punkt vor Strich:
E1 + E2 * 2 ergibt 36, (E1 + E2) * 2 dagegen 56 |
Vergleichen |
||
| Zeichen |
Bedeutung |
Beispiel mit E1 = 20 und E2 = 8 |
| < |
kleiner als |
E1 < E2 ergibt 0 |
| <= |
kleiner oder gleich |
E1 <= E2 ergibt 0 |
| > |
größer als |
E1 > E2 ergibt 1 |
| >= |
größer oder gleich |
E1 >= E2 ergibt 1 |
| == |
gleich |
E1 == E2 ergibt 0. Achtung: zwei
Gleichheitszeichen, ein einzelnes wird als Fehler gemeldet |
| != |
ungleich |
E1 != E2 ergibt 1 |
Verknüpfen |
||
| Zeichen |
Bedeutung |
Beispiel mit E1 = 1 und E2 = 0 |
| and && |
und - beides muss zutreffen |
E1 and E2 ergibt 0 |
| or || |
oder - eines von beiden genügt |
E1 or E2 ergibt 1 |
| not ! |
nicht - kehrt um |
not E1 ergibt 0, not E2 ergibt 1 |
Funktionen |
||
| Funktion |
Bedeutung |
Beispiel |
| min(a,b) |
der kleinere der beiden Werte |
min(E1,E2) mit E1 = 18 und E2 = 21 ergibt 18 |
| max(a,b) |
der größere der beiden Werte |
max(E1,E2) mit E1 = 18 und E2 = 21 ergibt 21 |
| abs(x) |
Betrag, also der Wert ohne Vorzeichen |
abs(E1-E2) mit E1 = 18 und E2 = 21 ergibt 3 |
| round(x) |
kaufmännisch auf eine ganze Zahl runden |
round(E1) mit E1 = 21.6 ergibt 22 |
| floor(x) |
auf die nächste ganze Zahl abrunden |
floor(E1) mit E1 = 21.6 ergibt 21 |
| ceil(x) |
auf die nächste ganze Zahl aufrunden |
ceil(E1) mit E1 = 21.2 ergibt 22 |
| sqrt(x) |
Quadratwurzel |
sqrt(E1) mit E1 = 16 ergibt 4. Ein negativer
Wert setzt den Ausgang FE |
| pow(a,b) |
a hoch b |
pow(E1,2) mit E1 = 3 ergibt 9 |
| limit(x,lo,hi) |
Wert auf einen Bereich begrenzen |
limit(E1,0,100) ergibt 100 bei E1 = 137, 0 bei
E1 = -5 und 42 bei E1 = 42 |
| pi |
die Kreiszahl, 3.14159... |
pi*pow(E1,2) mit E1 = 2 ergibt 12.566 |
Bedingungen |
||
| Aufbau |
if Bedingung then Wert else Wert Trifft die Bedingung zu, gilt der Wert hinter then, sonst der hinter else. Der Teil mit else muss immer angegeben werden - der Baustein hat für jeden Fall einen Wert auszugeben. |
|
| Einfaches Beispiel |
if E1 > 20 then 1 else 0 Ergibt 1, sobald E1 über 20 liegt, sonst 0. |
|
| Mehrere Stufen |
if E1 > 30 then 3 else if E1 > 20 then 2
else 1 Ergibt 3 über 30, 2 zwischen 20 und 30 und sonst 1. Bedingungen lassen sich beliebig ineinander schachteln. |
|
| Nur der zutreffende Zweig wird gerechnet |
if E2 == 0 then 0 else E1 / E2 Ist E2 gleich 0, wird der Teil hinter else gar nicht erst gerechnet. So lässt sich eine Division sauber absichern, ohne dass der Ausgang FE anspricht. |
|
Beispiele aus der Praxis |
||
| Aufgabe |
Formel |
Erklärung |
| Mittelwert
zweier Fühler |
(E1+E2)/2 |
E1 und E2 sind die beiden Raumfühler. Die Klammern
sind wichtig, ohne sie würde nur E2 halbiert. |
| Temperaturdifferenz
ohne Vorzeichen |
abs(E1-E2) |
Liefert immer den positiven Abstand zwischen Vorlauf
und Rücklauf, egal welcher Wert größer ist. |
| Sollwert
begrenzen |
limit(E1,18,26) |
Der über die Visualisierung eingestellte Sollwert
wird auf einen sinnvollen Bereich gezwungen. |
| Stellgröße in
Prozent umrechnen |
limit(E1*10,0,100) |
Aus einem Wert von 0 bis 10 wird ein Prozentwert von
0 bis 100. Die Begrenzung fängt Ausreißer ab. |
| Freigabe nur
wenn zwei Bedingungen zutreffen |
E1 > 200 and E2 < 25 |
Ergibt 1, wenn die Helligkeit über 200 liegt
und die Temperatur unter 25 - sonst 0. Der Ausgang AB lässt
sich direkt als Freigabe weiterverwenden. |
| Zwischen zwei
Sollwerten umschalten |
if E3 then E1 else E2 |
E3 ist der Betriebszustand: ist er gesetzt, gilt der
Komfortsollwert E1, sonst der Absenksollwert E2. |
| Füllstand in
Prozent |
limit((E1-E2)/(E3-E2)*100,0,100) |
E1 ist der Messwert, E2 der Wert bei leer und E3 der
Wert bei voll. Das Ergebnis wird auf 0 bis 100 begrenzt. |
| Division
absichern |
if E2 == 0 then 0 else E1/E2 |
Verhindert, dass der Ausgang FE anspricht, wenn der
Teiler zeitweise 0 ist. |
Meldungen im Editor |
||
|
Der Editor nennt zu jedem Fehler
die Stelle, an der er auftritt, und hebt sie im Text hervor. Erst
wenn die Formel fehlerfrei ist, lässt sie sich mit OK übernehmen. |
||
| Meldung |
Beispiel |
So ist es richtig |
| Die Formel
ist leer |
(kein Text) |
E1 |
| Dieses
Zeichen gehört nicht in eine Formel |
E1 $ E2 |
E1 * E2 |
| Unbekannter
Name |
betrag(E1) |
abs(E1) - erlaubt sind nur die oben
aufgeführten Funktionen |
| Diesen
Eingang gibt es nicht |
E1 + E3 bei zwei Eingängen |
Parameter "Anzahl Eingänge" auf 3 erhöhen
oder E1 + E2 schreiben |
| Hier fehlt
ein Wert |
E1 + |
E1 + E2 |
| Eine Klammer
fehlt oder steht zu viel |
(E1+E2 |
(E1+E2) |
| Die Funktion
erwartet eine andere Anzahl an Werten |
min(E1) |
min(E1,E2) |
| Nach der
Bedingung fehlt "then" |
if E1 2 |
if E1 then 2 else 0 |
| Zu
"then" fehlt "else" |
if E1 then 2 |
if E1 then 2 else 0 |
| Nach der
Formel steht noch etwas |
E1 E2 |
E1 + E2 - hier fehlt das Rechenzeichen |
| Die Formel
ist zu umfangreich |
sehr lange Formeln |
Formeln mit hunderten Rechenschritten sind zu umfangreich.
Die Rechnung auf mehrere Formel-Bausteine aufteilen |
Fehler im Betrieb |
||
|
Manche Fehler zeigen sich erst
beim Rechnen, weil sie von den Eingangswerten abhängen. In diesen
Fällen geht der Ausgang FE auf 1, und der Ausgang AW verhält sich
so, wie es der Parameter "Bei Fehler" vorgibt. Sobald
wieder gerechnet werden kann, geht FE von selbst auf 0 zurück. |
||
| Ursache |
Beispiel |
Abhilfe |
| Division
durch Null |
E1 / E2 mit E2 = 0 |
if E2 == 0 then 0 else E1/E2 |
| Rest einer
Division durch Null |
E1 % E2 mit E2 = 0 |
if E2 == 0 then 0 else E1%E2 |
| Wurzel aus
einer negativen Zahl |
sqrt(E1) mit E1 = -4 |
sqrt(abs(E1)) oder
if E1 < 0 then 0 else sqrt(E1) |
| Ergebnis zu
groß |
pow(E1,E2) |
Bei sehr großen Werten wird das Ergebnis nicht mehr
darstellbar. Wertebereich der Eingänge prüfen, Ergebnis mit
limit begrenzen |
Grenzen |
||
|
Die Formel rechnet ausschließlich
mit den Werten, die gerade an den Eingängen anliegen. Sie merkt
sich nichts von einer Berechnung zur nächsten, kennt keine
Schleifen und greift weder auf Adressen noch auf die Uhrzeit zu.
Wird das gebraucht, ist das Lua
Skript das richtige Werkzeug - dafür ist es gedacht. |
||