这是一个简单的项目,可以向您展示功能块内的 PERSISTENT 数据确实可以保存。
声明一个测试结构:
TYPE ST_DataToBePersistent :
STRUCT
bVar : BOOL;
nVar : INT;
fVar : REAL;
END_STRUCT
END_TYPE
现在声明一个功能块,FB_Test 使用该结构作为内部参数集。将 FB_WritePersistentData 添加为 VAR_IN_OUT。我们需要调用它来保存这个功能块内的持久数据。
FUNCTION_BLOCK FB_Test
VAR PERSISTENT
arrPersistentParameterStruct : ARRAY [0..10] OF ST_DataToBePersistent;
END_VAR
VAR_IN_OUT
fbWritePersistentData : FB_WritePersistentData;
END_VAR
VAR
bSavePersistentData : BOOL;
END_VAR
FB的主体:
IF bSavePersistentData THEN
bSavePersistentData := FALSE;
fbWritePersistentData.START := TRUE;
END_IF
设置内部结构值的简单方法:
METHOD PUBLIC WriteToStruct
VAR_INPUT
arrPersistentParameterStruct : ARRAY[0..10] OF ST_DataToBePersistent;
END_VAR
而且是身体。当调用内部结构数组时,我们还设置了一个标志来调用传递的 FB_WritePersistentData,它将所有持久数据保存在专用端口(本地)上:
THIS^.arrPersistentParameterStruct := arrPersistentParameterStruct;
bSavePersistentData := TRUE;
实例化 2 个实例,只是为了设置数组的值并添加将在调用方法 FB_Test.WriteToStruct 时调用的 FB_WritePersistentData。还为诊断目的添加一些变量并触发方法:
PROGRAM MAIN
VAR
fbTestInstance1 : FB_Test;
fbTestInstance2 : FB_Test;
fbWritePersistentData : FB_WritePersistentData;
bSetData1 : BOOL;
bSetData2 : BOOL;
arrDataToSet : ARRAY[0..10] OF ST_DataToBePersistent;
TofPersistentDataSaved : TOF;
FtrigDataSaveComplete : F_TRIG;
bDataSaveComplete : BOOL;
END_VAR
在主体中,循环调用 fbs 和持久化数据 FB。在在线模式下将 arrDataToSet 的值设置为您想要的任何值,并触发您想要更改的功能块。保存完成后观察 bDataSaveComlete 设置为 2 秒。
fbTestInstance1(fbWritePersistentData := fbWritePersistentData);
fbTestInstance2(fbWritePersistentData := fbWritePersistentData);
IF bSetData1 THEN
bSetData1 := FALSE;
fbTestInstance1.WriteToStruct(arrPersistentParameterStruct := arrDataToSet);
END_IF
IF bSetData2 THEN
bSetData2 := FALSE;
fbTestInstance2.WriteToStruct(arrPersistentParameterStruct := arrDataToSet);
END_IF
fbWritePersistentData(NETID := '', PORT := 851);
FtrigDataSaveComplete(CLK := fbWritePersistentData.BUSY);
TofPersistentDataSaved(IN := FtrigDataSaveComplete.Q, PT := T#2S);
bDataSaveComplete := TofPersistentDataSaved.Q;
IF fbWritePersistentData.BUSY THEN
fbWritePersistentData.START := FALSE;
END_IF
例子:
fbTestInstance1 的初始状态:
现在我设置结构:
我将通过设置 bSetData1 写入 fbTestInstance:
我将为第二个 fb 设置不同的值:
现在我将启动目标机器的 TwinCAT 的重启:
重新登录,数据还是一样:
重启目标机器:
持久性数据始终正确加载到 TwinCAT 上,无论是重新启动运行时还是操作系统。
希望这能回答你的问题。正如 Jakob 已经提到的,dwpessoa 所说的仅适用于函数,因为它们占用的所有内存在释放时都会被丢弃。