You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:52:28