当我跟踪我的程序(在线断点和单步)我看到了,
当达到Step:=Step+1;
行时,VAR SOpen变为“ * INVALID:16#02 * ”。
在第一次调用“0:”时,我看到,跟踪更加小心,Step从0变为1。这两个VAR是两个初始化的,似乎是连在一起的。 aditional增加将Step设置为2(在第1次运行中!)并将SOpen设置为无效。
PROGRAM PLC_PRG
VAR
SerIO: SERCOMM;
Step: BYTE := 0;
Input: ARRAY [0..50] OF DWORD;
SOpen: BOOL := FALSE;
END_VAR
IF Eingang1 THEN
CASE Step OF
0:
IF NOT SOpen THEN
SerIO.FB_ACTION := Open;
SerIO.RECEIVE_BUFFER:=Input[0];
SerIO.COMPORT:=1;
SerIO.EN:=TRUE;
Ausgang1 := NOT SerIO.ERROR;
SOpen :=TRUE;
SerIO.EN:=FALSE;
END_IF;
1:
IF SOpen THEN
SerIO.FB_ACTION:=Read;
SerIO.EN:=TRUE;
Ausgang1 := NOT SerIO.ERROR;
Ausgang2 := (SerIO.BYTES_DONE>3);
SerIO.EN:=FALSE;
END_IF;
2:
IF SOpen THEN
SerIO.FB_ACTION:=Close;
SerIO.EN:=TRUE;
Ausgang1 := NOT SerIO.ERROR;
SOpen :=FALSE;
SerIO.EN:=FALSE;
END_IF;
END_CASE
Step:=Step+1;
IF Step>2 THEN Step :=0; END_IF;
ELSIF SOpen THEN
SerIO.FB_ACTION:=Close;
SerIO.EN:=TRUE;
SerIO.EN:=FALSE;
SOpen :=FALSE;
Step:=0;
END_IF;
答案 0 :(得分:0)
我现在将VAR转移到了VAR_GLOBAL。这不是我想要的,但现在它有效。欢迎提供更好的解决方案,并接受:)
答案 1 :(得分:0)
问你为什么要把CASE陈述放在IF声明中? IF语句应该调用你的步骤吗?
If something then
step = 10; (* start processing *)
else
step = 0;
end_if
case step of
0:
Kill your enable or an idle state here stop state.
10: (* Start *)
step = step +1;
20:
Call FB
40: (*continue *)
step = 10;
30: (* End *)
step = 0;
else (* catch something here *)
end_case
在这里调用FB,从上面的代码中获取输入。
如果你没有执行全部清理并且变量列表没有发生可能发生的事情,很难告诉INVALID。 对不起,我看到了无效的帮助,它来自干净的项目,看着尚未被调用的无效指针。