Błędy skryptów i rozwiązywanie problemów
Komunikaty błędów skryptów TapHome przytoczone dosłownie — Division by zero, błędy parsowania, błędy wykonania oraz błędy kontekstu i wersji — z przyczyną i rozwiązaniem każdego z nich.
Skrypt TapHome może zawieść na jeden z dwóch sposobów. Błąd parsowania zostaje wykryty podczas odczytu tekstu skryptu: edytor skryptu go wyświetla, a skrypt się nie uruchamia. Błąd wykonania zatrzymuje skrypt, który już działa. Poniższe komunikaty są przytoczone dosłownie; X, A, B i N oznaczają nazwę, typ lub liczbę w komunikacie.
Jak zgłaszane są błędy
Błąd wykonania niesie wiersz skryptu i komunikat:
| |
Tam, gdzie podział wiersza nie jest wyświetlany, ten sam błąd brzmi Line in script: 7 Message: Division by zero. Skrypt zatrzymany błędem wykonania nie daje żadnej wartości (Null); smart rule Formuła ma wtedy przy następnym uruchomieniu także LastState = Null.
Dzielenie przez zero
Line in script: 1 Message: Division by zero oznacza, że dzielnik w chwili uruchomienia skryptu był dokładnie 0 — zwykle jest to wartość urządzenia, taka jak va2 w va1/va2. Dziel tylko wtedy, gdy dzielnik jest większy od 0:
IF(va2 > 0, va1/va2, 0);
# Result: 0 when va2 is 0, otherwise va1 divided by va2Funkcyjna forma IF oblicza tylko wybraną gałąź, więc nigdy nie dzieli przez 0. Gdy dzielnik może być ujemny, użyj va2 <> 0. Więcej gotowych rozwiązań w Przykładach.
Błędy parsowania
| Komunikat | Przyczyna i rozwiązanie |
|---|---|
Unknown variable or constant 'X' | Literówka, wartość urządzenia niedodana do skryptu albo słowo, którego język nie zna: NOT 1 daje 'NOT' — negacja to !. Poza blokiem brakujący ; w poprzednim wierszu może pojawić się jako następna nazwa. |
Unknown function 'X' | Nie ma takiej funkcji. MODBUS, TOBYTEARRAY i BYTEARRAY nie istnieją — użyj MODBUSR lub MODBUSW, TOBYTES i BYTECOLLECTION. |
Wrong number of literals and operators in expression | Operator bez operandu, na przykład 1 == 1. Równość to =, nierówność <>. |
Unexpected character 'X' at the end of statement. | Brakuje ; przed następną instrukcją. Wewnątrz bloku komunikat kończy się Expected ';', na przykład Unexpected character 'E' at the end of statement. Expected ';' przed END. |
Unexpected character '.' | Właściwość odczytywana z wyniku funkcji, taka jak AVG(1, 2).Type. Najpierw zapisz wartość w zmiennej. |
Unexpected character ';' in WHILE statement (lub DO) | ; po wewnętrznym END lub LOOP wewnątrz pętli. |
Unexpected keyword 'X' at the end of IF statement. | ; po wewnętrznym END wewnątrz bloku IF. |
Comment must start on a new line and inline comments are not supported | # przed ; instrukcji albo po warunku IF lub WHILE. |
Comparison with NaN is always false. Use the IsNaN method to check for NaN value. | x = NaN — użyj ISNAN(x). |
Couldn't unescape X | Pojedynczy ukośnik wsteczny w tekście; napisz "C:\\data". |
Too many characters in char literal | Tekst w pojedynczych cudzysłowach, taki jak 'ab'; tekst wymaga podwójnych cudzysłowów. |
Variable name must start with letter, Only letters or numbers are allowed in variable name | Nazwa taka jak 1x lub my_value. |
Variable must have initial value provided | VAR x; — podaj wartość albo zadeklaruj typ: int x;. |
Błędy wykonania
| Komunikat | Przyczyna i rozwiązanie |
|---|---|
Division by zero | Zobacz Dzielenie przez zero. |
Specified argument was out of the range of valid values. | PARSETEXT znalazł lewy wzorzec, ale nie prawy. Najpierw sprawdź przez INDEXOF. |
PARSEJSON - Element not found: 'X' | JSONPath niczego nie dopasował. Przekaż TRUE jako trzeci argument, aby zamiast tego dostać Null. |
Operator 'X' not defined for 'A' and 'B' | Operacja na niezgodnych typach, na przykład arytmetyka z Null. Najpierw sprawdź przez ISNULL. |
Cannot cast 'A' to 'B' | Wartość typu, którego nie da się przekonwertować, na przykład tekst tam, gdzie potrzebna jest liczba. |
Can not directly set value to device variable | Przypisanie do wartości urządzenia poza smart rule Skrypt. |
More than 1 000 000 loops, stopping loop | Pętla WHILE lub DO, która się nie kończy. |
Cannot use BREAK() outside of WHILE or DO-WHILE | BREAK poza pętlą; tak samo CONTINUE. |
Interval 'X' is out of range (0-10000) | SLEEP z ujemnym interwałem lub dłuższym niż 10 000 ms. |
Maximum array length is 2048 | BYTECOLLECTION z tekstu szesnastkowego dłuższego niż 2048 bajtów. |
Invalid array length. Must be greater than 0 and less than or equal 2048 | BYTECOLLECTION z liczbą bajtów 0 lub większą niż 2048. |
UINT16COLLECTION: count must be between 1 and 2048 | UINT16COLLECTION, lub BOOLCOLLECTION z własną nazwą, z liczbą elementów poza 1 – 2048. |
GETBIT - bit must be between 0 and 15 | Bit lub bajt poza typem wartości, tutaj wartości 16-bitowej. |
GETBIT - value X is out of the 32-bit range (-2147483648 .. 4294967295) | Wartość dziesiętna, która nie jest 32-bitową liczbą całkowitą. |
Return value 'X' does not match required return type constraint: 'T' | Skrypt odczytu urządzenia zwrócił typ, którego wartość urządzenia nie może przechować. |
Response is too long (Nbytes). Maximum supported length is 128KB | Odpowiedź HTTP większa niż 128 kB. |
Invalid register number: X | Rejestr Modbus poza zakresem 0 do 65535. |
RegisterValueToWrites: Can't write double.NaN to modbus register | NaN zapisane przez MODBUSW. |
Błędy kontekstu i wersji
| Komunikat | Przyczyna i rozwiązanie |
|---|---|
X function not supported here. | Funkcja nie działa w tym rodzaju skryptu, na przykład ADDERROR function not supported here. w smart rule. |
SLEEP function not allowed in this context. | SLEEP w smart rule Skrypt lub w skrypcie powiadomienia. |
ModbusFunction - unknown modbus device to work with | Funkcja Modbus poza skryptem Modbus. |
PacketParserFunction - PacketParserContext is null | Funkcja Packet parser poza skryptem Packet parser. |
DEBOUNCE - invalid argument, must be a device variable | Pierwszy argument DEBOUNCE jest wyrażeniem, a nie wartością urządzenia. |
DEBOUNCE - Function is not available | DEBOUNCE w skrypcie bez wartości urządzeń, na których DEBOUNCE może działać. |
X function not supported. Please update your core unit to be able to use this feature. | Core jest starszy niż funkcja. |
Data type 'X' not supported. Please update your core unit to be able to use this feature. | Słowo kluczowe typu nowsze niż Core. |
Modbus data type 'X' not supported. Please update your core unit to be able to use this feature. | Int64, UInt64 lub Double na Core starszym niż 2026.1, kompilacja 40595. |
Której kompilacji wymaga każda funkcja, opisuje strona Wymagania wersji skryptów.