属性: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,因此它必须位于 |
| 整数值,定义调用顺序中的位置 POU(程序、功能块)的默认值为 50000。GVL 的默认值为 49990。较低的值意味着较早的初始化。 |
提示
如果为多个 POU 分配了相同的值 'global_init_slot'
属性,则它们的初始化顺序仍未定义。
该项目包括两个全局变量列表 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_1.A
前 GVL_2 已初始化。您可以通过使用 global_init_slot
归属于位置 GVL_2 前 GVL_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