『7x24小时有问必答』

▎西门子博途 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
引脚类型方向说明
initValueByteINCRC 计算初始值(如 16#00 或 16#FF)
maskByteIN生成多项式(如 0x07 对应 Dallas CRC8)
noOfElementsUIntIN要计算的数组元素数量(0=全部元素)
arrayArray
  • of Byte
  • INOUT待计算的字节数组
    Ret_ValByteOUT计算出的 CRC8 值
    errorBoolOUT错误标志
    statusWordOUT状态码
    #### LGF_CalcCRC8Advanced
    引脚类型方向说明
    initValueByteINCRC 计算初始值
    maskByteIN生成多项式
    finalXorValueByteIN最终异或值(计算完成后与结果异或)
    reflectInputBoolINTRUE=输入字节按位反射
    reflectResultBoolINTRUE=输出结果按位反射
    noOfElementsUIntIN数组元素数量(0=全部)
    arrayArray
  • of Byte
  • INOUT待计算的字节数组
    Ret_ValByteOUT计算出的 CRC8 值
    errorBoolOUT错误标志
    statusWordOUT状态码
    #### LGF_CalcCRC8For1Byte
    引脚类型方向说明
    initValueByteINCRC 初始值
    maskByteIN生成多项式
    valueByteIN要计算的单字节数据
    Ret_ValByteOUTCRC8 结果

    标准版 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 篇。

    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    上一主题上一主题         下一主题下一主题
    QQ手机版小黑屋粤ICP备17165530号

    关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

    法律保护:PLC技术网,plcjs.com,plcjs.net等字样
    Copyright 2010-2030. All rights reserved. 


    微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码