RETAIN、PERSISTENT
剩余变量可以在常规的程序运行期内保留其值。将其声明为保留变量,甚至声明为更严格的持久变量。
该声明确定在控制器进行复位、下载或重新启动的情况下,其余变量的持久程度。在应用程序中,主要是使用这两种剩余标志的组合(参阅持久变量)。
VAR PERSISTENT RETAIN 或 VAR RETAIN PERSISTENT 相同的方法来解释 VAR PERSISTENT 声明。
持久性通过以下步骤实现:
确定访问变量的循环任务。
在第一个循环任务结束时(在每个循环中),将变量复制到持久全局变量列表。
在控制器重启时,将持久变量的值复制到普通变量。
由于在声明和实例路径处都分配了内存,因此这个持久变量在每个循环中都要求双重内存分配。这可能引起处理时间延长,尤其是在处理大的结构化值时。
声明为保留变量的变量将存储在非易失性存储器区域中。为了声明该类变量,可在 POU 的声明部分或全局变量列表中使用关键字 RETAIN。
示例
VAR RETAIN
iRem1 : INT; (* 1. Retain variable*)
END_VAR
保留变量将一直保持其值,即使是在控制器意外关闭之后以及在控制器正常重置电源后(或者当执行命令时)。在程序重新启动时,将进一步处理保留的值。其他(非保留)变量以新方式初始化:要么使用其初始化值,要么使用其默认初始化值(如果未声明任何初始化值)。
例如,在以下情况下,您可能希望使用保留值:某个操作(如,生产机器中的数量统计)在断电后应继续运行。
但是,当执行命令时,保留变量会重新初始化,与持久变量不同,持久变量是在执行命令时或者在应用程序下载期间进行重新初始化。
VAR RETAIN 的特定变量才存储在非易失性存储器中。但是,在函数中定义为 VAR RETAIN 的本地变量不会存储在非易失性存储器中。在功能中以本地方式定义 VAR RETAIN 没有任何效果。
在保留程序段 (VAR_RETAIN) 中使用系统配置库中的接口或功能块将导致系统异常,可能使控制器不可操作,从而需要重启。
| 警告 | |
|---|---|
RETAIN,则会将功能块实例及其变量存储在剩余内存中。并非所有控制器都支持该功能。 请参阅控制器的相应编程指南,了解详细信息。
持久变量以关键字 VAR_GLOBAL PERSISTENT (PERSISTENT) 来标识。仅当执行命令时,才会重新初始化持久变量。与保留变量相比,持久变量的值在下载后保持不变。
VAR PERSISTENT 一起使用 AT 声明。
应用示例:
运行时间计数器,即使在电源中断或下载之后也应继续统计。请参阅剩余变量行为一览表。
只能在对象类型持久变量的特殊全局变量列表中声明持久变量,这一列表将被分配给某个应用程序。只能向应用程序中添加一个此类列表。
VAR_GLOBAL PERSISTENT 的声明与包含 VAR_GLOBAL PERSISTENT RETAIN 或 VAR_GLOBAL RETAIN PERSISTENT 的声明效果相同。
与保留变量相同,持久变量也存储在单独的存储器区域中。
示例
VAR_GLOBAL PERSISTENT RETAIN
iVarPers1 : DINT; (* 1. Persistent+Retain Variable App1 *)
bVarPers : BOOL; (* 2. Persistent+Retain Variable App1 *)
END_VAR
在每次重新加载应用程序时,都将比对项目的持久变量列表来检查控制器上的持久变量列表。控制器上的列表由应用程序来识别。如果发现不一致,将提示您重新初始化应用程序的所有持久变量。不一致性可能是由于重命名或删除了列表中的现有声明,或者对其进行了其他修改。
只能在列表的结尾添加新声明。在下载期间,这些声明将被检测为新声明,并且不需要重新初始化完整列表。如果您修改某一变量的名称或数据类型,这会被当成新的声明进行处理并会在下一次在线修改或下载时引起变量的重新初始化。
PERSISTENT,则会将功能块实例及其变量存储在剩余内存中,但仅这个变量被视为持久变量。
CONSTANT
常量由关键字 CONSTANT 来标识。您可以对它们进行本地声明(编程对象单元)或全局声明(全局变量列表)。在 POU 的实现部分中,常量变量为只读。
语法
<scope> CONSTANT <identifier>:<type> := <initialization>;
END_VAR
使用 <scope> : VAR | VAR_INPUT | VAR_STAT | VAR_GLOBAL
声明常量变量时,务必指定初始化值。
示例
VAR CONSTANT
c_iCon1:INT:=12; (* 1. Constant*)
END_VAR
有关可能常量的列表,请参阅操作数一章。
基本上,在使用 IEC 常量时,将使用最小的可能数据类型。如果必须使用其他数据类型,则可以通过类型化文字来实现,而不必显式声明常量。因此,将为常量提供一个用于确定类型的前缀。
语法
<类型>#<文字>;
|
<类型> |
指定所需的数据类型 可用的条目:BOOL, SINT, USINT, BYTE, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, LREAL 请以大写字母书写类型。 |
|
<文字> |
指定常量 输入属于 <类型> 下指定的数据类型的数据。 |
示例
iVar1:=DINT#34;
如果常量无法转换在不丢失数据的情况下转换为目标类型,则会发出一条消息。
只要能够使用正常常量的场合中,都可以使用类型化文字。