该pragma定义了程序块和全局变量列表的初始化顺序。
列表(GVL 或 POU)中的变量自上而下初始化。
如果有多个全局变量列表,则初始化顺序没有定义。
初始化不适用于字面值的初始化,例如1
,'hello'
,3.6
, 或基础数据类型的常量。但是,如果列表之间存在依赖关系,则必须自行定义初始化顺序。您可以使用'global_init_slot'
属性为 GVL 或 POU 分配已定义的初始化时隙。
常量在变量之前初始化,初始化顺序与变量相同。在初始化过程中,POU 会根据 <slot> 的值进行排序。然后生成用于初始化常量的代码,再生成用于初始化变量的代码。
语法 :
{attribute 'global_init_slot' := '<slot>'}
<slot>
:整数值,用于定义调用顺序中的位置。POU(程序、功能块)的默认值为 50000。GVL 的默认值为 49990。数值越小,表示初始化越早。注意事项如果多个区块或
GVL 接收到'global_init_slot'
属性的相同值,则初始化顺序仍未确定。
插入位置:该 pragma 总是影响整个 GVL 或 POU,因此必须位于VAR_GLOBAL
或 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_2
初始化之前就被用于初始化GVL_1.A
。您可以使用global_init_slot
属性将GVL_2
定位在初始化序列中的GVL_1
之前,以防止这种情况发生。
在本例中,GVL_1
必须至少有一个槽值为 49989,才能在程序中实现最早初始化。每降低一个值都会产生同样的效果:
GVL_2
{attribute 'global_init_slot' := '100'} VAR_GLOBAL B : INT := 1000; END_VAR
即使不使用 pragma,在PLC_PRG
的执行部分使用GVL_2.C
也并不重要,因为无论在哪种情况下,两个 GVL 都是在程序之前初始化的。