Jaké jsou možné příčiny chyby 9380 u Foxtrot CP-1001?
Jaroslav Kutílek:
(poklona) za vysvětlení pana Bydžovského. Uživatelské bloky jsou vnořeny max. do 3. úrovně (MainProgram -> fb části domu -> FB knihovních bloků) a jako TEMP proměnné používám pár BOOL proměnných a UINT pro FOR cykly. Hledat tedy musím v knihovních blocích, kde může být vnoření značné.
Opravdu pomáhá např. funkce pro synchronizaci času či načítání počasí "vysunout ven" do hlavního programu.
Problém asi vidím v tom, že např. FBiTimeProgWee k1 (dost náročný blok z iControl knihovny) volám ve vnořeném bloku, který si pak musí rezervovat všechny TEMP proměnné těchto FB najednou a tím zásobník přeteče. Myslel jsem, že místo zásobníku se rezervuje těsně před voláním FB a uvolňuje hned po ukončení volání FB. Tedy problém přetečení nestává jen když volání přerušuji jiným voláním.
Miroslav Krhounek:
Dobré také je zkontrolovat "Mapu uživatelských registru".
Tam je sloupeček "Velikost" kde je velikost, kterou daná instance FB/funkce potřebuje.
Také záleží jakým způsobem ve svých POU předáváte data v parametrech. Pokud nejsou nárocné struktury/pole předána "odkazem" pak si funkce musí vyhradit místo podle typu pro nakopírování hodnot. Pro ušetření místa je možné použít VAR_IN_OUT, pak se předává jen ukazatel na proměnnou. Tady je pak ale potřeba hlídat/vědět co daná POU dělá, aby nedošlo k nežádoucímu přepisu dat ;-)
Ivan Libicher:
Přesně jak píše p. Krhounek, větší data do/z POU je obecně žádoucí nepředávat pomocí VAR_INPUT ani VAR_OUTPUT, nýbrž VAR_IN_OUT !
Jen pozor, že sloupec "Velikost" v "Mapa uživatelských registrů" se týká registrů R tj. zahrnuje VAR_INPUT a VAR_OUTPUT, ale nezahrnuje VAR_TEMP.
Ivan Libicher:
Výsledek reálného testu
Kód:
TYPE T : ARRAY[1..4000] OF USINT; END_TYPE
// Pri velikosti 4000 havaruje az vnorene volani f2() z f3()
// Pri velikosti 4100 havaruje uz prvni nevnorene volani f1()
FUNCTION f1 : BOOL VAR_TEMP a: T; END_VAR END_FUNCTION
FUNCTION f2 : BOOL VAR_TEMP a: T; END_VAR END_FUNCTION
FUNCTION f3 : BOOL VAR_TEMP a: T; END_VAR f2(); END_FUNCTION
PROGRAM prgMain
f1();
f2();
f3();
END_PROGRAM
Zásobník pro VAR_TEMP se tedy, jak popsal p. Bydžovský, skutečně rezervuje jen po dobu volání odpovídající POU. Ale limit 4000+ je o dost nižší než očekávaných 6kB...
Navigace
[0] Index zpráv
[*] Předchozí strana