• Welcome to Diskuse2 Elektrika.cz. Please login or sign up.
 

Jak zabránit ztrátě dat z RETAIN proměnných?

Started by Jaroslav Antoš, 12.12.2013, 12:35

previous topic - next topic

Jaroslav Antoš

,
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...

Milan Bydžovský

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.

Slavomír Skopalík

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.

Milan Bydžovský

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.

Slavomír Skopalík

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.

Postránecký Petr

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.

Tomáš Šikýř

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ď.