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 od Core 2022.2; UINT16COLLECTION i BOOLCOLLECTION od Core 2026.1, kompilacja 39001.
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