<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Recipe automatically save</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/</id><updated>2020-02-27T13:50:49.910000Z</updated><subtitle>Recent posts to Recipe automatically save</subtitle><entry><title>Recipe automatically save</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/?limit=25#3cde" rel="alternate"/><published>2020-02-27T13:50:49.910000Z</published><updated>2020-02-27T13:50:49.910000Z</updated><author><name>marks</name><uri>https://forge.codesys.com/u/marks/</uri></author><id>https://forge.codesys.com99ec15b04a6f4680f41505bd16361d3602589003</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I didn't use recipes..&lt;/p&gt;
&lt;p&gt;But, I did find where someone had posted enough information about saving retentive memory that I was able to get store / restore working around startup.. it was necessary as we've written apps on the raspberry pi..&lt;/p&gt;
&lt;p&gt;It could use a little 'clean up', but its getting the job done. Notice also that I use it to initiate a controlled shutdown rather than just powering off the device.&lt;/p&gt;
&lt;p&gt;I created a separate task, which runs this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;PROGRAM&lt;/span&gt; &lt;span class="nv"&gt;persistentStorage&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;command1&lt;/span&gt;       : &lt;span class="nv"&gt;STRING&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sudo halt&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;stdout&lt;/span&gt;          : &lt;span class="nv"&gt;STRING&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
   &lt;span class="nb"&gt;result&lt;/span&gt;          : &lt;span class="nv"&gt;RTS_IEC_RESULT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;doRetain&lt;/span&gt;              : &lt;span class="nv"&gt;FB_AppRetain&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;T_restoreAlarm&lt;/span&gt;           : &lt;span class="nv"&gt;TON&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;doSync&lt;/span&gt;         : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="nv"&gt;save&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;retained&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;disk&lt;/span&gt;: &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;codesys&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;PlcLogic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;estacada&lt;/span&gt;.&lt;span class="nv"&gt;ret&lt;/span&gt;
&lt;span class="nv"&gt;doRetain&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;   &lt;span class="nv"&gt;store&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doSavePersist&lt;/span&gt;,
         &lt;span class="nv"&gt;restore&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt;,
         &lt;span class="nv"&gt;shutdown&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doShutDown&lt;/span&gt;,
         &lt;span class="nv"&gt;busy&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmBusy&lt;/span&gt;,
         &lt;span class="nv"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmDone&lt;/span&gt;,
         &lt;span class="nv"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmError&lt;/span&gt;,
         &lt;span class="nb"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmResult&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Save&lt;/span&gt; &lt;span class="nv"&gt;retained&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;complete&lt;/span&gt;, &lt;span class="nv"&gt;sync&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;system&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;SD&lt;/span&gt; &lt;span class="nv"&gt;Card&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doSavePersist&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmDone&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmError&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doSavePersist&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;doSync&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmDone&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;restore&lt;/span&gt; &lt;span class="nv"&gt;persistent&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;upon&lt;/span&gt; &lt;span class="nv"&gt;startup&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;iPersistState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Restore&lt;/span&gt; &lt;span class="nv"&gt;retained&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;complete&lt;/span&gt;, &lt;span class="nv"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;system&lt;/span&gt; &lt;span class="nv"&gt;know&lt;/span&gt; &lt;span class="nv"&gt;it&lt;/span&gt; &lt;span class="nv"&gt;can&lt;/span&gt; &lt;span class="nv"&gt;proceed&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;pmDone&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;iPersistState&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;Attention&lt;/span&gt;: &lt;span class="nv"&gt;allow&lt;/span&gt; &lt;span class="nv"&gt;shell&lt;/span&gt; &lt;span class="nv"&gt;commands&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;CODESYSControl&lt;/span&gt;.&lt;span class="nv"&gt;cfg&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;presently&lt;/span&gt; &lt;span class="nv"&gt;AllowAll&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;doSync&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;doSync&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;command1&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sudo sync&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
   &lt;span class="nv"&gt;SysProcess&lt;/span&gt;.&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pszCommand&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;command1&lt;/span&gt;, &lt;span class="nv"&gt;pszStdOut&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;stdout&lt;/span&gt;, &lt;span class="nv"&gt;udiStdOutLen&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SIZEOF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;stdout&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="nv"&gt;pResult&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;result&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;Attention&lt;/span&gt;: &lt;span class="nv"&gt;allow&lt;/span&gt; &lt;span class="nv"&gt;shell&lt;/span&gt; &lt;span class="nv"&gt;commands&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;CODESYSControl&lt;/span&gt;.&lt;span class="nv"&gt;cfg&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doShutDown&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doSavePersist&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doShutDown&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;command1&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sudo halt&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="c1"&gt;;   &lt;/span&gt;
   &lt;span class="nv"&gt;SysProcess&lt;/span&gt;.&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pszCommand&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;command1&lt;/span&gt;, &lt;span class="nv"&gt;pszStdOut&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;stdout&lt;/span&gt;, &lt;span class="nv"&gt;udiStdOutLen&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SIZEOF&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;stdout&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="nv"&gt;pResult&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;result&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Signal&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;alarm&lt;/span&gt; &lt;span class="nv"&gt;processing&lt;/span&gt; &lt;span class="nv"&gt;that&lt;/span&gt; &lt;span class="nv"&gt;restore&lt;/span&gt; &lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="nv"&gt;failed&lt;/span&gt;
&lt;span class="nv"&gt;T_restoreAlarm&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;IN&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt;, &lt;span class="nv"&gt;PT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;T&lt;/span&gt;&lt;span class="sc"&gt;#3&lt;/span&gt;&lt;span class="nv"&gt;S&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;T_restoreAlarm&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;doRestorePersist&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;GVL&lt;/span&gt;.&lt;span class="nv"&gt;iPersistState&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="c1"&gt;;   // lie after warning the operator&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The function block that it calls is this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt;  &lt;span class="nv"&gt;FB_AppRetain&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
   &lt;span class="nv"&gt;store&lt;/span&gt;            : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;restore&lt;/span&gt;         : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;shutdown&lt;/span&gt;         : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR_OUTPUT&lt;/span&gt;
   &lt;span class="nv"&gt;done&lt;/span&gt;            : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;busy&lt;/span&gt;            : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;error&lt;/span&gt;            : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nb"&gt;result&lt;/span&gt;         : &lt;span class="nv"&gt;RTS_IEC_RESULT&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;
   &lt;span class="nv"&gt;fbDelete&lt;/span&gt;            : &lt;span class="nv"&gt;FILE&lt;/span&gt;.&lt;span class="nv"&gt;Delete&lt;/span&gt;&lt;span class="c1"&gt;; (* Function block to delete the file *)&lt;/span&gt;
    &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;The&lt;/span&gt; &lt;span class="nv"&gt;retain&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;.&lt;span class="nv"&gt;ret&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;placed&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;directory&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;bootproject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
   &lt;span class="nv"&gt;sFileName&lt;/span&gt;           : &lt;span class="nv"&gt;STRING&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/var/opt/codesys/PlcLogic/Application/estacada.ret&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;pApp&lt;/span&gt;            : &lt;span class="nv"&gt;POINTER&lt;/span&gt; &lt;span class="nv"&gt;TO&lt;/span&gt; &lt;span class="nv"&gt;APPLICATION&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;step&lt;/span&gt;            : &lt;span class="nv"&gt;INT&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;R_store&lt;/span&gt;            : &lt;span class="nv"&gt;R_TRIG&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;R_restore&lt;/span&gt;         : &lt;span class="nv"&gt;R_TRIG&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;F_store&lt;/span&gt;            : &lt;span class="nv"&gt;F_TRIG&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;F_restore&lt;/span&gt;         : &lt;span class="nv"&gt;F_TRIG&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;RETAIN&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;saved&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;codesys&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;PlcLogic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;estacada&lt;/span&gt;.&lt;span class="nv"&gt;ret&lt;/span&gt;
&lt;span class="nv"&gt;R_store&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;CLK&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;R_restore&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;CLK&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;restore&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;F_store&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;CLK&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;F_restore&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;CLK&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;restore&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;finished&lt;/span&gt;, &lt;span class="nv"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;aborted&lt;/span&gt;?
&lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;F_store&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;F_restore&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;busy&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;error&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;done&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_IF&lt;/span&gt;
&lt;span class="nv"&gt;CASE&lt;/span&gt; &lt;span class="nv"&gt;step&lt;/span&gt; &lt;span class="nv"&gt;OF&lt;/span&gt; 
   
   &lt;span class="mi"&gt;0&lt;/span&gt;:   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;begin&lt;/span&gt; &lt;span class="nv"&gt;retained&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;R_store&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;restore&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;shutdown&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;busy&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;error&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;done&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;restore&lt;/span&gt; &lt;span class="nv"&gt;retained&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;R_restore&lt;/span&gt;.&lt;span class="nv"&gt;Q&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;NOT&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="nv"&gt;shutdown&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;busy&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;error&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;done&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   &lt;span class="mi"&gt;10&lt;/span&gt;: &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;   &lt;span class="nv"&gt;First&lt;/span&gt; &lt;span class="nv"&gt;delete&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;retain&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;.
            &lt;span class="nv"&gt;This&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;necessary&lt;/span&gt;, &lt;span class="nv"&gt;because&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;function&lt;/span&gt; &lt;span class="nv"&gt;AppStoreRetainsInFile&lt;/span&gt; &lt;span class="nv"&gt;appends&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="nv"&gt;at&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;. &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;fbDelete&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;xExecute&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;TRUE&lt;/span&gt;, &lt;span class="nv"&gt;sFileName&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;sFileName&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;    &lt;span class="nv"&gt;fbDelete&lt;/span&gt;.&lt;span class="nv"&gt;xDone&lt;/span&gt;
         &lt;span class="nv"&gt;OR&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;fbDelete&lt;/span&gt;.&lt;span class="nv"&gt;xError&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;fbDelete&lt;/span&gt;.&lt;span class="nv"&gt;eError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;File&lt;/span&gt;.&lt;span class="nv"&gt;Error&lt;/span&gt;.&lt;span class="nv"&gt;NOT_EXIST&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
   
         &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;Attention&lt;/span&gt;: &lt;span class="nv"&gt;It&lt;/span&gt; &lt;span class="nv"&gt;takes&lt;/span&gt; &lt;span class="nv"&gt;at&lt;/span&gt; &lt;span class="nv"&gt;least&lt;/span&gt; &lt;span class="nv"&gt;one&lt;/span&gt; &lt;span class="nv"&gt;cycle&lt;/span&gt; &lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="nv"&gt;xDone&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;TRUE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
         &lt;span class="nv"&gt;fbDelete&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;xExecute&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;;   // file gone, replace it with a fresh copy&lt;/span&gt;
      &lt;span class="nv"&gt;ELSIF&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;fbDelete&lt;/span&gt;.&lt;span class="nv"&gt;xError&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nv"&gt;fbDelete&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;xExecute&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="c1"&gt;;   // file delete failed ugly&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
      
   &lt;span class="mi"&gt;12&lt;/span&gt;:   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;Now&lt;/span&gt;, &lt;span class="nv"&gt;it&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the time to save the retains. *)&lt;/span&gt;
      &lt;span class="nv"&gt;pApp&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;AppGetCurrent&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pResult&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;result&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;pApp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;Store&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;variables&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
         &lt;span class="nb"&gt;result&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;AppStoreRetainsInFile&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pApp&lt;/span&gt;,&lt;span class="nv"&gt;sFileName&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;error&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;busy&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;done&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;ELSE&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;
   
   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;some&lt;/span&gt; &lt;span class="nv"&gt;step&lt;/span&gt; &lt;span class="nv"&gt;along&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;way&lt;/span&gt; &lt;span class="nv"&gt;failed&lt;/span&gt;
   &lt;span class="mi"&gt;14&lt;/span&gt;:      &lt;span class="nv"&gt;error&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;busy&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;done&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         
   &lt;span class="mi"&gt;20&lt;/span&gt;:   &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;   &lt;span class="nv"&gt;Restore&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;Retain&lt;/span&gt; &lt;span class="nv"&gt;Variables&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;.
         &lt;span class="k"&gt;For&lt;/span&gt; &lt;span class="nv"&gt;storing&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;restoring&lt;/span&gt;, &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;same&lt;/span&gt; &lt;span class="nv"&gt;pointer&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;application&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pApp&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;must&lt;/span&gt; &lt;span class="nv"&gt;be&lt;/span&gt; &lt;span class="nv"&gt;used&lt;/span&gt;.&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
      &lt;span class="nv"&gt;pApp&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;AppGetCurrent&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pResult&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;result&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;pApp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt;
         &lt;span class="nb"&gt;result&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;AppRestoreRetainsFromFile&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pApp&lt;/span&gt;, &lt;span class="nv"&gt;sFileName&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;error&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;busy&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;done&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;ELSE&lt;/span&gt;
         &lt;span class="nv"&gt;step&lt;/span&gt;   :&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;END_IF&lt;/span&gt;      
   
&lt;span class="nv"&gt;END_CASE&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry><entry><title>Recipe automatically save</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/?limit=25#e3b8" rel="alternate"/><published>2020-02-27T13:50:49.779000Z</published><updated>2020-02-27T13:50:49.779000Z</updated><author><name>alex87</name><uri>https://forge.codesys.com/u/alex87/</uri></author><id>https://forge.codesys.com56b41027bb7ee3f5d238b2ae8fc09c20d923a545</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Anyone?&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Recipe automatically save</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/?limit=25#e37f" rel="alternate"/><published>2020-02-27T13:50:49.334000Z</published><updated>2020-02-27T13:50:49.334000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com8dd0e0279c6eb269d91c50a5ca4947641c984063</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; crthomas1234&lt;/p&gt;
&lt;p&gt;I am also interested in the answer to Alex's question.&lt;/p&gt;
&lt;p&gt;The PLC I use does not have a lot of persistent retain memory, so I use the recipe system to backup and restore system parameters on a machine power cycle.  This is also really helpful during the development stage when you are making a lot of changes to the PLC and a full download erases your retain memory.&lt;/p&gt;
&lt;p&gt;What we have done for now is to create a function block and reads the name of each variable in the recipe file and then use the IEC Var Access library to request that variable's value by its name.  I can then walk through the entire recipe file and if any value has changed, I can initiate the recipe save.  I did this because if you were to just save the recipe file every minute or so, you would eventually render the flash memory in the controller unusable due to the limited number of writes you can have.&lt;/p&gt;
&lt;p&gt;The downside of this method is that you cannot actually get the actual variable name from the recipe.  Instead, there is a column for the user to type in their own descriptive name which can be accessed through the IEC program.  So for every variable that I add to the recipe system, I must copy and paste the variable name including the full path in the "name" column of the recipe file for this to work.  And since you can't copy/paste in the recipe editor or export to some sort of text file, this is very labor intensive in the beginning.&lt;/p&gt;
&lt;p&gt;I would love to ask an extension to the RecipeManCommand function block that would automate looking at the values or the recipe file versus the current values to know if they are different so you can initiate the save.&lt;/p&gt;
&lt;p&gt;The save changes to recipes option Alex mentioned sounds like it would do this, but I think it is for something different such as actual changes to the definition, not the actual recipe values.  &lt;/p&gt;
&lt;p&gt;I have read the help files over and over again trying to understand how the recipe system works.  It sort of makes sense to me and through a lot of trial and error, I have gotten the system to work as I need it too.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Recipe automatically save</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/ed223bedb3/?limit=25#155d" rel="alternate"/><published>2020-02-27T13:50:49.187000Z</published><updated>2020-02-27T13:50:49.187000Z</updated><author><name>alex87</name><uri>https://forge.codesys.com/u/alex87/</uri></author><id>https://forge.codesys.comfbedc6d2992d23c30a7ebfa402307bb3baa4ffc4</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Why does function "Save recipe changes to files automatically" NOT work? What is the sense of this function and how is ment to be used.&lt;/p&gt;
&lt;p&gt;I have solved my way by setting timer every 60sec to save variables to current file.&lt;br/&gt;
via:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;RecipeManCommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadRecipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sRecipeDef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cRecipe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It works but is anoying and when unsuspected shutdown happens right in middle saving writes 000 to file.&lt;/p&gt;
&lt;p&gt;how to handle auto save variables?&lt;/p&gt;
&lt;p&gt;BR&lt;br/&gt;
Alex&lt;/p&gt;
&lt;p&gt;&lt;img alt="IMG: recipe1_save.png" rel="nofollow" src="https://forum.codesys.com//download/file.php?id=1509"/&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>