VAR RETAIN PERSISTENT 的用法
Usage of VAR RETAIN PERSISTENT
我在我的家庭自动化项目中使用了 WAGO PLC PFC200。我有很多 POU,每个 POU 一个房间。每个房间都实现 IRoom 接口,并使用基本 POU 实现通用逻辑,如关闭所有灯。
对于灯光管理,我使用
FbEvaluateShortLongPress
来自 WagoAppBuilding
以处理短按和长按墙上的按钮(它也可以是来自 OSCAT 库的功能块)
FbLatchingRelay
来自 WagoAppBuilding
作为 PLC 数字输出的开关
我想保存 FbLatchingRelay
的状态,以防万一:断电。我希望所有在断电前关闭的灯在电源恢复时打开。
我通过在我的 POU 的 VAR RETAIN PERSISTENT
区域声明一个 FbLatchingRelay
来解决它。但是在阅读 here 之后:
如果在一个功能块中声明一个局部变量为RETAIN,CODESYS会将这个功能块的完整实例存储在Retain范围内(该功能块的所有数据);然而,只有声明的 RETAIN 变量被这样对待。
我决定更改它,以免将 RETAIN 内存浪费在 POU 中但不需要存储为 RETAIN 的一堆变量上。
所以现在我有类似的东西:
- VAR RETAIN PERSISTENT 区域只在我的主程序中声明
- 它只为每个房间(每个 POU)存储所需数据的结构 - FbLatchingRelay POU 和其他一些变量
- 在初始化房间 (POU) 时,我使用 VAR_IN_OUT
将这些结构传递到我的房间
- 每个房间 (POU) 使用此数据
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 很小并且您的设备有足够的保留内存 - 那么以后就不用担心了。
我在我的家庭自动化项目中使用了 WAGO PLC PFC200。我有很多 POU,每个 POU 一个房间。每个房间都实现 IRoom 接口,并使用基本 POU 实现通用逻辑,如关闭所有灯。 对于灯光管理,我使用
FbEvaluateShortLongPress
来自WagoAppBuilding
以处理短按和长按墙上的按钮(它也可以是来自 OSCAT 库的功能块)FbLatchingRelay
来自WagoAppBuilding
作为 PLC 数字输出的开关
我想保存 FbLatchingRelay
的状态,以防万一:断电。我希望所有在断电前关闭的灯在电源恢复时打开。
我通过在我的 POU 的 VAR RETAIN PERSISTENT
区域声明一个 FbLatchingRelay
来解决它。但是在阅读 here 之后:
如果在一个功能块中声明一个局部变量为RETAIN,CODESYS会将这个功能块的完整实例存储在Retain范围内(该功能块的所有数据);然而,只有声明的 RETAIN 变量被这样对待。
我决定更改它,以免将 RETAIN 内存浪费在 POU 中但不需要存储为 RETAIN 的一堆变量上。
所以现在我有类似的东西:
- VAR RETAIN PERSISTENT 区域只在我的主程序中声明
- 它只为每个房间(每个 POU)存储所需数据的结构 - FbLatchingRelay POU 和其他一些变量
- 在初始化房间 (POU) 时,我使用 VAR_IN_OUT 将这些结构传递到我的房间
- 每个房间 (POU) 使用此数据
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 很小并且您的设备有足够的保留内存 - 那么以后就不用担心了。