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.
Ostatnia aktualizacja:
Skrypt TapHome to ciąg instrukcji, z których każda kończy się średnikiem, a który może się rozgałęziać za pomocą IF i SWITCH oraz powtarzać w pętlach WHILE i DO. Strona opisuje komentarze, literały (liczby, wartości szesnastkowe i binarne, tekst, kolekcje), formę funkcji i bloku instrukcji IF, SWITCH, pętle z BREAK i CONTINUE oraz RETURN. W słowach kluczowych i nazwach wielkość liter nie ma znaczenia, a skrypt zwraca wartość ostatniej instrukcji, chyba że wcześniej zakończy go RETURN. Na przykład IF(va2 > 0, va1/va2, 0) dzieli bezpiecznie i zapobiega błędowi Division by zero.
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.
# x zaczyna od 5
VAR x := 5;
IF x > 3
x := x - 1; # wykonuje się tylko, gdy x jest większe niż 3
END
# ostatnie wyrażenie jest wynikiem
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.
# wartość początkowa
VAR x := 5; # komentarz po średniku
IF x > 3
x := 1;
END # koniec sprawdzeniaZnak # 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ład | Uwagi |
|---|---|---|
| Liczba | 5, 21.5, -3 | Separator dziesiętny .. Literał liczbowy jest typu double, więc 5 / 2 daje 2.5. Bez wykładnika (1e3), bez kropki na początku (.5). |
| Szesnastkowy | 0xA0A0, 0xff | Typ int, wielkość liter cyfr nie ma znaczenia: 0xA0A0 to 41120. |
| Binarny | 0b10101010 | Typ int: 170. |
| Logiczny | TRUE, FALSE | |
| Nieznana liczba | NaN | Nigdy nie jest równa niczemu; sprawdzisz ją funkcją ISNAN. |
| Brak wartości | Null | Sprawdzisz 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ść wyliczeniowa | H, BigEndianFloat, DateTimeKind.Utc | Sama 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).
| |
Parametry
| Nazwa | Typ | Opis |
|---|---|---|
condition | bool | Liczba różna od zera to TRUE, Null to FALSE. |
valueIfTrue | any | Zwracana, gdy warunek jest TRUE. |
valueIfFalse | any | Opcjonalna, 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 NaNForma bloku
| |
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.
# wybierz wartość według temperatury Te
IF Te < 5
RETURN(1); # poniżej 5
ELSEIF Te > 10
RETURN(3); # powyżej 10
ELSE
RETURN(0); # w przeciwnym razie
ENDBłę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.
| |
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:

# odczyt bitów trybu z rejestru Modbus 168
# wartość bitu zmienia się w pozycję przełącznika, inaczej NaN
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.
| |
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; # licznik zaczyna od 10
WHILE i > 0
i := i - 1; # odliczanie
IF i > 5
CONTINUE; # pomiń resztę przebiegu, gdy i jest powyżej 5
END
BREAK; # wyjdź z pętli, gdy i wynosi najwyżej 5
LOOP
i;
# Result: 5int n := 1; # wartość początkowa
# ciało pętli działa co najmniej raz, potem dopóki n < 100
DO
n := n * 2; # n podwaja się w każdym przebiegu
LOOP WHILE n < 100
n;
# Result: 128Błę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
DoalboWhileprzesłania słowo kluczowe i pętla kończy się błędemMissing operator between 'DO' and ….
RETURN
RETURN natychmiast kończy skrypt, a podana wartość staje się jego wynikiem.
| |
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.
# zakończ skrypt z 0, gdy Te jest nieznana
IF ISNAN(Te)
RETURN(0);
END
# przeliczenie temperatury na °F
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknownZobacz też — Wynik skryptu.