变量,结构体实例以及功能块实例都可以通过使用属性被标记为“保持”。在这中情况下所有位于VAR, VAR_INPUT 以及 VAR_OUTPUT 之间的变量都将作为保持类型被存储。如果位于VAR PERSISTENT 之间的变量被标记为“保持”那么将会产生一个警告。
如果只有定义的保持变量发生改变,完全的编译 (命令编译运行) 必须进行。这些改变将会在编译过程中自动在保持变量管理实例中进行更新。
支持的数据类型
以下数据类型不能被存储:
- 指针
- 接口
- 联合体
- WSTRING
- 常量
- 列表中的数据类型数组
其他所有的类型都支持。包含枚举,附属数据类型,数组的数组以及多维数组:
ARRAY[0..9] OF ARRAY[5..6, 7..8, 9..10] OF INT
属性 'ac_persist'
属性 'ac_persist' 可以用于
- 变量
- 结构体实例
- 功能块实例
- 结构体成员
- 功能块成员
{attribute 'ac_persist' [ := '<PERSISTENCE_GROUP>']}
PERSISTENCE_GROUP是保留组的名称。必须通过 IEC 进行定义。如果没有保留组,相关表达式必须通过属性 'ac_persist_set_default_group'在之后进行定义。
如果一个结构体实例或者功能块实例表标记为“保持型”并且定义至少一个成员也被标记为“保持”那么将会出现一个错误信息。
保持实例的示例
变量t被分配给保持组PROCESS。所有的成员都将作为保持变量被存储。
PROGRAM PLC_PRG
VAR
{attribute 'ac_persist' := 'PROCESS'}
t : TON;
END_VAR
功能块保持成员示例
成员 iNumIOs被分配给一个保持组CONFIG。这个成员将会在功能块所有实例中被保存为保持变量(如果没有明确被属性'ac_persist_exclude'定义)。
FUNCTION_BLOCK FB
VAR
{attribute 'ac_persist' := 'CONFIG'}
iNumIOs : INT := 0;
END_VAR
属性 'ac_persist_set_default_group'
如果这个组名在属性'ac_persist'中丢失,组必须通过属性'ac_persist_set_default_group'在连接的功能块实例或者结构体实例中进。属性同样可以对功能块成员进行设定。通过'ac_persist_set_default_group'定义的隐藏组将会用于变量。
允许使用'ac_persist_set_default_group'与'ac_persist' 或者'ac_persist_exclude'。在这种情况下当在代码编译时会有一个错误信息。
默认值示例
FUNCTION_BLOCK FB_Util
VAR
{attribute 'ac_persist'} // no group
i : INT := 0;
END_VAR
PROGRAM PLC_PRG
VAR
{attribute 'ac_persist_set_default_group' := 'PROCESS'}
fbu1 : FB_Util;
{attribute 'ac_persist_set_default_group'´ := 'CONFIG'}
fbu2 : FB_Util;
END_VAR
属性 'ac_persist_exclude'
属性'ac_persist_exclude'用于处理位于保持存储部分的变量,无论这个变量是位于结构体中还是功能块中被定义为“保持”类型。如果在定义部分没有存在的保持成员,那么在编译过程中将会出现一个错误信息。
处理变量示例
PROGRAM PLC_PRG
VAR
{attribute 'ac_persist_exclude'}
fb1 : FB;
END_VAR