,
při aktualizaci SW či přidání další funkcionality ve Foxtrotu a následném teplém startu se mi stává, že se v RETAIN proměnných objeví nesmysly. Online změny standardně vypnuty. Studený restart by zase vše vyresetoval a vše bych zase složitě nastavoval. Mohu se zeptat, jak to řešíte ostatní?. Proměnné jsou často komplexní typy, takže, jednoduché CSV zálohování by to asi neřešilo...
Pokud se nepoužívají online změny je jediná možnost nové proměnné přidávat na konec RETAIN zóny, aby byly zachovány adresy již existujicích proměnných. Překladač přiřazuje paměť lineárně, takže to, co je poslední v textu je na konci zóny (výjimkou jsou proměnné s pevně přidělenou adresou).
Pokud je třeba udělat změnu ve strukturách nebo proměnných, které nelze umístit na konec zóny nebo vypustit existující proměnné, nezbývá než před započetím úprav online změny zapnout.
Dalsi moznosti by melo byt pouziti DataBoxu.
Na konci scanu dulezita data vzdy ulozit do DataBaxu a pri startu PLC je nacist.
Ale posledne mi padlo PLC do stopu a pak jsem se k tomu nedostal, tak nevim, jestli to neni slepa ulicka.
Quote from: Milan Bydžovský on 12.12.2013, 14:05
Pokud se nepoužívají online změny je jediná možnost nové proměnné přidávat na konec RETAIN zóny, aby byly zachovány adresy již existujicích proměnných. Překladač přiřazuje paměť lineárně, takže to, co je poslední v textu je na konci zóny (výjimkou jsou proměnné s pevně přidělenou adresou).
Pokud je třeba udělat změnu ve strukturách nebo proměnných, které nelze umístit na konec zóny nebo vypustit existující proměnné, nezbývá než před započetím úprav online změny zapnout.
Uložení do databoxu má stejnou slabinu jako samotné RETAIN proměnné a to, že je třeba neměnit strukturu a umístění zálohovaných proměnných.
Toho jsem si vedom, nicmene ulozene do databoxu ma clovek vice pod kontrolou.
Dalsi moznosti je key, value list jak je implementovan v DataBoxu.
Nicmene jsem zatim nevyresil problem, proc funkce DataBox pada.
Az to vyresim, tak se tim vyresi i problem s retain.
Prikladam ukazku kodu:
function WriteToDBX_Wlreal:bool
VAR_INPUT
Name : STRING [20];
Value : LREAL;
END_VAR
VAR_TEMP
buf:Tbuffer;
srchname:string;
es:string;
done:bool;
END_VAR
buf.name:=Name;
Memcpy(length := sizeof(Value), source :=void(Value) , dest :=void(buf.params));
srchname:=Name;
(*
DataBox(
nxt := false ,
prv := false,
ins :=false ,
del :=false ,
undo := false,
clr := false,
Dbx_Adr := 0,
buffer := buf,
srchName := srchname,
errStr :=es,
done => done
);
*)
WriteToDBX_Wlreal:=done;
END_FUNCTION
PROGRAM WriteToDBX
(*Store important persistent data in DaTaBox (counters, ...)
*)
VAR_INPUT
END_VAR
VAR_IN_OUT
END_VAR
VAR
END_VAR
WriteToDBX_Wlreal('E_Comsuption_VT',R115.ElektricityComsuption_VT);
WriteToDBX_Wlreal('E_Comsuption_NT',R115.ElektricityComsuption_VT);
END_PROGRAM
Quote from: Milan Bydžovský on 13.12.2013, 21:11
Uložení do databoxu má stejnou slabinu jako samotné RETAIN proměnné a to, že je třeba neměnit strukturu a umístění zálohovaných proměnných.
A nebylo by lepší vytvořit nový druh proměnné RETAIN_SAVE, která se ukládá na SD kartu? Se zvětšující se kapacitou karty mi to přijde jako vhodné řešení, i když jsem si vědom nebezpeční počtu zápisů a tím i životnosti karet. Každý by si vyhodnotil rizika a přínos sám.
Zatím mi obvykle nezbyde nic jiného, než před změnou retain proměnných aktuální nastavení opsat do inicializací stávajících retain proměnných po startu. Nějaký čas to zabere, ale lepší než nic. Po studeném restartu vše běží jako do teď.