Chyby skriptu a řešení problémů
Chybová hlášení skriptu TapHome doslovně — Division by zero, chyby parsování, chyby za běhu a chyby kontextu či verze — s příčinou a opravou každé z nich.
Skript TapHome může selhat dvěma způsoby. Chyba parsování se najde při čtení textu skriptu: editor skriptu ji zobrazí a skript se nespustí. Chyba za běhu zastaví skript, který už běží. Hlášení níže jsou citována doslovně; X, A, B a N zastupují název, typ nebo číslo v hlášení.
Jak se chyby hlásí
Chyba za běhu nese řádek skriptu a hlášení:
| |
Kde se zalomení řádku nezobrazuje, zní stejná chyba Line in script: 7 Message: Division by zero. Skript zastavený chybou za běhu nedá žádnou hodnotu (Null); smart rule Vzorec pak má při dalším běhu také LastState = Null.
Dělení nulou
Line in script: 1 Message: Division by zero znamená, že dělitel byl při běhu skriptu přesně 0 — typicky hodnota zařízení, například va2 ve va1/va2. Dělte jen tehdy, když je dělitel větší než 0:
IF(va2 > 0, va1/va2, 0);
# Result: 0 when va2 is 0, otherwise va1 divided by va2Funkční podoba IF vyhodnotí jen zvolenou větev, takže nikdy nedělí nulou. Když může být dělitel záporný, použijte va2 <> 0. Další recepty na stránce Příklady.
Chyby parsování
| Hlášení | Příčina a oprava |
|---|---|
Unknown variable or constant 'X' | Překlep, hodnota zařízení nepřidaná do skriptu nebo slovo, které jazyk nezná: NOT 1 dá 'NOT' — negace je !. Mimo blok se chybějící ; na předchozím řádku může projevit jako další název. |
Unknown function 'X' | Taková funkce neexistuje. MODBUS, TOBYTEARRAY a BYTEARRAY neexistují — použijte MODBUSR nebo MODBUSW, TOBYTES a BYTECOLLECTION. |
Wrong number of literals and operators in expression | Operátor bez operandu, například 1 == 1. Rovnost je =, nerovnost <>. |
Unexpected character 'X' at the end of statement. | Chybí ; před dalším příkazem. Uvnitř bloku hlášení končí Expected ';', například Unexpected character 'E' at the end of statement. Expected ';' před END. |
Unexpected character '.' | Vlastnost čtená z výsledku funkce, například AVG(1, 2).Type. Nejprve uložte hodnotu do proměnné. |
Unexpected character ';' in WHILE statement (nebo DO) | ; za vnitřním END nebo LOOP uvnitř cyklu. |
Unexpected keyword 'X' at the end of IF statement. | ; za vnitřním END uvnitř bloku IF. |
Comment must start on a new line and inline comments are not supported | # před ; příkazu nebo za podmínkou IF či WHILE. |
Comparison with NaN is always false. Use the IsNaN method to check for NaN value. | x = NaN — použijte ISNAN(x). |
Couldn't unescape X | Jedno zpětné lomítko v řetězci; pište "C:\\data". |
Too many characters in char literal | Text v jednoduchých uvozovkách, například 'ab'; text potřebuje dvojité uvozovky. |
Variable name must start with letter, Only letters or numbers are allowed in variable name | Název jako 1x nebo my_value. |
Variable must have initial value provided | VAR x; — zadejte hodnotu nebo deklarujte typ: int x;. |
Chyby za běhu
| Hlášení | Příčina a oprava |
|---|---|
Division by zero | Viz Dělení nulou. |
Specified argument was out of the range of valid values. | PARSETEXT našel levý vzor, ale ne pravý. Nejprve ověřte přes INDEXOF. |
PARSEJSON - Element not found: 'X' | JSONPath nic nenašel. Předejte TRUE jako třetí argument a dostanete místo toho Null. |
Operator 'X' not defined for 'A' and 'B' | Operace s nekompatibilními typy, například aritmetika s Null. Nejprve ověřte přes ISNULL. |
Cannot cast 'A' to 'B' | Hodnota typu, který nelze převést, například text tam, kde je potřeba číslo. |
Can not directly set value to device variable | Přiřazení do hodnoty zařízení mimo smart rule Skript. |
More than 1 000 000 loops, stopping loop | Cyklus WHILE nebo DO, který neskončí. |
Cannot use BREAK() outside of WHILE or DO-WHILE | BREAK mimo cyklus; totéž CONTINUE. |
Interval 'X' is out of range (0-10000) | SLEEP se záporným intervalem nebo delším než 10 000 ms. |
Maximum array length is 2048 | BYTECOLLECTION ze šestnáctkového textu delšího než 2048 bajtů. |
Invalid array length. Must be greater than 0 and less than or equal 2048 | BYTECOLLECTION s počtem bajtů 0 nebo větším než 2048. |
UINT16COLLECTION: count must be between 1 and 2048 | UINT16COLLECTION, nebo BOOLCOLLECTION s vlastním názvem, s počtem mimo 1 – 2048. |
GETBIT - bit must be between 0 and 15 | Bit nebo bajt mimo typ hodnoty, zde 16bitové hodnoty. |
GETBIT - value X is out of the 32-bit range (-2147483648 .. 4294967295) | Desetinná hodnota, která není 32bitové celé číslo. |
Return value 'X' does not match required return type constraint: 'T' | Skript pro čtení zařízení vrátil typ, který hodnota zařízení neudrží. |
Response is too long (Nbytes). Maximum supported length is 128KB | Odpověď HTTP větší než 128 kB. |
Invalid register number: X | Registr Modbus mimo 0 až 65535. |
RegisterValueToWrites: Can't write double.NaN to modbus register | NaN zapsané přes MODBUSW. |
Chyby kontextu a verze
| Hlášení | Příčina a oprava |
|---|---|
X function not supported here. | Funkce v tomto druhu skriptu nefunguje, například ADDERROR function not supported here. ve smart rule. |
SLEEP function not allowed in this context. | SLEEP ve smart rule Skript nebo ve skriptu oznámení. |
ModbusFunction - unknown modbus device to work with | Funkce Modbus mimo skript Modbus. |
PacketParserFunction - PacketParserContext is null | Funkce Packet parser mimo skript Packet parser. |
DEBOUNCE - invalid argument, must be a device variable | První argument DEBOUNCE je výraz, ne hodnota zařízení. |
DEBOUNCE - Function is not available | DEBOUNCE ve skriptu bez hodnot zařízení, které lze ošetřit proti zákmitům. |
X function not supported. Please update your core unit to be able to use this feature. | Core je starší než funkce. |
Data type 'X' not supported. Please update your core unit to be able to use this feature. | Klíčové slovo typu novější než Core. |
Modbus data type 'X' not supported. Please update your core unit to be able to use this feature. | Int64, UInt64 nebo Double na Core starším než 2026.1, build 40595. |
Jaký build která funkce vyžaduje, najdete na stránce Požadavky na verzi.