保持变量在保持全局变量列表的声明部分VAR_GLOBAL RETAIN PERSISTENT中声明。对于在保持编辑器外部用PERSISTENT关键字标记的变量,实例路径将添加到该变量中。
从CODESYS版本3.3.0.1开始,使用PERSISTENT RETAIN进行变量声明与使用RETAIN PERSISTENT或PERSISTENT具有相同的作用。 |
.全局保持变量列表PersistentVars中的声明语法:
VAR_GLOBAL PERSISTENT RETAIN
<标识符>: <数据类型> (:= <初始化>)?;
<POU变量的实例路径>
END_VAR
.POU中声明的语法
<范围> PERSISTENT RETAIN
<标识符>: <数据类型> ( := <初始化> )?; // ( ...)? : 可选的
END_VAR
<范围> : VAR | VAR_INPUT | VAR_OUTPUT | VAR_IN_OUT | VAR_STAT | VAR_GLOBAL
不允许使用AT关键字分配输入,输出或内存地址。
永远不要在保持变量列表中使用POINTER TO数据类型。如果再次下载该应用程序,其地址可能会更改。消息窗口中显示了相应的编译器警告。 |
如果您经常更改剩余变量的名称或数据类型,则最好仅使用RETAIN关键字将它们声明为保持变量。 |
避免插入实例路径,因为在这种情况下会使用两倍的内存,并且可能会出现更高的周期时间。相反,在保持变量列表中声明变量。 |
.示例
.在保持变量列表PersistentVars中的声明:
{attribute 'qualified_only'}
VAR_GLOBAL PERSISTENT RETAIN
g_iCounter : INT;
// Generated instance path of persistent variable
PLC_PRG.fb_A.iPersistentCounter_A: INT;
END_VAR
.Declaration in the function block FB_A:
FUNCTION_BLOCK FB_A
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR PERSISTENT
iPersistentCounter_A : INT;
END_VAR
直接在保持全局变量列表中 | 此变量是保持变量,位于受保护的内存区域中。 |
在保持变量列表中具有实例路径的程序中本地 在功能块中的本地,在保持变量列表中具有实例路径 | 此变量是保持变量,位于受保护的内存区域和内存中(双重分配)。 |
仅在程序本地 仅在功能块中本地 | 此变量不是持保持变量。消息窗口中显示警告。 提示:单击 以将变量导入到持久变量列表中。 |
局部地在一个函数中 | 这个声明没有任何作用。此变量不是持保持变量。 |
如果局部变量标记有PERSISTENT,则在保持编辑器中,单击 。 |
尽可能避免使用PERSISTENT标记在功能块中声明的变量。这是因为功能块实例完全存储在剩余内存中,而不仅仅是标记的变量。 |