TapHome

Tekst i kolekcje

Funkcje skryptowe TapHome dla tekstów, kolekcji i tablic bajtów — LENGTH, GETAT, SETAT, APPEND, INSERT, REMOVEAT, COPY, INDEXOF, REPLACE, SPLIT, COMPARE, BYTECOLLECTION, UINT16COLLECTION, BOOLCOLLECTION.

Te funkcje przyjmują jako pierwszy argument tekst lub kolekcję i pracują ze znakami lub elementami według indeksu liczonego od zera.

  • Kolekcja jest zmieniana na miejscu przez APPEND, INSERT, REMOVEAT, SETAT i REPLACE, które zwracają tę samą kolekcję. Dla tekstu zwracają nowy tekst.
  • Blob, na przykład RECEIVEDMSG.PAYLOAD, przyjmują tylko LENGTH, GETAT, COPY i INDEXOF.
  • Pierwszy argument Null zatrzymuje skrypt komunikatem Parameter 1 is null, z wyjątkiem LENGTH (0), INDEXOF (-1) i SPLIT (pusta kolekcja); COMPARE zgłasza COMPARE arguments 1 and 2 must be strings.

ENCODE i DECODE (XML, Base64) są na stronie Konwersje typów danych, EQUALS na stronie Logika i diagnostyka. Typy kolekcji opisuje strona Typy danych.

LENGTH

LENGTH zwraca liczbę znaków tekstu, elementów kolekcji lub bajtów bloba; dla liczby zwraca rozmiar jej typu w bajtach, a dla Null 0.

LENGTH("Hello World");
# Result: 11
LENGTH(40);
# Result: 8 (a decimal literal is a double)
LENGTH(BYTECOLLECTION("010203"));
# Result: 3

GETAT

GETAT zwraca element o podanym indeksie: char tekstu, element kolekcji lub bajt bloba.

1
GETAT(value, index)

Zwraca — dla tekstu char, a nie jednoliterowy tekst; porównuj go z literałem znakowym, takim jak 'l'.

GETAT("Hello", 2);
# Result: 'l' (Char)
GETAT({1, 2, 4}, 2);
# Result: 4

SETAT

SETAT zastępuje element o podanym indeksie; kolekcja jest zmieniana na miejscu, w tekście znak o podanym indeksie jest zastępowany tekstem newValue.

1
SETAT(value, index, newValue)
SETAT("Hello", 1, "a");
# Result: "Hallo"
SETAT("Hello", 4, "o World");
# Result: "Hello World"
VAR c := {1, 2, 4};
SETAT(c, 2, 3);
# Result: {1, 2, 3}, and c is now {1, 2, 3}

APPEND

APPEND dodaje wartość na końcu tekstu lub kolekcji; kolekcja jest zmieniana na miejscu i zwracana, a nie kopiowana.

1
APPEND(value, what)

Uwagi — Dopisanie kolekcji o tym samym typie elementu dodaje wszystkie jej elementy. Pojedyncza wartość jest dodawana jako jeden element. Kolekcja o innym typie elementu to błąd (Cannot append ‘UInt8’ collection to ‘Double’ collection).

VAR c := {1, 2};
APPEND(c, 3);
# Result: {1, 2, 3}, and c is now {1, 2, 3}
APPEND(c, {4, 5});
# Result: {1, 2, 3, 4, 5}
APPEND("abc", "def");
# Result: "abcdef"

INSERT

INSERT wstawia wartość na podanym indeksie: podciąg do tekstu albo element do kolekcji na miejscu.

1
INSERT(value, index, what)
INSERT("Hello", 5, " World");
# Result: "Hello World"
INSERT("Hello", 1, "i");
# Result: "Hiello"
INSERT({1, 2, 4}, 2, 3);
# Result: {1, 2, 3, 4}

REMOVEAT

REMOVEAT usuwa count znaków lub elementów, domyślnie 1, począwszy od podanego indeksu.

1
2
REMOVEAT(value, index)
REMOVEAT(value, index, count)
REMOVEAT("Hello", 1);
# Result: "Hllo"
REMOVEAT("Hello", 3, 2);
# Result: "Hel"
REMOVEAT({1, 2, 3, 4}, 2, 2);
# Result: {1, 2}

COPY

COPY zwraca nowy tekst, kolekcję lub blob z length elementami od pozycji from; bez length kopiuje do końca, bez from całą wartość.

1
2
3
COPY(value)
COPY(value, from)
COPY(value, from, length)
COPY("Hello World", 2);
# Result: "llo World"
COPY("Hello World", 2, 4);
# Result: "llo "
COPY(BYTECOLLECTION("01020304"), 2, 1);
# Result: {0x03}

Błędy — Parameter 1 must be a non-empty string przy kopiowaniu z pustego tekstu.

INDEXOF

INDEXOF zwraca pozycję pierwszego wystąpienia wartości w tekście, kolekcji lub blobie albo -1, gdy jej nie znaleziono.

1
INDEXOF(value, what)
INDEXOF("Hello World", "Wor");
# Result: 6
INDEXOF("Hello World", "or12");
# Result: -1
INDEXOF(BYTECOLLECTION("ab cd ee ff 01 02"), 2);
# Result: 5

Błędy — Parameter 2 must be a non-empty string przy szukaniu pustego tekstu w tekście.

REPLACE

REPLACE zastępuje każde wystąpienie wartości: tekst daje nowy tekst, w kolekcji pasujące elementy są zastępowane na miejscu.

1
REPLACE(value, what, replacement)
REPLACE("Hello", "l", "");
# Result: "Heo"
REPLACE("Hello", "lo", "22");
# Result: "Hel22"
REPLACE(BYTECOLLECTION("050607"), 5, 9);
# Result: {0x09, 0x06, 0x07}

Błędy — Empty string to replace, gdy what jest pustym tekstem.

SPLIT

SPLIT dzieli tekst przy każdym separatorze i zwraca collection<string>; puste części są zachowywane.

1
SPLIT(string, separator)

Parametry — separator to char, tekst, collection<char> lub collection<string>.

SPLIT("1;2;3;4", ";");
# Result: {"1", "2", "3", "4"}
SPLIT("1;2;3.4", "2;");
# Result: {"1;", "3.4"}
SPLIT("1;2;3.4", {"2", "3."});
# Result: {"1;", ";", "4"}

COMPARE

COMPARE porównuje dwa teksty i zwraca liczbę ujemną, gdy pierwszy w sortowaniu jest przed drugim, 0, gdy są równe, i liczbę dodatnią, gdy jest po nim; polegaj tylko na znaku, a nie na wielkości.

1
2
COMPARE(string1, string2)
COMPARE(string1, string2, CompareOptions)

Uwagi — Bez opcji jednostka sterująca zwraca różnicę kodów pierwszych różniących się znaków, więc wielkie litery są sortowane przed małymi. Z CompareOptions (IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal, None) teksty są porównywane według reguł językowych kultury niezmiennej (invariant culture), takich samych na każdej jednostce sterującej, zmodyfikowanych tymi opcjami.

COMPARE("abc", "abc");
# Result: 0
COMPARE("abc", "ABC");
# Result: 32
COMPARE("a", "c");
# Result: -2
COMPARE("abc", "ABC", CompareOptions.IgnoreCase);
# Result: 0

Błędy — COMPARE arguments 1 and 2 must be strings.

BYTECOLLECTION

BYTECOLLECTION tworzy collection<uint8> z tekstu z cyframi szesnastkowymi albo wypełnioną podaną liczbą bajtów zerowych (1 – 2048).

1
2
BYTECOLLECTION(hexString)
BYTECOLLECTION(count)

Uwagi — Znaki tekstu, które nie są cyframi szesnastkowymi, są ignorowane, więc bajty mogą oddzielać spacje, przecinki i myślniki; liczba pozostałych cyfr musi być parzysta.

BYTECOLLECTION("00 0A FF");
# Result: {0x00, 0x0A, 0xFF}
BYTECOLLECTION("aa, be1-1,fe");
# Result: {0xAA, 0xBE, 0x11, 0xFE}
BYTECOLLECTION(6);
# Result: 6 zero bytes

Błędy — Parameter must be a non-empty string; Length must be a multiple of 2; Maximum array length is 2048; Invalid array length. Must be greater than 0 and less than or equal 2048.

UINT16COLLECTION

UINT16COLLECTION tworzy collection<uint16> z 1 – 2048 zer, zwykle wypełnianą funkcją PACKVALUE i zapisywaną do rejestrów Modbus funkcją MODBUSWBLOCK.

collection<uint16> regs := UINT16COLLECTION(4);
PACKVALUE(regs, 0, BigEndianFloat, 21.5);
PACKVALUE(regs, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, regs);

Dostępność — Core 2026.1, kompilacja 39001 i nowsze.

Zobacz też — Dane binarne, Funkcje Modbus.

BOOLCOLLECTION

BOOLCOLLECTION tworzy collection<bool> z 1 – 2048 wartości FALSE, zwykle do zapisu cewek Modbus funkcją MODBUSWBLOCK.

collection<bool> coils := BOOLCOLLECTION(8);
SETAT(coils, 0, TRUE);
MODBUSWBLOCK(C, 0, coils);

Dostępność — Core 2026.1, kompilacja 39001 i nowsze.