【发布时间】:2017-01-20 17:38:10
【问题描述】:
每次 PLC 启动时我都需要运行一些代码。此代码只应运行一次,然后在重新启动 PLC 之前不再运行。在允许主 PLC 运行之前,我初始化了一些全局变量并验证了持久数据。这是因为如果其中一些变量设置不正确,机器的操作可能会造成破坏。
有没有办法启动/停止其他 PLC 任务?我注意到 TwinCAT 不支持 PLC 任务的初始化和关闭中断。
【问题讨论】:
每次 PLC 启动时我都需要运行一些代码。此代码只应运行一次,然后在重新启动 PLC 之前不再运行。在允许主 PLC 运行之前,我初始化了一些全局变量并验证了持久数据。这是因为如果其中一些变量设置不正确,机器的操作可能会造成破坏。
有没有办法启动/停止其他 PLC 任务?我注意到 TwinCAT 不支持 PLC 任务的初始化和关闭中断。
【问题讨论】:
TwinCAT 有一个“PlcTaskSystemInfo”结构,其中包含 FirstCycle 的布尔值。您只能使用它来运行初始化代码一次。
VAR fbGetCurTaskIdx: GETCURTASKINDEX; (* Further example+explanation in Infosys *)
fbGetCurTaskIdx();
IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle THEN
(* Initialization code here *)
ELSE
(* Normal code here *)
END_IF;
【讨论】:
VAR fbGetCurTaskIdx: GETCURTASKINDEX; i: INT := 23; bCheckForFirstScan: BOOL := TRUE; END_VAR; fbGetCurTaskIdx(); IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle AND bCheckForFirstScan THEN (* Initialization code here *) i := 17; ELSE (* Normal code here *) i := i; END_IF;
我不知道启动/停止单个 PLC 任务的方法。您可以启动/停止运行时。
但也许它可以像下面这段代码一样简单,它只会在你的 PLC 启动时运行。
VAR initialized: BOOL := FALSE;
IF NOT initialized THEN
(* Run your initialization code here *)
initialized := TRUE;
END_IF
(* Rest of your program here *)
编辑:
我在初始化代码中使用了状态机来帮助解决任务允许时间问题。
例子:
VAR
Initialized : BOOL := FALSE;
Init_State : UINT := 0;
END_VAR
IF NOT Initialized THEN
(* Initialization State Machine *)
CASE Init_State OF
0: (* First step in initialization *)
Init_State := Init_State + 1;
1: (* Second step in initialization *)
Init_State := Init_State + 1;
.
.
.
n: (* Last step in initialization *)
Initialized := TRUE;
END_CASE
END_IF
【讨论】: