VAR RETAIN PERSISTENT 的用法

Usage of VAR RETAIN PERSISTENT

我在我的家庭自动化项目中使用了 WAGO PLC PFC200。我有很多 POU,每个 POU 一个房间。每个房间都实现 IRoom 接口,并使用基本 POU 实现通用逻辑,如关闭所有灯。 对于灯光管理,我使用

我想保存 FbLatchingRelay 的状态,以防万一:断电。我希望所有在断电前关闭的灯在电源恢复时打开。

我通过在我的 POU 的 VAR RETAIN PERSISTENT 区域声明一个 FbLatchingRelay 来解决它。但是在阅读 here 之后:

如果在一个功能块中声明一个局部变量为RETAIN,CODESYS会将这个功能块的完整实例存储在Retain范围内(该功能块的所有数据);然而,只有声明的 RETAIN 变量被这样对待。

我决定更改它,以免将 RETAIN 内存浪费在 POU 中但不需要存储为 RETAIN 的一堆变量上。

所以现在我有类似的东西:

PLC_PRG:

VAR RETAIN PERSISTENT
    BathroomPersistentData: BathroomData;
END_VAR

Bathroom(PersistData := BathroomPersistentData, xMainLightSwitch := DI1_13, xMirrorLightSwitch := DI2_3, xMirrorLightSwitchActuator => DO2_1, xMainLightSwitchActuator => DO1_11);

浴室 POU:

VAR_IN_OUT
    PersistData: BathroomData;
END_VAR

这是一个好方法吗?你怎么看?它使项目有点复杂,但我不会为不应该存在的东西(整个 POU)浪费 RETAIN 内存。

是的,这就是我的组织处理保留变量的方式。这也有助于支持其他 FB 需求的“保存到磁盘”解决方案(对于您的光状态来说不是那么多)。

另一方面,你是不是运行原来的方式内存不足?有时我发现我们会担心从未发生过的事情。是的,将整个 FB 实例放入保留内存中是“浪费”,但如果您的 FB 很小并且您的设备有足够的保留内存 - 那么以后就不用担心了。