0

当我跟踪我的程序(使用断点和单步联机)时,我看到,当到达该行时,VAR SOpen 变为“ * INVALID: 16#02 *Step:=Step+1;

更仔细地观察跟踪,我看到,在第一次调用“0:”时,Step 从 0 变为 1。这两个 VAR 是两个初始化的,似乎是链接在一起的。额外的增加将 Step 设置为 2(在第一次运行中!)并将 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;
4

2 回答 2

0

I transferred the VAR now to VAR_GLOBAL. That's not really what I want, but now it works. Better solutions are welcome and will be accepted :)

于 2011-12-02T16:59:16.803 回答
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 可能会发生。对不起,我看到无效的帮助不大,它来自干净的项目并查看尚未调用的无效指针。

于 2015-11-14T01:27:28.703 回答