pragma {attribute 'global_init_slot'} 定义 POU 或全局变量列表的初始化顺序。
如果有若干全局变量列表可用,则不定义初始化顺序。
初始化顺序与字面值(如 1、'hello'、3.6)无关,与基本数据类型的常量也无关。然而,如果不同列表之间存在依赖关系,则必须自己定义初始化顺序。为此,您可以使用 attribute global_init_slot 为 GVL 或 POU 分配定义的初始化时隙。
{attribute 'global_init_slot' := '<时隙>'}
将<时隙>替换为定义在初始化顺序中的位置的整数值。POU(程序、功能块)的缺省值为 50,000。GVL 的缺省值为 49,990。值越小,初始化就越早。如果若干 POU 或 GVL 的属性 global_init_slot 的值相同,则其初始化顺序保持为未定义。这将在消息视图的生成类别中作为检测到的程序错误而被指示出来。
pragma {attribute 'global_init_slot'} 适用于整个 GVL 或 POU,因此必须位于 VAR_GLOBAL 或 POU 声明上方。
示例中包含 2 个变量列表 GVL_1 和 GVL_2 以及一个使用来自这两个列表的变量的程序 PLC_PRG。
GVL_1 使用变量 B 来初始化变量 A,后者在 GVL_2 中使用 1000 的值来初始化。
GVL_1:
VAR_GLOBAL //49990
A : INT := GVL_2.B*100;
END_VAR
GVL_2:
VAR_GLOBAL //49990
B : INT := 1000;
C : INT := 10;
END_VAR
PLC_PRG:
PROGRAM PLC_PRG //50000
VAR
ivar: INT := GVL_1.A;
ivar2: INT;
END_VAR
ivar:=ivar+1;
ivar2:=GVL_2.C;
在生成此示例时,在消息视图的生成类别中会发出编程错误,因为 GVL_2.B 用于在 GVL_2 被初始化之前初始化 GVL_1.A。为避免这种情况,可使用 attribute global_init_slot,以便在初始化顺序中,将 GVL_2 置于 GVL_1 之前。
GVL_2 的时隙值不得大于 49989,这样才能最早在程序中初始化。
GVL_2:
{attribute 'global_init_slot' := '100'}
VAR_GLOBAL
B : INT := 1000;
C : INT := 10;
END_VAR
您甚至可以在没有 pragma 的 PLC_PRG 的实现部分中使用 GVL_2.C,因为在两种情况下,两个 GVL 都在程序之前被初始化。