Typy danych
Typy danych języka skryptowego TapHome: liczby, tekst, typy strukturalne i wyliczeniowe, kolekcje, właściwość .Type, promocja typów w arytmetyce oraz zachowanie Null i NaN.
Typy skalarne
Każda wartość w skrypcie ma konkretny typ. Poniższe nazwy typów są używane w deklaracjach z typem (zobacz Zmienne lokalne), a zwraca je właściwość .Type.
| Typ | Wartości | Uwagi |
|---|---|---|
bool | TRUE, FALSE | Każda liczba różna od zera jest konwertowana na TRUE, zero na FALSE. |
int8, uint8, int16, uint16, int, uint, int64, uint64 | Liczby całkowite 8-, 16-, 32- i 64-bitowe | int i uint to typy 32-bitowe. uint8 to bajt kolekcji bajtów. |
float, double | Liczby zmiennoprzecinkowe | Literały liczbowe i większość arytmetyki dają double. |
char | Jeden znak, 'A' | W arytmetyce występuje jako kod znaku. |
string | Tekst, "abc" | + z tekstem po którejkolwiek stronie łączy tekst. |
Typy strukturalne
Typy strukturalne przechowują kilka wartości dostępnych jako właściwości:
| Typ | Przechowuje | Właściwości |
|---|---|---|
datetime | Datę i czas z rodzajem (Local, Utc, Unspecified) | Zobacz Data i czas |
timespan | Przedział czasu | Days, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (tylko do odczytu) |
httprequest | Przygotowane żądanie HTTP z HTTPREQUEST | Path, Method, Body, Headers (odczyt i zapis) |
httpresponse | Odpowiedź SENDHTTPREQUEST | Content, Headers, IsSuccess, StatusCode, ReasonPhrase (tylko do odczytu) |
receivedmessage | Przychodzącą wiadomość RECEIVEDMSG skryptu listener | Protocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (tylko do odczytu) |
blob | Surowe bajty, na przykład RECEIVEDMSG.PAYLOAD | Length (tylko do odczytu) |
rgbcolor, hsvcolor | Kolory, zobacz Kolory | Red, Green, Blue oraz Hue, Saturation, Value (odczyt i zapis) |
groupvalue | Wartość grupy urządzeń | Calculated, Values (tylko do odczytu) |
currentvalueinfo, historyvalues | Części zmiennej Info wartości | Zobacz Info wartości |
Typy wyliczeniowe
Typ wyliczeniowy to stały zbiór nazwanych wartości, który niektóre funkcje przyjmują jako parametr:
| Typ | Wartości | Używany przez |
|---|---|---|
ModbusRegisterType | C, H, D, A | Funkcje Modbus |
ModbusDataType | Int16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double i ich warianty kolejności bajtów, zobacz Typy danych Modbus | Funkcje Modbus, PACKVALUE, UNPACKVALUE |
LinearType | DEFAULT, BOUNDS, STRICT, INFINITE | LINEAR |
DateTimeKind | Local, Utc, Unspecified | NOW, DATETIME |
DayOfWeek | Monday … Sunday | Właściwości datetime |
CompareOptions | None, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal | COMPARE |
Wartość wyliczeniową zapisuje się samą (Utc) albo z typem (DateTimeKind.Utc). Typy wyliczeniowe działają też jako słowa kluczowe deklaracji:
DateTimeKind kind := Utc;
VAR t := NOW(kind);Kolekcje
collection<T> to lista wartości jednego typu elementu T.
collection<uint16> registers := UINT16COLLECTION(4);
collection<string> names := {"a", "b", "c"};
collection<uint8> data := BYTECOLLECTION("0A0B0C");
LENGTH(names);
# Result: 3- Typ elementu wynika z deklaracji, w przeciwnym razie z pierwszego elementu, który nie jest
Null. Samo{Null}kończy się błędemUnable to determine collection type. - Zagnieżdżone kolekcje nie są obsługiwane:
Collection<Collection<>> is not supported. - Kolekcje są wartościami referencyjnymi.
APPEND,INSERT,REMOVEAT,SETATiREPLACEzmieniają kolekcję na miejscu i zwracają tę samą kolekcję. BYTECOLLECTION,UINT16COLLECTIONiBOOLCOLLECTIONtworzą najwyżej 2048 elementów; większą liczbę każda forma zgłasza własnym komunikatem (zobacz Błędy wykonania).LENGTH(c)lubc.Lengthzwraca liczbę elementów.
Dostępność — kolekcje z typem: Core 2022.2 lub nowszy; UINT16COLLECTION i BOOLCOLLECTION: TapHome Next 2026.1.39016+.
Właściwość .Type
Każda wartość ma właściwość tylko do odczytu .Type, która zwraca nazwę jej typu jako tekst. Dla wartości wyliczeniowej jest to typ wyliczeniowy, na przykład "DateTimeKind".
VAR x := 5.5;
x.Type;
# Result: "Double"
VAR c := BYTECOLLECTION("0A0B");
c.Type;
# Result: "Collection<UInt8>"Właściwości można odczytać tylko z nazwanej zmiennej. AVG('a', 'c').Type kończy się błędem Unexpected character '.'; najpierw zapisz wartość do zmiennej.
Reguły konwersji typów
W arytmetyce o typie wyniku decyduje pierwsza reguła, która pasuje do obu operandów:
- Którykolwiek operand jest
double(lub wartością grupy):double. - Którykolwiek operand jest
float:float. - Którykolwiek operand jest
int64:int64. - Którykolwiek operand jest
uint64:uint64. - Którykolwiek operand jest
uint:uint, gdy drugi też jest bez znaku, w przeciwnym razieint64. - W pozostałych przypadkach (mniejsze liczby całkowite,
bool,char):int.
Dzielenie dwóch liczb całkowitych obcina część ułamkową. Literał liczbowy jest typu double, więc dzielenie przez niego tego nie robi:
int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5- Operatory bitowe działają na liczbach całkowitych; operand
doublejest najpierw konwertowany naint64. +z tekstem po którejkolwiek stronie łączy tekst:"T=" + 21.5daje"T=21.5".datetime+ liczba dodaje milisekundy,datetime+timespandodaje przedział, atimespan±timespandziała zgodnie z oczekiwaniami.- Dzielenie przez zero zatrzymuje skrypt komunikatem
Division by zero. Zabezpiecz dzielnik funkcjąIF. - Przypisanie do zmiennej z typem konwertuje wartość na jej typ, zobacz Zmienne lokalne.
Null i NaN
NaN to liczba o nieznanej wartości, na przykład czujnik, który nie został jeszcze odczytany, albo urządzenie w błędzie. Null oznacza, że wartości w ogóle nie ma: usunięte urządzenie albo funkcja, która niczego nie znalazła.
- Porównanie z literałem
NaN(x = NaN,x < NaN) jest odrzucane już przy parsowaniu skryptu:Comparison with NaN is always false. Use the IsNaN method to check for NaN value.UżyjISNAN. <,>,<=i>=z operandemNulldająFALSE.Null = Null,Null <= NulliNull >= NulldająTRUE,Null = 5dajeFALSE.&,|i^z operandemNulldająNull;<<i>>dająNulldla wartościNullpo lewej stronie, natomiast liczba przesunięćNullzatrzymuje skrypt komunikatemCannot cast DataType.Null to number.- Arytmetyka i logika z
Null(Null + 5,!Null) zatrzymuje skrypt komunikatemOperator '+' not defined for 'Null' and 'Double'. Najpierw sprawdź wartość funkcjąISNULL. - Warunek
IFrównyNullliczy się jakoFALSE. MIN,MAX,AVGiORDERpomijająNulliNaN; warianty…STRICTprzekazują je dalej.EQUALS(NaN, NaN)dajeTRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown