Skip to main content

持久变量的定义

单个变量以及结构实例和功能块实例可以通过使用属性来标记为“持久”。当一个实例被标记后,该实例的所有成员 VAR, VAR_INPUT, 和 VAR_OUTPUT 将被持久存储。如果 a 中的变量 VAR PERSISTENT 部分被标记为“持久”,将创建一个警告。

此外,还有用于定义默认存储组以及从结构或功能块实例的持久存储中排除特定变量的属性。

如果持久变量的定义已被修改(添加、删除、重命名、更改数据类型),则不必执行新的 Composer 代码生成(命令生成)。这些更改将在编译期间自动更新到持久管理器实例中。

有关修改数据类型定义时可能的隐式转换的信息,请参阅: 范围

支持的数据类型

以下数据类型的实例无法持久存储:

  • 少量

  • 指针

  • 接口

  • 常数

  • 非持久数据类型的数组

支持所有其他数据类型。这包括枚举、子范围数据类型、数组的数组和多维数组:

ARRAY[0..9] OF ARRAY[5..6, 7..8, 9..10] OF INT

数据类型: 联盟

要持久保存联合实例,其字段之一必须标记为“代表性”。有以下三种可能的方式:

  • 联合声明中恰好有一个字段用该属性标记 ac_persist_union_representant (没有属性值)。该字段“代表”联合。它的值将代表整个联合进行保存和加载。

  • 联合声明中的确切一个字段用属性标记 ac_persist – 这同时定义了代表。

  • 联合的实例用属性标记 ac_persist_union_set_representant 包括属性值。属性值描述了用作代表的联合字段的名称。该属性会覆盖现有的 ac_persist_union_representant 联合声明中的属性。联合数组也可以被标记并引用数组的元素。

2. 例子

'ac_persist_union_representant'

TYPE UnionWithRep :
UNION
        di : DINT ;
        {attribute 'ac_persist_union_representant'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist'

TYPE UnionWithPersist :
UNION
        di : DINT ;
        {attribute 'ac_persist' := 'TestUnion'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist_union_set_representant'

FUNCTION_BLOCK FBTestUnion
VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        u2 : UnionWithoutRep ;
END_VAR

联合数组

VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aElems ARRAY[0..7] OF SomeUnion ;

        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aaElems ARRAY[0..7] OF ARRAY[0..1] OF SomeUnion ;
END_VAR


. 代表要有效,必须满足以下规则:
  • 代表的人数必须与整个工会的人数相同。否则将无法保存完整的数据。该代表也不能有任何填充区域(编译器创建的空数据区域,用于对齐存储中的数据)。

  • 原始数据类型中代表的分解不得包含类型的实例 REAL 或者 LREAL 或类型的实例 STRING 或者 WSTRING

  • 此外,代表必须由受支持的类型组成(见上文)。例如,代表可以是类型 Structure – 但是,结构本身不能包含指针。

属性:'ac_persist'

属性 'ac_persist' 可用于

  • 变量

  • 结构实例

  • 功能块实例

  • 结构成员

  • 功能块成员

{attribute 'ac_persist' [ := '<PERSISTENCE_GROUP>']}

PERSISTENCE_GROUP 是的名字 持久组 声明应分配给该对象。它必须是有效的 IEC 标识符。如果这里没有命名持久组,将根据属性进行分配 'ac_persist_set_default_group',在这种情况下必须定义。

如果结构实例或功能块实例被标记为“持久”,并且声明中的至少一个成员也被标记为“持久”,则会创建一条错误消息。

3. 持久实例的示例

变量 t 被分配到持久组 PROCESS。所有成员都将被持久存储。

PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist' := 'PROCESS'}
        t : TON;
END_VAR


4. 功能块的持久成员的示例

会员 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', A 默认组 必须在直接或间接包含相应变量的功能块实例或结构实例中定义。这可以通过属性实现 'ac_persist_set_default_group'。还可以为功能块的成员设置该属性。最里面找到的定义 'ac_persist_set_default_group' 将用作变量的默认组。

不允许使用 'ac_persist_set_default_group' 和...一起 'ac_persist' 或者 'ac_persist_exclude'。在这种情况下,代码生成期间将创建一条错误消息。

5. 默认组的示例
FUNCTION_BLOCK FB_Util
VAR
        {attribute 'ac_persist'} // no group
        //'ac_persist_set_default_group‘ and 'ac_persist_exclude' not allowed here
        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' 用于从持久存储中排除变量,无论结构或功能块声明中的成员是否定义为“持久”。如果声明中不存在持久成员,则会在代码生成期间创建错误。

6. 排除变量的示例
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_exclude'}
        fb1 : FB;
END_VAR