TapHome

Syntax und Ablaufsteuerung

Syntax der TapHome-Skriptsprache: Anweisungen und Semikolons, Kommentare, Literale, IF in Funktions- und Blockform, SWITCH, Schleifen WHILE und DO, BREAK, CONTINUE und RETURN.

Anweisungen und Semikolons

Ein Skript ist eine Folge von Anweisungen, und jede Anweisung endet mit einem Semikolon ;. Blockanweisungen (IF … END, WHILE … LOOP, DO … LOOP WHILE …) und Kommentare enden nicht mit einem Semikolon. Bei Schlüsselwörtern und Namen spielt die Groß- und Kleinschreibung keine Rolle: IF, if und If sind dasselbe.

VAR x := 5;
IF x > 3
    x := x - 1;
END
x;
# Result: 4

Das Semikolon darf nur nach der letzten Anweisung des Skripts fehlen; innerhalb eines Blocks braucht es jede Anweisung, auch die letzte vor END oder LOOP. Fehlt innerhalb eines Blocks das Semikolon vor END oder LOOP, bricht das Skript mit Unexpected character 'E' at the end of statement. Expected ';' ab ('L' vor LOOP).

Kommentare

Ein Kommentar beginnt mit # und reicht bis zum Zeilenende. Er kann in einer eigenen Zeile stehen oder auf eine vollständige Anweisung folgen: nach ihrem Semikolon oder nach END, ELSE oder LOOP.

# starting value
VAR x := 5;          # a comment after the semicolon
IF x > 3
    x := 1;
END                  # end of the check

Ein # innerhalb einer Anweisung (vor ihrem Semikolon oder nach der Bedingung von IF oder WHILE) schlägt mit Comment must start on a new line and inline comments are not supported fehl.

Literale

Ein Literal ist ein Wert, der direkt im Skript steht.

LiteralBeispielHinweise
Zahl5, 21.5, -3Dezimaltrennzeichen .. Ein Zahlenliteral ist ein double, daher ergibt 5 / 2 den Wert 2.5. Kein Exponent (1e3), kein führender Punkt (.5).
Hexadezimal0xA0A0, 0xffEin int, bei den Ziffern spielt die Groß- und Kleinschreibung keine Rolle: 0xA0A0 ist 41120.
Binär0b10101010Ein int: 170.
BooleschTRUE, FALSE
Unbekannte ZahlNaNNie gleich irgendetwas; prüfen Sie es mit ISNAN.
Kein WertNullPrüfen Sie es mit ISNULL.
Text"°C", "a\nb", "C:\\data"Escape-Sequenzen \n, \r, \t, \", \\, \xHH, \uXXXX. Eine ungültige Escape-Sequenz schlägt mit Couldn't unescape … fehl.
Zeichen'A', '\n'Genau ein Zeichen.
Sammlung{1, 2, 3}, {"a", "b"}Mindestens ein Element, siehe Sammlungen.
AufzählungswertH, BigEndianFloat, DateTimeKind.UtcAllein oder mit dem Typnamen, siehe Aufzählungstypen.

IF

IF gibt abhängig von einer Bedingung einen von zwei Werten zurück (Funktionsform) oder führt einen von mehreren Anweisungsblöcken aus (Blockform).

1
2
IF(condition, valueIfTrue)
IF(condition, valueIfTrue, valueIfFalse)

Parameter

NameTypBeschreibung
conditionboolEine Zahl ungleich null ist TRUE, Null ist FALSE.
valueIfTrueanyWird zurückgegeben, wenn die Bedingung TRUE ist.
valueIfFalseanyOptional, wird sonst zurückgegeben.

Rückgabewert ist der gewählte Wert, oder Null, wenn die Bedingung nicht TRUE ist und es kein drittes Argument gibt. Nur der gewählte Zweig wird ausgewertet, der andere kann also nicht fehlschlagen.

Beispiel — sichere Division und ein Ersatz für NaN. Eine Division durch null bricht das Skript mit Line in script: 1 Message: Division by zero ab; die Bedingung verhindert das:

IF(va2 > 0, va1/va2, 0);
# Result: va1/va2, or 0 when va2 is 0
IF(ISNAN(Te), 0, Te);
# Result: 0 when the device is in error or returns NaN

Blockform

1
2
3
4
5
6
7
IF condition
    statements;
ELSEIF condition
    statements;
ELSE
    statements;
END

Die Bedingung darf in Klammern stehen und muss in eine Zeile passen; der Zeilenumbruch beendet sie. ELSEIF kann sich wiederholen, ELSE ist optional, END ist Pflicht. Der Block selbst gibt Null zurück; verwenden Sie RETURN, um aus seinem Inneren einen Wert zu liefern.

IF Te < 5
    RETURN(1);
ELSEIF Te > 10
    RETURN(3);
ELSE
    RETURN(0);
END

Fehler — Function IF requires at least 2 parameters.; Unexpected keyword 'X' at the end of IF statement., wenn auf ein inneres END ein ; folgt.

Siehe auch — SWITCH, Operatoren.

SWITCH

SWITCH vergleicht einen Wert mit einer Liste von Fällen und gibt das Ergebnis des ersten passenden Falls zurück, oder ein Standardergebnis, wenn kein Fall passt.

1
SWITCH(value, case1, result1, case2, result2, ..., defaultResult)

Hinweise — SWITCH nimmt mindestens 4 und höchstens 100 Argumente, immer eine gerade Anzahl: den Wert, Paare aus Fall und Ergebnis und das Standardergebnis. Fälle werden wie mit = verglichen: Zahlen nach Wert, Text exakt; der Vergleich von Text mit einer Zahl schlägt mit Operator '==' not defined … fehl. Nur das Ergebnis des passenden Falls wird ausgewertet.

Beispiel — das Handbuch des Geräts führt den aktiven Modus als Bitwerte auf; das Skript macht daraus Stellungen eines Mehrfachschalters:

SWITCH-Beispiel
SWITCH(MODBUSR(H, 168, UInt16),
    0, 0,
    0x0002, 1,
    0x0004, 2,
    0x0008, 3,
    0x0010, 4,
    0x0040, 5,
    0x0800, 6,
    NaN);

Fehler — Function SWITCH requires at least 4 parameters.; Invalid arguments for SWITCH function. bei einer ungeraden Anzahl von Argumenten.

Schleifen WHILE und DO

WHILE wiederholt seine Anweisungen, solange die Bedingung TRUE ist; DO … LOOP WHILE führt sie mindestens einmal aus. CONTINUE; überspringt den Rest des Durchlaufs, BREAK; verlässt die Schleife; beide werden ohne Klammern geschrieben.

1
2
3
4
5
6
7
WHILE condition
    statements;
LOOP

DO
    statements;
LOOP WHILE condition

Wie bei IF endet die Bedingung am Zeilenumbruch. Beginnt sie mit (, endet sie an der passenden ): WHILE (a > 0) AND (b > 0) nimmt nur (a > 0) als Bedingung, schreiben Sie also WHILE (a > 0 AND b > 0).

int i := 10;
WHILE i > 0
    i := i - 1;
    IF i > 5
        CONTINUE;
    END
    BREAK;
LOOP
i;
# Result: 5
int n := 1;
DO
    n := n * 2;
LOOP WHILE n < 100
n;
# Result: 128

Fehler — eine Schleife bricht mit More than 1 000 000 loops, stopping loop ab. BREAK oder CONTINUE außerhalb einer Schleife schlägt mit Cannot use BREAK() outside of WHILE or DO-WHILE fehl. Ein ; nach einem inneren LOOP oder END schlägt mit Unexpected character ';' in WHILE statement fehl.

Namen werden vor den Schlüsselwörtern der Schleife aufgelöst. Eine Variable oder eine Geräteabkürzung namens Do oder While verdeckt das Schlüsselwort, und die Schleife schlägt mit Missing operator between 'DO' and … fehl.

RETURN

RETURN beendet das Skript sofort und macht den angegebenen Wert zu seinem Ergebnis.

1
RETURN(value)

Hinweise — ohne RETURN ist das Ergebnis der Wert der letzten Anweisung. Verwenden Sie RETURN, um aus dem Inneren eines Blocks einen Wert zu liefern oder um ein Listener-Skript bei Nachrichten, die es nicht verarbeitet, vorzeitig zu beenden.

IF ISNAN(Te)
    RETURN(0);
END
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknown

Siehe auch — Skriptergebnis.