无心飞扬 发表于 2026-3-18 10:59:39

CoDeSys入门实战一起学习(十七):持续变量(RETAIN/PERSISTENT)实操

在PLC控制系统中,部分数据需在设备关机、异常断点后保留,如生产线计数器值、工艺参数等,避免重启后重新初始化。CoDeSys提供RETAIN和PERSISTENT RETAIN两种持续变量,满足不同场景下的数据保留需求。本文将详解持续变量的创建、声明、复位逻辑及使用注意事项。
一、持续变量核心区别与应用场景
两种持续变量的核心差异的在于数据保留范围,适配不同重启/复位场景:

[*]VAR RETAIN(保留变量):仅在控制器非正常关机、正常关机、热复位时保留值,程序重新下载后初始化;适用于临时保留数据,如电源故障后需恢复的计数器。


[*]VAR PERSISTENT RETAIN(永久变量):在热复位、冷复位、重新下载、原始复位外的场景均保留值,仅原始复位后初始化;适用于长期保留核心参数,如设备累计运行时长、工艺基准值。
注意:从CoDeSys V3.3.0.1起,PERSISTENT与PERSISTENT RETAIN功能完全一致,可通用。
二、新建持续变量列表步骤

[*]选中左侧“Application”节点,右键单击选择“添加对象”;

[*]在弹出的菜单中选择持续变量列表,输入列表名称(如“PersistentVars”);

[*]点击“确认”,完成持续变量列表创建。
关键说明:持续变量必须为全局变量,仅能在“special global variables list”中定义“Persistent Variables”,局部变量中定义的RETAIN仅在功能模块实例中生效,函数内局部变量定义RETAIN无效。
注意:
从 CoDeSysV3.3.0.1 起,PERSISTENT 和 PERSISTENTRETAIN/RETAINPERSISTENT 实现的功能已相同。
持久变量必须为全局变量。​​​​​​​
Persistent 变量只能在 specialglobalvariableslist 中定义“PersistentVariables ”。
三、持续变量的声明与使用
1. 变量声明格式
持续变量需在全局变量列表中声明,两种变量的标准格式如下:
(1)RETAIN变量声明

VAR RETAIN
   // 格式:变量名: 数据类型 := 初始值;
   Counter_Product: INT := 0; // 生产线产品计数器,电源故障后保留值
   Speed_Base: REAL := 50.0; // 基准速度值,热复位后保留
END_VAR
(2)PERSISTENT RETAIN变量声明


2. 变量复位逻辑(附表格说明)
不同在线命令对三种变量的影响不同(x=保留值,-=初始值),具体如下表所示:
在线命令
VAR(普通变量)
VAR RETAIN(保留变量)
VAR PERSISTENT RETAIN(永久变量)
热复位
-
x
x
冷复位
-
-
x
原始复位
-
-
-
下载
-
-
x
在线改变
x
x
x
重新下载
-
x
x
保留变量用关键字“RETAIN”来识别,这些变量保持它们的值即使是在控制器的非正常关闭时和正常的关闭和其中的一个控制器或在命令“热复位”时。当程序重新运行时,存储的值将进行进一步的处理。一个具体的例子是生产线上的饼形计数器在电源故障后重新开始计数。所有其它的变量从新初始化,不是用它们的初始化值或标准初始化的值。与永久变量相反,保留变量在程序的一个新的下载时重新初始化。
永久变量通过关键字“PERSISTENTRETAIN”来识别。不象保留变量,这些变量在一个重新下载或在执行命令“ 冷复位”或“原始复位”之后还会继续保留它们的值。如表2-8 所示,在何种在线命令时会复位持续变量。
四、使用注意事项(避坑指南)

[*]内存限制:不同硬件控制器的持续变量内存容量不同,需提前核算变量占用内存,避免超出硬件上限;


[*]局部变量特殊规则:功能模块(FB)中的局部RETAIN变量,会使整个FB实例存入保留区(仅定义的RETAIN变量生效);函数(FC)中的局部RETAIN变量无效,无法保留值;


[*]初始化逻辑:RETAIN变量在程序新下载时初始化,PERSISTENT RETAIN仅原始复位后初始化,需根据场景选择变量类型;


[*]数据一致性:持续变量的值在控制器重启后直接沿用,需确保断电前数据无异常,避免故障数据保留影响后续运行。
页: [1]
查看完整版本: CoDeSys入门实战一起学习(十七):持续变量(RETAIN/PERSISTENT)实操