CoDeSys:BOOL 变为“*** INVALID:16#02 ***”外部情况(两个变量之间的链接)

发布于 2024-12-19 01:02:07 字数 1338 浏览 0 评论 0原文

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

更仔细地观察跟踪,我发现在第一次调用“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;

When I trace my program (online with breakpoint and singlestep) I see,
that the VAR SOpen becomes "* INVALID: 16#02 *" when the line Step:=Step+1; is reached.

Watching the trace more careful, I saw, that Step changes from 0 to 1, in the first call of "0:". The two VARs are the two initialized and seem to be linked together. The aditional increase sets Step to 2 (in the 1st run!) and SOpen to invalid.

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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

触ぅ动初心 2024-12-26 01:02:07

我现在将 VAR 转移到 VAR_GLOBAL。这并不是我真正想要的,但现在它有效了。欢迎更好的解决方案并将被接受:)

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 :)

一花一树开 2024-12-26 01:02:07

问为什么要将 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,从上面的代码获取输入。

有时,如果您不执行全部清理,并且变量列表可能会出现混乱,则有时很难判断无效。
抱歉,我没有看到太多帮助,它来自干净的项目,并查看尚未调用的无效指针。

Question why would you place the CASE statement in an IF statement? The IF statement should be calling your steps?

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

call FB here that gets inputs from above code.

It's hard to tell the INVALID sometimes if you don't perform a clean all and the variable list gets out of wack that can happen.
Sorry not much of a help I have seen the invalid and it came from clean project and looking at invalid pointer that haven't been called yet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文