If statement Codesys IF语句位操作错误

If statement Codesys IF语句位操作错误,if-statement,codesys,st,If Statement,Codesys,St,编译器为以下程序提供了一个错误。我解决不了 这是用ST语言编写的Codesys系统。我想用钻头操作电磁阀 CanRx := can_getDatabox (CAN_2, 10, ADR(CanRx_data), ADR(CanRxNumBytes)); Rx_test_1 := CanRx_data[1]; Rx_test_2 := CanRx_data[2]; Rx_test_3 := CanRx_data[3]; Rx_test_4 := CanRx_data[4]; IF(Rx_test

编译器为以下程序提供了一个错误。我解决不了

这是用ST语言编写的Codesys系统。我想用钻头操作电磁阀

CanRx := can_getDatabox (CAN_2, 10, ADR(CanRx_data), ADR(CanRxNumBytes));
Rx_test_1 := CanRx_data[1];
Rx_test_2 := CanRx_data[2];
Rx_test_3 := CanRx_data[3];
Rx_test_4 := CanRx_data[4];

IF(Rx_test_1 & 4 = 4)THEN
  out (OUT_1_POH_CL, 1500);
  ELSE IF(Rx_test_1 & 8 = 8)THEN
  out (OUT_1_POH_CL, 0);
END_IF

编译器错误:

 Error: 4011:Callback_MAIN_Task(XX): Type mismatch in parameter 1 of 'AND':Cannot convert 'INT' to 'ANY_BIT'  
 Error: 4024:Callback_MAIN_Task(XX): Expecting END_IF_before"
表示比较运算符和相等运算符
=
=
的优先级高于布尔逻辑运算符和位逻辑运算符

此外,在ST中,按位逻辑运算符是
,而不是
&
。类似地,布尔逻辑运算符是
和_-THEN
或_-ELSE
,而不是
&
|
。(不过要注意,布尔逻辑运算符已添加到CODESYS编译器V3.5 SP4,如果您使用的是旧的,它们将不可用。例如,SoMachine使用的是旧的)

此外,
IF
的语法如下:

IF condition THEN
    statement1;
ELSEIF condition THEN
    statement2;
ELSE
    statement3;
END_IF;
但是您的代码有
ELSE IF
而不是
ELSEIF
,如果
缺少分号,则您的
END\u。(虽然如果我忽略了这一点,我从来没有收到过任何编译器的抱怨,而且他们自己也经常在文档中的示例中忽略它们)

因此,在进行比较之前,只需将按位运算括起来。(在C族语言中也是如此,这会导致无法读取的表达式带有太多的括号),用有效的ST运算符替换它们,并修复
ELSE IF
部分

尝试合并这些更改,如下所示:

(注意,我还添加了空格以提高可读性。(与Python、Haskell等不同),因此应该使用空格来最大限度地提高可读性和可维护性)。(我个人的风格是在括号内留空格,而不是在括号外——其他人强烈反对,YMMV)

表示比较运算符和相等运算符
=
=
的优先级高于布尔逻辑运算符和位逻辑运算符

此外,在ST中,按位逻辑运算符是
,而不是
&
。类似地,布尔逻辑运算符是
和_-THEN
或_-ELSE
,而不是
&
|
。(不过要注意,布尔逻辑运算符已添加到CODESYS编译器V3.5 SP4,如果您使用的是旧的,它们将不可用。例如,SoMachine使用的是旧的)

此外,
IF
的语法如下:

IF condition THEN
    statement1;
ELSEIF condition THEN
    statement2;
ELSE
    statement3;
END_IF;
但是您的代码有
ELSE IF
而不是
ELSEIF
,如果
缺少分号,则您的
END\u。(虽然如果我忽略了这一点,我从来没有收到过任何编译器的抱怨,而且他们自己也经常在文档中的示例中忽略它们)

因此,在进行比较之前,只需将按位运算括起来。(在C族语言中也是如此,这会导致无法读取的表达式带有太多的括号),用有效的ST运算符替换它们,并修复
ELSE IF
部分

尝试合并这些更改,如下所示:

(注意,我还添加了空格以提高可读性。(与Python、Haskell等不同),因此应该使用空格来最大限度地提高可读性和可维护性)。(我个人的风格是在括号内留空格,而不是在括号外——其他人强烈反对,YMMV)


我自己能解决它。我用了,而不是&,用了ELSIF而不是ELSEIF。这是正确的代码

Rx_test_1 : BYTE;

IF ((Rx_test_1 AND 1) =1) THEN
   statement1;
ELSIF (( Rx_test_1 AND 2) =1) THEN
   statement2;
ELSIF (( Rx_test_1 AND 4) =1) THEN
   statement3;
ELSE
   statement4;
END_IF

我自己能解决它。我用了,而不是&,用了ELSIF而不是ELSEIF。这是正确的代码

Rx_test_1 : BYTE;

IF ((Rx_test_1 AND 1) =1) THEN
   statement1;
ELSIF (( Rx_test_1 AND 2) =1) THEN
   statement2;
ELSIF (( Rx_test_1 AND 4) =1) THEN
   statement3;
ELSE
   statement4;
END_IF

谢谢你的建议。当然,您的代码很容易阅读。但是,这个问题无法解决。数据类型可能有问题,但我不确定“错误:4024:回调\u主任务(XX):如果在\u之前,则预期结束”.@TaroNAKAMURA编译器错误消息是否与我的更改相同?(注意
Rx_test_1&4
)TaroNAKAMURA I还更正了
ELSE IF
/
ELSEIF
,并添加了另一个分号。请立即尝试我的代码并报告确切的编译器错误。Tihs是附加错误。错误4253:回调主任务(XX):'IF'或'ELSIF'要求将'Bool'表达式作为条件错误:4024:回调主任务(XX):要求将'Bool'表达式作为条件错误:4024'之前的'before'和'Error:4024:回调主任务(XX):要求将'Bool'表达式作为条件错误:4024:回调主任务(XX):在…之前等,谢谢你的建议。当然,您的代码很容易阅读。但是,这个问题无法解决。数据类型可能有问题,但我不确定“错误:4024:回调\u主任务(XX):如果在\u之前,则预期结束”.@TaroNAKAMURA编译器错误消息是否与我的更改相同?(注意
Rx_test_1&4
)TaroNAKAMURA I还更正了
ELSE IF
/
ELSEIF
,并添加了另一个分号。请立即尝试我的代码并报告确切的编译器错误。Tihs是附加错误。错误4253:回调主任务(XX):'IF'或'ELSIF'要求将'Bool'表达式作为条件错误:4024:回调主任务(XX):要求将'Bool'表达式作为条件错误:4024'之前的'before'和'Error:4024:回调主任务(XX):要求将'Bool'表达式作为条件错误:4024:回调主任务(XX):在“')之前预期