TapHome

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.

TypWerteHinweise
boolTRUE, FALSEJede Zahl ungleich null wird zu TRUE, null zu FALSE.
int8, uint8, int16, uint16, int, uint, int64, uint64Ganze Zahlen mit 8, 16, 32 und 64 Bitint und uint sind die 32-Bit-Typen. uint8 ist das Byte der Bytesammlungen.
float, doubleGleitkommazahlenZahlenliterale und die meiste Arithmetik ergeben einen double.
charEin Zeichen, 'A'Geht als sein Zeichencode in die Arithmetik ein.
stringText, "abc"+ mit einem String auf einer der beiden Seiten verbindet Text.

Int32 x := 4; schlägt mit Unknown variable or constant 'Int32' fehl. Namen wie Int32 und UInt32 gibt es nur unter den Modbus-Datentypen von MODBUSR und MODBUSW.

Strukturierte Typen

Strukturierte Typen enthalten mehrere Werte, die als Eigenschaften verfügbar sind:

TypEnthältEigenschaften
datetimeDatum und Uhrzeit mit einer Art (Local, Utc, Unspecified)Siehe Datum und Uhrzeit
timespanZeitintervallDays, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (nur lesbar)
httprequestVorbereitete HTTP-Anfrage aus HTTPREQUESTPath, Method, Body, Headers (lesen und schreiben)
httpresponseAntwort von SENDHTTPREQUESTContent, Headers, IsSuccess, StatusCode, ReasonPhrase (nur lesbar)
receivedmessageEingehende Nachricht RECEIVEDMSG eines Listener-SkriptsProtocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (nur lesbar)
blobRohe Bytes, zum Beispiel RECEIVEDMSG.PAYLOADLength (nur lesbar)
rgbcolor, hsvcolorFarben, siehe FarbenRed, Green, Blue und Hue, Saturation, Value (lesen und schreiben)
groupvalueWert einer GerätegruppeCalculated, Values (nur lesbar)
currentvalueinfo, historyvaluesTeile einer Variablen WertinfoSiehe Wertinfo

Aufzählungstypen

Ein Aufzählungstyp (enum) ist eine feste Menge benannter Werte, die manche Funktionen als Parameter nehmen:

TypWerteVerwendet von
ModbusRegisterTypeC, H, D, AModbus-Funktionen
ModbusDataTypeInt16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double und ihre Varianten der Bytereihenfolge, siehe Modbus-DatentypenModbus-Funktionen, PACKVALUE, UNPACKVALUE
LinearTypeDEFAULT, BOUNDS, STRICT, INFINITELINEAR
DateTimeKindLocal, Utc, UnspecifiedNOW, DATETIME
DayOfWeekMonday … SundayEigenschaften von datetime
CompareOptionsNone, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, OrdinalCOMPARE

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 Null ist. {Null} allein schlägt mit Unable to determine collection type fehl.
  • Verschachtelte Sammlungen werden nicht unterstützt: Collection<Collection<>> is not supported.
  • Sammlungen sind Referenzwerte. APPEND, INSERT, REMOVEAT, SETAT und REPLACE ändern die Sammlung direkt und geben dieselbe Sammlung zurück.
  • BYTECOLLECTION, UINT16COLLECTION und BOOLCOLLECTION erzeugen höchstens 2048 Elemente; jede Form meldet eine größere Anzahl mit einer eigenen Meldung (siehe Laufzeitfehler).
  • LENGTH(c) oder c.Length gibt 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:

  1. Einer der Operanden ist double (oder ein Gruppenwert): double.
  2. Einer der Operanden ist float: float.
  3. Einer der Operanden ist int64: int64.
  4. Einer der Operanden ist uint64: uint64.
  5. Einer der Operanden ist uint: uint, wenn auch der andere vorzeichenlos ist, sonst int64.
  6. 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 double wird zuerst in int64 umgewandelt.
  • + mit einem String auf einer der beiden Seiten verbindet Text: "T=" + 21.5 ergibt "T=21.5".
  • datetime + Zahl addiert Millisekunden, datetime + timespan addiert das Intervall, und timespan ± timespan funktioniert wie erwartet.
  • Eine Division durch null bricht das Skript mit Division by zero ab. Sichern Sie den Divisor mit IF ab.
  • 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 Sie ISNAN.
  • <, >, <= und >= mit einem Operanden Null ergeben FALSE. Null = Null, Null <= Null und Null >= Null sind TRUE, Null = 5 ist FALSE.
  • &, | und ^ mit einem Operanden Null ergeben Null; << und >> ergeben Null bei einem Wert Null links, während eine Verschiebeweite Null das Skript mit Cannot cast DataType.Null to number abbricht.
  • Arithmetik und Logik mit Null (Null + 5, !Null) brechen das Skript mit Operator '+' not defined for 'Null' and 'Double' ab. Prüfen Sie den Wert zuerst mit ISNULL.
  • Eine Bedingung Null bei IF zählt als FALSE.
  • MIN, MAX, AVG und ORDER überspringen Null und NaN; die Varianten …STRICT geben sie weiter. EQUALS(NaN, NaN) ist TRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown