在TwinCAT 3中实现CheckSum8 Xor校验计算的技术问询
在TwinCAT 3中实现CheckSum8 Xor校验和(与Scadacore在线计算器结果一致)
问题根源
你用OSCAT的CRC_GEN函数得不到正确结果,核心原因是CheckSum8 Xor是简单逐字节异或校验,而非标准CRC算法。CRC_GEN是为循环冗余校验设计的,即使参数设置为8位,其运算逻辑也和简单异或校验完全不同,自然无法匹配在线计算器的结果。
正确实现方式:自定义逐字节异或校验
CheckSum8 Xor的逻辑非常直接:将目标字符串的每个ASCII字节依次做异或运算,最终得到一个8位(BYTE类型)的结果。以下是TwinCAT 3的ST代码实现:
1. 基础计算逻辑
以你的测试字符串$02WLEN00600$03为例:
- 遍历字符串的每个字符,转换为对应的ASCII字节值
- 从0开始,依次与每个字节执行异或运算,最终得到的结果就是校验和
2. ST代码实现
VAR // 待计算的命令字符串 sCommand : STRING := '$02WLEN00600$03'; // 存储最终校验和 bCheckSum : BYTE := 0; // 循环计数器 iCharIndex : INT; END_VAR // 初始化校验和为0 bCheckSum := 0; // 遍历字符串的每个字符,逐字节异或 FOR iCharIndex := 1 TO LEN(sCommand) DO bCheckSum := bCheckSum XOR TO_BYTE(sCommand[iCharIndex]); END_FOR
3. 将校验和添加到命令中
根据JBC SFR B焊锡分配器的通信协议要求,将校验和转换为对应格式(通常是两位十六进制字符串)后拼接至原命令末尾:
VAR sCommandWithCheckSum : STRING; END_VAR // 将校验和转为两位十六进制字符串(小写),拼接到原命令后 sCommandWithCheckSum := sCommand + TO_STRING(bCheckSum, 16); // 若协议要求大写十六进制,可额外转换为大写格式
关键注意事项
- 字符串编码:TwinCAT 3中
STRING默认使用ASCII编码,TO_BYTE转换逻辑正确;若使用WSTRING,需先转换为ASCII字节数组再计算。 - 计算范围:确认在线计算器是否包含字符串的所有字符(比如起始符
$02和结束符$03),上述代码会包含所有字符,与多数在线异或校验工具逻辑一致。
内容的提问来源于stack exchange,提问作者Ivan Félix
相关产品推荐
相关产品推荐

