Datentypen
Datentypen der TapHome-Skriptsprache: Zahlen, Text, strukturierte und Aufzählungstypen, Sammlungen, die Eigenschaft .Type, Typerweiterung in der Arithmetik und das Verhalten von Null und NaN.
Skalare Typen
Jeder Wert in einem Skript hat einen konkreten Typ. Die folgenden Typnamen werden in typisierten Deklarationen verwendet (siehe Lokale Variablen), und die Eigenschaft .Type gibt sie zurück.
| Typ | Werte | Hinweise |
|---|---|---|
bool | TRUE, FALSE | Jede Zahl ungleich null wird zu TRUE, null zu FALSE. |
int8, uint8, int16, uint16, int, uint, int64, uint64 | Ganze Zahlen mit 8, 16, 32 und 64 Bit | int und uint sind die 32-Bit-Typen. uint8 ist das Byte der Bytesammlungen. |
float, double | Gleitkommazahlen | Zahlenliterale und die meiste Arithmetik ergeben einen double. |
char | Ein Zeichen, 'A' | Geht als sein Zeichencode in die Arithmetik ein. |
string | Text, "abc" | + mit einem String auf einer der beiden Seiten verbindet Text. |
Strukturierte Typen
Strukturierte Typen enthalten mehrere Werte, die als Eigenschaften verfügbar sind:
| Typ | Enthält | Eigenschaften |
|---|---|---|
datetime | Datum und Uhrzeit mit einer Art (Local, Utc, Unspecified) | Siehe Datum und Uhrzeit |
timespan | Zeitintervall | Days, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (nur lesbar) |
httprequest | Vorbereitete HTTP-Anfrage aus HTTPREQUEST | Path, Method, Body, Headers (lesen und schreiben) |
httpresponse | Antwort von SENDHTTPREQUEST | Content, Headers, IsSuccess, StatusCode, ReasonPhrase (nur lesbar) |
receivedmessage | Eingehende Nachricht RECEIVEDMSG eines Listener-Skripts | Protocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (nur lesbar) |
blob | Rohe Bytes, zum Beispiel RECEIVEDMSG.PAYLOAD | Length (nur lesbar) |
rgbcolor, hsvcolor | Farben, siehe Farben | Red, Green, Blue und Hue, Saturation, Value (lesen und schreiben) |
groupvalue | Wert einer Gerätegruppe | Calculated, Values (nur lesbar) |
currentvalueinfo, historyvalues | Teile einer Variablen Wertinfo | Siehe Wertinfo |
Aufzählungstypen
Ein Aufzählungstyp (enum) ist eine feste Menge benannter Werte, die manche Funktionen als Parameter nehmen:
| Typ | Werte | Verwendet von |
|---|---|---|
ModbusRegisterType | C, H, D, A | Modbus-Funktionen |
ModbusDataType | Int16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double und ihre Varianten der Bytereihenfolge, siehe Modbus-Datentypen | Modbus-Funktionen, PACKVALUE, UNPACKVALUE |
LinearType | DEFAULT, BOUNDS, STRICT, INFINITE | LINEAR |
DateTimeKind | Local, Utc, Unspecified | NOW, DATETIME |
DayOfWeek | Monday … Sunday | Eigenschaften von datetime |
CompareOptions | None, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal | COMPARE |
Ein Aufzählungswert wird allein (Utc) oder mit seinem Typ (DateTimeKind.Utc) geschrieben. Aufzählungstypen funktionieren auch als Schlüsselwörter einer Deklaration:
DateTimeKind kind := Utc;
VAR t := NOW(kind);Sammlungen
collection<T> ist eine Liste von Werten eines Elementtyps T.
collection<uint16> registers := UINT16COLLECTION(4);
collection<string> names := {"a", "b", "c"};
collection<uint8> data := BYTECOLLECTION("0A0B0C");
LENGTH(names);
# Result: 3- Der Elementtyp ergibt sich aus der Deklaration, sonst aus dem ersten Element, das nicht
Nullist.{Null}allein schlägt mitUnable to determine collection typefehl. - Verschachtelte Sammlungen werden nicht unterstützt:
Collection<Collection<>> is not supported. - Sammlungen sind Referenzwerte.
APPEND,INSERT,REMOVEAT,SETATundREPLACEändern die Sammlung direkt und geben dieselbe Sammlung zurück. BYTECOLLECTION,UINT16COLLECTIONundBOOLCOLLECTIONerzeugen höchstens 2048 Elemente; jede Form meldet eine größere Anzahl mit einer eigenen Meldung (siehe Laufzeitfehler).LENGTH(c)oderc.Lengthgibt die Anzahl der Elemente zurück.
Verfügbar — typisierte Sammlungen ab Core 2022.2; UINT16COLLECTION und BOOLCOLLECTION ab Core 2026.1, Build 39001.
Die Eigenschaft .Type
Jeder Wert hat die nur lesbare Eigenschaft .Type, die den Namen seines Typs als Text zurückgibt. Bei einem Aufzählungswert ist es der Aufzählungstyp, zum Beispiel "DateTimeKind".
VAR x := 5.5;
x.Type;
# Result: "Double"
VAR c := BYTECOLLECTION("0A0B");
c.Type;
# Result: "Collection<UInt8>"Eigenschaften lassen sich nur aus einer benannten Variablen lesen. AVG('a', 'c').Type schlägt mit Unexpected character '.' fehl; speichern Sie den Wert zuerst in einer Variablen.
Regeln der Typumwandlung
In der Arithmetik entscheidet die erste Regel, die auf die beiden Operanden passt, über den Typ des Ergebnisses:
- Einer der Operanden ist
double(oder ein Gruppenwert):double. - Einer der Operanden ist
float:float. - Einer der Operanden ist
int64:int64. - Einer der Operanden ist
uint64:uint64. - Einer der Operanden ist
uint:uint, wenn auch der andere vorzeichenlos ist, sonstint64. - Sonst (kleinere Ganzzahlen,
bool,char):int.
Die Division zweier Ganzzahlen schneidet die Nachkommastellen ab. Ein Zahlenliteral ist ein double, daher tut die Division durch ein Literal das nicht:
int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5- Bitweise Operatoren arbeiten mit Ganzzahlen; ein Operand vom Typ
doublewird zuerst inint64umgewandelt. +mit einem String auf einer der beiden Seiten verbindet Text:"T=" + 21.5ergibt"T=21.5".datetime+ Zahl addiert Millisekunden,datetime+timespanaddiert das Intervall, undtimespan±timespanfunktioniert wie erwartet.- Eine Division durch null bricht das Skript mit
Division by zeroab. Sichern Sie den Divisor mitIFab. - Eine Zuweisung an eine typisierte Variable wandelt den Wert in deren Typ um, siehe Lokale Variablen.
Null und NaN
NaN ist eine Zahl, deren Wert unbekannt ist, zum Beispiel ein noch nicht gelesener Sensor oder ein Gerät mit Fehler. Null bedeutet, dass es überhaupt keinen Wert gibt: ein gelöschtes Gerät oder eine Funktion, die nichts gefunden hat.
- Ein Vergleich mit dem Literal
NaN(x = NaN,x < NaN) wird schon beim Parsen des Skripts abgelehnt:Comparison with NaN is always false. Use the IsNaN method to check for NaN value.Verwenden SieISNAN. <,>,<=und>=mit einem OperandenNullergebenFALSE.Null = Null,Null <= NullundNull >= NullsindTRUE,Null = 5istFALSE.&,|und^mit einem OperandenNullergebenNull;<<und>>ergebenNullbei einem WertNulllinks, während eine VerschiebeweiteNulldas Skript mitCannot cast DataType.Null to numberabbricht.- Arithmetik und Logik mit
Null(Null + 5,!Null) brechen das Skript mitOperator '+' not defined for 'Null' and 'Double'ab. Prüfen Sie den Wert zuerst mitISNULL. - Eine Bedingung
NullbeiIFzählt alsFALSE. MIN,MAX,AVGundORDERüberspringenNullundNaN; die Varianten…STRICTgeben sie weiter.EQUALS(NaN, NaN)istTRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown