Jaké jsou možné příčiny chyby 9380 u Foxtrot CP-1001?

<< < (2/2)

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