Tom SW Mosaic 6. 5. 2022 14:40 6. 5. 2022 14:40

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

M.B. 3. 2. 2022 8:04

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.

Jindra AC Metelka 23. 3. 2022 13:53

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

 

M.B. 6. 5. 2022 14:40

Ve verzi 1.4 knihovny jsou délky řetězců opraveny. Knihovna je dostupná přes Mosaic Update.

Tento dotaz je vyřešený.