Skip to main content

属性:global_init_slot

pragma 定义了 POU 和全局变量列表的初始化顺序:GVL 或 POU 中的变量从上到下初始化。如果有多个全局变量列表,则不定义初始化顺序。

初始化不适用于字面值的初始化,例如 1, 'hello', 3.6,或基本数据类型的常量。但是,如果列表之间存在依赖关系,则必须自己定义初始化顺序。您可以将定义的初始化槽分配给 GVL 或 POU 'global_init_slot' 属性。

常量在变量之前初始化,并且与变量的顺序相同。在初始化期间,POU 根据 <slot> 的值进行排序。然后生成初始化常量的代码,然后生成初始化变量的代码。

句法

{attribute 'global_init_slot' := '<slot>'}

插入位置

pragma 始终作用于整个 GVL 或 POU,因此它必须位于 VAR_GLOBAL 或 POU 声明。

<slot>

整数值,定义调用顺序中的位置

POU(程序、功能块)的默认值为 50000。GVL 的默认值为 49990。较低的值意味着较早的初始化。

提示

如果为多个 POU 分配了相同的值 'global_init_slot' 属性,则它们的初始化顺序仍未定义。

267. 例子

该项目包括两个全局变量列表 GVL_1GVL_2,以及 PLC_PRG 使用两个列表中的变量的程序。 GVL_1 使用变量 B 用于初始化变量 A, 初始化为 GVL_21000.

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_1.AGVL_2 已初始化。您可以通过使用 global_init_slot 归属于位置 GVL_2GVL_1 在初始化序列中。

在这个例子中, GVL_1 必须至少有一个槽值 49989 才能实现程序内最早的初始化。每个较低的值都具有相同的效果:

GVL_2

{attribute 'global_init_slot' := '100'}
VAR_GLOBAL
  B : INT := 1000;
END_VAR

使用 GVL_2.C 在执行部分 PLC_PRG 即使不使用 pragma 也不重要,因为在任何一种情况下,两个 GVL 都在程序之前初始化。



有关更多信息,请参阅: Global Init Slots