Dobrý den.
Překladač nekontroluje správně délku řetězce při inicializaci a pak to dělá psí kusy při zobrazení na webu a ve funkcích pro práci s řetězem. Nejspíš mu tam pak chybí znak konce řetězce. Zkuste si následující příklad.
Do řetězec4 se pak míto '1234567890x' uloží '1234567890xtest'. Funkce spojení nenarazí na konec řetězce a pokračuje v paměti dále.
Webmaker zobrazí pak hodnotu retezec2 jako '67890x', ale web zobrazí retezec2 jako '67890xtest'. Opět pokračuje v paměti dále.
Tato "vlastnost" už je v mosaicu docela dlouho. Jen jsem se k tomu nedostal to zkoumat. Mám v projektech hodně předdefinovaných řetězců s různými názvy a kódy různých čidel a tak. Různé délky třeba i 30 znaků max a pokud tam napíši 31, překladač mě neupozorní a pak to dělá problémy. V některých situacích třeba v takovém případě vůbec nenajede webová stránka atd.
Vzorový příklad v příloze.
PROGRAM prgMain
VAR
retezec1 : STRING[5] := '12345';
retezec2 : STRING[5] := '67890x';
retezec3 : STRING[5] := 'test';
retezec4 : STRING[20] := '';
END_VAR
//*******************************************
retezec4 := CONCAT(IN1 := retezec1, IN2 := retezec2);
END_PROGRAM
Odpovědi 3
Dobrý den,
děkujeme za hlášení chyby a omlouváme se za způsobené potíže, Mosaic opravdu kontroluje délku řetězce proti délce datové oblasti místo délky využitelného místa. Tím může dojít v případech, že je délka přesáhnuta přesně o jedna k přepsání koncové nuly, kterou ostatní funkce využívají k detekci konce řetězce.
Chybu opravíme, co nejdříve.
Dobrý den ,
nevím, jestli to souvisí, ale v nové verzi 2022.1 mi nejde přeložit program s chybou špatně inicializované délky pro proměnné v poli pro OpenThermLib ve funkci GetProcessErrFlagCz.
Výpis okna zpráv: 23.03.2022 10:26:34
=======================================================
0 :[ST:Chyba] Sysgen\RD_NJ_ST_03.mlh (11676): Příliš dlouhý řetězec
... odkazuje na řádek v definici GetProcessErrFlagCz , stejně to dělá i pro En verzi funkce . Mám kdysi od vás zdrojový kód této knihovny, a když jsem zvětšil délku na [23], tak již překlad proběhl bez chyby.
__DECL FUNCTION GetProcessErrFlagCz : string
(*in_diag_code : UINT; servisní kód
END_VAR HB=chybove priznaky: masky jednotlivých příznaků*)
.....
16#0100]; (*b5 = water over-temp*)
errorMessages : ARRAY [1..6] OF string [22] := [' Přehřátá voda,', //k masce odpovidajici zpravy priznaku
' Porucha tlaku vzduchu,',
' Porucha plynu/hořáku,',
' Nízký tlak vody,',
' Uzamčení/reset,',
' Požadavek na servis']; (*k masce odpovidajici zpravy priznaku*)
END_VAR
END_FUNCTION
Ve verzi 1.4 knihovny jsou délky řetězců opraveny. Knihovna je dostupná přes Mosaic Update.
Tento dotaz je vyřešený.