сохраняй просто в файл и обратно считывай
+ CmpChecksum.lib
Просто вызываешь данный блок в программе и все Retain сохраняются в файл а при запуске берутся из него (это для Codesys V3 для Raspberry PI)
PROGRAM RetainManager
VAR_INPUT
RetainFilePathName : STRING := '/tmp/extend/pccard/SD_MMC0_1/Retain';
SaveFilterTime : TIME := T#5S;
ForceSave : BOOL;
END_VAR
VAR
Init: BOOL;
pRetainFilePathName : POINTER TO STRING;
pCurrentApp : POINTER TO APPLICATION;
RetainAreaSize: __XWORD;
pRetainArea: POINTER TO BYTE;
dwCRCSave: DWORD;
dwCRC: DWORD;
TOF1 : TOF := (PT := SaveFilterTime);
R_TRIG1: R_TRIG;
END_VAR
VAR_OUTPUT
RTSIECResult : RTS_IEC_RESULT;
AttemptSaveCounter: INT;
END_VAR
IF NOT Init THEN
pCurrentApp := AppGetCurrent(ADR(RTSIECResult));
IF RTSIECResult<>0 THEN RETURN; END_IF
RetainAreaSize := AppGetAreaSize(pApp:= pCurrentApp, uiType:= DA_RETAIN, pResult:= ADR(RTSIECResult));
IF RTSIECResult<>0 THEN RETURN; END_IF
pRetainArea := AppGetAreaAddress(pApp:= pCurrentApp, uiType:= DA_RETAIN, pResult:= ADR(RTSIECResult));
IF RTSIECResult<>0 THEN RETURN; END_IF
IF LEN(RetainFilePathName) <> 0 THEN
pRetainFilePathName := ADR(RetainFilePathName);
ELSE
pRetainFilePathName := ADR(pCurrentApp^.szName);
END_IF
RTSIECResult := AppRestoreRetainsFromFile(pCurrentApp, pRetainFilePathName^);
CASE RTSIECResult OF
0: // #define ERR_OK 0x0000
16#1E: // #define ERR_SIGNATURE_MISMATCH 0x001E /* Signature mismatch of an api function */
16#32: // #define ERR_FILE_ERROR 0x0032 /* File error. e.g. cannot open a file for writing because it could be write protected */
ELSE RETURN;
END_CASE
dwCRCSave := CRC32Finish(ulCRC:= CRC32Update(ulCRC:= CRC32Init(), pData:= pRetainArea, ulSize:= RetainAreaSize));
Init := TRUE;
END_IF
R_TRIG1(CLK := ForceSave);
dwCRC := CRC32Finish(ulCRC:= CRC32Update(ulCRC:= CRC32Init(), pData:= pRetainArea, ulSize:= RetainAreaSize));
IF dwCRC <> dwCRCSave OR R_TRIG1.Q THEN
IF NOT TOF1.Q OR R_TRIG1.Q THEN
RTSIECResult := AppStoreRetainsInFile(pCurrentApp, pRetainFilePathName^); // записасать в файл
IF RTSIECResult = 0 THEN
dwCRCSave := dwCRC;
END_IF
AttemptSaveCounter := AttemptSaveCounter + 1;
TOF1(IN := TRUE);
END_IF
END_IF
IF TOF1.Q THEN
TOF1(IN := FALSE);
END_IF