如果在plc中的结构化文本中语句

发布于 2025-02-09 02:27:22 字数 293 浏览 0 评论 0 原文

我有一个像这样的功能块:

FUNCTION_BLOCK chujwamwdupe
VAR_INPUT
    en:BOOL;
    val:INT;
END_VAR
VAR_OUTPUT
    oval:INT;
END_VAR
VAR
END_VAR

和代码:

IF (en = TRUE) THEN
    oval := val;
END_IF

非常简单。为什么这个块总是执行的?无论en是真实还是错误,它总是会将椭圆形变为Val。

I have a function block like this:

FUNCTION_BLOCK chujwamwdupe
VAR_INPUT
    en:BOOL;
    val:INT;
END_VAR
VAR_OUTPUT
    oval:INT;
END_VAR
VAR
END_VAR

And the code:

IF (en = TRUE) THEN
    oval := val;
END_IF

As simple as it is. Why on earth this block always executes? No matter if en is true or false it always changes oval to val.

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

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

发布评论

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

评论(2

谁的年少不轻狂 2025-02-16 02:27:22

我假设在PLC上,您是指我用3.5.18.0尝试了这一点,并且在这种情况下,编译器似乎使用可变提升。将代码重组为类似:

oval := val;
IF (en = TRUE) THEN
    oval := val;
END_IF

您可能想要的是将椭圆形作为这样的输入输出变量:

FUNCTION_BLOCK chujwamwdupe
VAR_INPUT
    en:BOOL;
    val:INT;
END_VAR
VAR_IN_OUT
    oval:INT;
END_VAR
VAR
END_VAR

如果定义为输入输出变量椭圆形,

则如果您不想保留其原始值,则将保留其原始值

您可以初始化椭圆形:

oval := 11; // magic number
IF (en = TRUE) THEN
    oval := val;
END_IF

或者可以添加其他语句:

IF (en = TRUE) THEN
    oval := val;
ELSE
    oval := 11; // magic number
END_IF

I assume with PLC you mean CODESYS I tried this out with 3.5.18.0 and it seems the compiler employs variable hoisting in this case. Restructuring your code to something like this:

oval := val;
IF (en = TRUE) THEN
    oval := val;
END_IF

What you probably want is to use oval as an input output variable like this:

FUNCTION_BLOCK chujwamwdupe
VAR_INPUT
    en:BOOL;
    val:INT;
END_VAR
VAR_IN_OUT
    oval:INT;
END_VAR
VAR
END_VAR

If defined as an input output variable oval will retain its original value if en is False

If you dont want to retain its original value

You could initialize oval:

oval := 11; // magic number
IF (en = TRUE) THEN
    oval := val;
END_IF

Or you could add an else statement:

IF (en = TRUE) THEN
    oval := val;
ELSE
    oval := 11; // magic number
END_IF
刘备忘录 2025-02-16 02:27:22

我已经用Twincat 3.1.4022对其进行了测试,在这里它可以按照我的意图进行。

但是,FB记得它是从通话到呼叫的椭圆形值,这也许是为什么它看起来总是会更新输出值?

val”>

I have tested it with TwinCAT 3.1.4022 and here it works as I think it is intended.

But the FB remembers it's oval value from call to call, is this maybe why it looks like it always updates the output value?

en=FALSE, and oval <> val

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