我正在尝试比较字符串的一个字符,看是否它是我的分隔符。但是,当我执行以下代码时,变量valstring
中的值是一个数字,该数字表示已转换为字符串的字节,而不是字符本身。例如,该值可以是字符串“ 58”。
通过使用调试功能在CoDeSys中进行测试,我知道字符串sReadLine
包含有效的字符串。我只是不确定语法中是否只选择其中一个。 sReadLine[valPos + i]
部分是我不了解的。
sReadLine : STRING;
valstring : STRING;
i : INT;
valPos : INT;
FOR i := 0 TO 20 DO
IF BYTE_TO_STRING(sReadLine[valPos + i]) = '"' THEN
EXIT;
END_IF
valstring := CONCAT(STR1 := valstring, STR2 := BYTE_TO_STRING(sReadLine[valPos + i]));
END_FOR
我认为您有很多选择。
1)改用内置的字符串函数。您可以使用MID
函数获取字符串的一部分。因此,在您的情况下,例如“从MID
中从valPos + 1
中获得一个字符。
sReadLine
2)将ASCII字节转换为字符串。在TwinCAT系统中,有一个功能FOR i := 0 TO 20 DO
IF MID(sReadLine, 1, valPos + i) = '"' THEN
EXIT;
END_IF
valstring := CONCAT(STR1 := valstring, STR2 := MID(sReadLine, 1, valPos + i));
END_FOR
。它接受一个ASCII字节并将字符作为字符串返回。我找不到Codesys这样的东西,但我敢肯定某些库中会有解决方案。因此请注意,未经修改,此代码将无法在Codesys中使用:
F_ToCHR
3)F_ToCHR
似乎具有CHR_TO_STRING函数。您可以在步骤2中使用它代替F_ToCHR。
4)您可以使用指针将ASCII字节复制到字符串数组(MemCpy)并添加字符串结束字符。这需要一些有关指针等的知识。有关示例,请参见FOR i := 0 TO 20 DO
IF F_ToCHR(sReadLine[valPos + i]) = '"' THEN
EXIT;
END_IF
valstring := CONCAT(STR1 := valstring, STR2 := F_ToCHR(sReadLine[valPos + i]));
END_FOR
。
5)您可以自己编写类似于步骤2的帮助函数。检查OSCAT library。该示例未包含所有字符,因此需要更新。不太优雅。
当将字节转换为字符串时,将转换为字节的数字表示形式。这意味着您正在将该字节解释为ascii字符(:的ascii十进制值为58)。
因此,如果要转换字符而不是十进制表示形式,则需要另一个函数:
Codesys forum