If statement Codesys IF语句位操作错误
编译器为以下程序提供了一个错误。我解决不了 这是用ST语言编写的Codesys系统。我想用钻头操作电磁阀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
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):在“')之前预期