Beckhoff PLC:如何在功能块中将数组声明为保持型?
解决方案:Beckhoff功能块内变量重启后保留数据
1. 正确配置Persistent属性
你之前标记Persistent未生效,大概率是没遵循Beckhoff的规范配置。正确做法是在FB内部变量声明前添加{PERSISTENT}属性,同时完成项目层面的持久化设置:
VAR {PERSISTENT} Values : ARRAY[DataArrayLow..DataArrayHigh] OF T_ARG; {PERSISTENT} ValueChanged : ARRAY[DataArrayLow..DataArrayHigh] OF BOOL; END_VAR
然后在TwinCAT工程中操作:
- 右键项目 → 选择Properties → 进入Persistent Settings
- 勾选Enable persistent data启用持久化功能
- 在Persistent Variables列表中,找到
FB_Comm实例下的Values和ValueChanged数组,勾选它们纳入持久化存储
注意:Persistent变量依赖控制器的非易失性存储(多数Beckhoff控制器自带),且变量类型需支持持久化(T_ARG如果是标准类型或不含指针/引用的自定义结构体,均可正常使用)。
2. 简化方案:使用Retain属性
如果Persistent配置流程繁琐,可改用PLC标准的{RETAIN}属性,无需额外项目设置,重启后即可保留数据:
VAR {RETAIN} Values : ARRAY[DataArrayLow..DataArrayHigh] OF T_ARG; {RETAIN} ValueChanged : ARRAY[DataArrayLow..DataArrayHigh] OF BOOL; END_VAR
Retain变量存储在RAM中,依赖控制器的后备电池维持数据,若长时间断电(超过电池续航)数据会丢失;而Persistent存储在Flash等非易失性介质,断电更久也能保留,可根据场景选择。
3. 自定义持久化逻辑(避免全局变量)
若不想依赖系统自带的持久化属性,可在FB内部实现独立的读写逻辑,不破坏封装性:
- 添加
FirstCycle布尔变量,标记启动后的第一个运行周期 - 第一个周期内,通过
FILE功能块读取控制器本地存储的文件,将数据加载到Values数组 - 日常更新
Values时,同步调用写入逻辑将数据保存到本地文件
这种方式需自行处理文件读写细节,复杂度高于前两种方案,适合有特殊需求的场景。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

