▎西门子博途 LGF 库详解 · 09:CRC 校验(上)——CRC8 全套,从 1-Wire 传感器到自定义协议
上一篇刚讲完矩阵运算,这一篇转向工业通信中最基础的数据校验工具——CRC。从 DS18B20 温度传感器的 1-Wire CRC8 校验,到自定义通信协议的报文完整性检查,CRC 几乎是每个 PLC 工程师早晚要面对的需求。
LGF 的 CRC 校验组覆盖了三种 CRC 各两个版本(标准版和高级版),外加一个单字节专用版。本篇(上)讲 CRC8 的 3 个块——每种 CRC 位宽都支持自定义多项式,并不像某些教程说的"固定多项式"。文末有一个关于标准版和高级版真正区别的澄清。
一、CRC8 的 3 个块一览
CRC8 校验组(4.7 Data handling 前半)
| 块名 | 类型 | 版本 | 功能 |
|------|------|------|------|
| LGF_CalcCRC8 | FC | V3.1.0 | CRC8 标准版:自定义初始值 + 多项式 |
| LGF_CalcCRC8Advanced | FC | V3.1.0 | CRC8 高级版:增加最终异或值和位反射 |
| LGF_CalcCRC8For1Byte | FC | V3.0.1 | 单字节 CRC8:无需数组,直接算一个字节 |
二、引脚详解
#### LGF_CalcCRC8
| 引脚 | 类型 | 方向 | 说明 |
| initValue | Byte | IN | CRC 计算初始值(如 16#00 或 16#FF) |
| mask | Byte | IN | 生成多项式(如 0x07 对应 Dallas CRC8) |
| noOfElements | UInt | IN | 要计算的数组元素数量(0=全部元素) |
| array | Array of Byte | INOUT | 待计算的字节数组 |
| Ret_Val | Byte | OUT | 计算出的 CRC8 值 |
| error | Bool | OUT | 错误标志 |
| status | Word | OUT | 状态码 |
#### LGF_CalcCRC8Advanced
| 引脚 | 类型 | 方向 | 说明 |
| initValue | Byte | IN | CRC 计算初始值 |
| mask | Byte | IN | 生成多项式 |
| finalXorValue | Byte | IN | 最终异或值(计算完成后与结果异或) |
| reflectInput | Bool | IN | TRUE=输入字节按位反射 |
| reflectResult | Bool | IN | TRUE=输出结果按位反射 |
| noOfElements | UInt | IN | 数组元素数量(0=全部) |
| array | Array of Byte | INOUT | 待计算的字节数组 |
| Ret_Val | Byte | OUT | 计算出的 CRC8 值 |
| error | Bool | OUT | 错误标志 |
| status | Word | OUT | 状态码 |
#### LGF_CalcCRC8For1Byte
| 引脚 | 类型 | 方向 | 说明 |
| initValue | Byte | IN | CRC 初始值 |
| mask | Byte | IN | 生成多项式 |
| value | Byte | IN | 要计算的单字节数据 |
| Ret_Val | Byte | OUT | CRC8 结果 |
标准版 vs 高级版的真正区别
很多人误以为标准版是"固定多项式、不能改的"。看引脚表就知道——标准版 CalcCRC8 同样有 initValue 和 mask 参数,完全支持自定义初始值和多项式。
两者的真正区别只有三个参数:
- finalXorValue:高级版有,标准版默认为 0x00
- reflectInput:高级版有,标准版默认为 FALSE
- reflectResult:高级版有,标准版默认为 FALSE
如果你的协议只需要改多项式而不需要位反射——标准版就够了。如果你的协议要求完整的自定义 CRC(如 reflect 参数),才需要用高级版。
三、实战案例
#### 案例 1:DS18B20 温度传感器的 CRC8 校验
Dallas/Maxim 的 1-Wire 设备使用 CRC8,多项式 0x31(注意:不是常见的 0x07!实际 Dallas 1-Wire 标准用 0x8C 或 0x31,取决于方向):
DS18B20 CRC8 校验
LGF_CalcCRC8(initValue := 16#00, mask := 16#31,
noOfElements := 8, array := romCode, Ret_Val => crc8);
#### 案例 2:自定义通信协议的带反射 CRC8
某自定义协议要求 CRC8 多项式 0x07、初始值 0xFF、最终异或 0x55、输入反射:
CalcCRC8Advanced 自定义协议
LGF_CalcCRC8Advanced(initValue := 16#FF, mask := 16#07,
finalXorValue := 16#55, reflectInput := TRUE, reflectResult := FALSE,
noOfElements := 0, array := message);
noOfElements = 0 的含义
当 noOfElements = 0 时,块会自动计算整个数组的长度(即处理全部元素)。如果你想只计算数组前 N 个字节的 CRC,把 noOfElements 设为 N。这在变长报文场景中特别有用——报文头可能不参与 CRC 计算。
四、总结与下载
下载信息
| 项目 | 内容 |
|------|------|
| SIOS-ID | 109479728 |
| 下载地址 | 中文站:www.ad.siemens.com.cn/download/documentdetail_12471.html |
| 当前版本 | V5.1.1(数据以此版为准;全球站另有 V5.2.1) |
| 费用 | 完全免费 |
下篇预告:LGF 库详解 · 10——CRC 校验(下)。CRC16(Modbus RTU 标准)和 CRC32(Ethernet 标准),外加奇偶校验两兄弟 IsParityEven / IsParityOdd。下一篇同样有完整的 Modbus CRC16 配置参数。
欢迎点赞、在看、转发。还没关注的,点右上角——系列还有 15 篇。