TapHome

Składnia i sterowanie przebiegiem

Składnia języka skryptowego TapHome: instrukcje i średniki, komentarze, literały, IF w formie funkcji i bloku, SWITCH, pętle WHILE i DO, BREAK, CONTINUE i RETURN.

Instrukcje i średniki

Skrypt to ciąg instrukcji, a każda instrukcja kończy się średnikiem ;. Instrukcje blokowe (IF … END, WHILE … LOOP, DO … LOOP WHILE …) i komentarze nie kończą się średnikiem. W słowach kluczowych i nazwach wielkość liter nie ma znaczenia: IF, if i If to to samo.

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

Średnik można pominąć tylko po ostatniej instrukcji skryptu; wewnątrz bloku każda instrukcja go potrzebuje, łącznie z ostatnią przed END lub LOOP. Brak średnika wewnątrz bloku przed END lub LOOP zatrzymuje skrypt komunikatem Unexpected character 'E' at the end of statement. Expected ';' ('L' przed LOOP).

Komentarze

Komentarz zaczyna się znakiem # i trwa do końca wiersza. Może stać w osobnym wierszu albo po kompletnej instrukcji: po jej średniku albo po END, ELSE lub LOOP.

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

Znak # wewnątrz instrukcji (przed jej średnikiem albo po warunku IF lub WHILE) kończy się błędem Comment must start on a new line and inline comments are not supported.

Literały

Literał to wartość zapisana bezpośrednio w skrypcie.

LiterałPrzykładUwagi
Liczba5, 21.5, -3Separator dziesiętny .. Literał liczbowy jest typu double, więc 5 / 2 daje 2.5. Bez wykładnika (1e3), bez kropki na początku (.5).
Szesnastkowy0xA0A0, 0xffTyp int, wielkość liter cyfr nie ma znaczenia: 0xA0A0 to 41120.
Binarny0b10101010Typ int: 170.
LogicznyTRUE, FALSE
Nieznana liczbaNaNNigdy nie jest równa niczemu; sprawdzisz ją funkcją ISNAN.
Brak wartościNullSprawdzisz go funkcją ISNULL.
Tekst"°C", "a\nb", "C:\\data"Sekwencje ucieczki \n, \r, \t, \", \\, \xHH, \uXXXX. Nieprawidłowa sekwencja kończy się błędem Couldn't unescape ….
Znak'A', '\n'Dokładnie jeden znak.
Kolekcja{1, 2, 3}, {"a", "b"}Co najmniej jeden element, zobacz Kolekcje.
Wartość wyliczeniowaH, BigEndianFloat, DateTimeKind.UtcSama albo z nazwą typu, zobacz Typy wyliczeniowe.

IF

IF zwraca jedną z dwóch wartości w zależności od warunku (forma funkcji) albo wykonuje jeden z kilku bloków instrukcji (forma bloku).

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

Parametry

NazwaTypOpis
conditionboolLiczba różna od zera to TRUE, Null to FALSE.
valueIfTrueanyZwracana, gdy warunek jest TRUE.
valueIfFalseanyOpcjonalna, zwracana w pozostałych przypadkach.

Zwraca wybraną wartość albo Null, gdy warunek nie jest TRUE i nie ma trzeciego argumentu. Obliczana jest tylko wybrana gałąź, więc druga nie może skończyć się błędem.

Przykład — bezpieczne dzielenie i zamiennik dla NaN. Dzielenie przez zero zatrzymuje skrypt komunikatem Line in script: 1 Message: Division by zero; warunek temu zapobiega:

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

Forma bloku

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

Warunek może być w nawiasach i musi zmieścić się w jednym wierszu; koniec wiersza go kończy. ELSEIF może się powtarzać, ELSE jest opcjonalne, END jest obowiązkowe. Sam blok zwraca Null; aby uzyskać z niego wartość, użyj RETURN.

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

Błędy — Function IF requires at least 2 parameters.; Unexpected keyword 'X' at the end of IF statement., gdy po wewnętrznym END stoi ;.

Zobacz też — SWITCH, Operatory.

SWITCH

SWITCH porównuje wartość z listą przypadków i zwraca wynik pierwszego pasującego przypadku albo wynik domyślny, gdy żaden przypadek nie pasuje.

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

Uwagi — SWITCH przyjmuje co najmniej 4 i co najwyżej 100 argumentów, zawsze parzystą liczbę: wartość, pary przypadku i jego wyniku oraz wynik domyślny. Przypadki są porównywane jak =: liczby według wartości, tekst dokładnie; porównanie tekstu z liczbą kończy się błędem Operator '==' not defined …. Obliczany jest tylko wynik pasującego przypadku.

Przykład — instrukcja urządzenia podaje aktywny tryb jako wartości bitów; skrypt zamienia je na pozycje przełącznika wielowartościowego:

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

Błędy — Function SWITCH requires at least 4 parameters.; Invalid arguments for SWITCH function. przy nieparzystej liczbie argumentów.

Pętle WHILE i DO

WHILE powtarza swoje instrukcje, dopóki warunek jest TRUE; DO … LOOP WHILE wykonuje je co najmniej raz. CONTINUE; pomija resztę przebiegu, BREAK; opuszcza pętlę; oba zapisuje się bez nawiasów.

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

DO
    statements;
LOOP WHILE condition

Podobnie jak w IF warunek kończy się wraz z końcem wiersza. Gdy zaczyna się od (, kończy się na odpowiadającym ): WHILE (a > 0) AND (b > 0) bierze jako warunek tylko (a > 0), więc napisz 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

Błędy — pętla zatrzymuje się komunikatem More than 1 000 000 loops, stopping loop. BREAK lub CONTINUE poza pętlą kończy się błędem Cannot use BREAK() outside of WHILE or DO-WHILE. Znak ; po wewnętrznym LOOP lub END kończy się błędem Unexpected character ';' in WHILE statement.

Nazwy są rozwiązywane przed słowami kluczowymi pętli. Zmienna lub skrót urządzenia o nazwie Do albo While przesłania słowo kluczowe i pętla kończy się błędem Missing operator between 'DO' and ….

RETURN

RETURN natychmiast kończy skrypt, a podana wartość staje się jego wynikiem.

1
RETURN(value)

Uwagi — bez RETURN wynikiem jest wartość ostatniej instrukcji. Użyj RETURN, aby zwrócić wartość z wnętrza bloku albo wcześniej zakończyć skrypt listener dla wiadomości, których nie obsługuje.

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

Zobacz też — Wynik skryptu.