Modbus通信协议中CRC校验的快速C语言算法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Modbus 通信协议中 CRC 值表格采用 16 位 CRC16 多项式 (X16 +X15 +X2 +1)的反转 CRC 多项式 。 反转多项式 是指在数 据通讯时 , 信息字 节先传 或 接收 低位 字节 , 如 重新 排位 则影 响 CRC 计算速度 , 故设 反转多 项式 。 X 15 +X2 +1 多 项式 码为 100A Hex(0001 0000 0000 1010), 故 反转 多 项式 码码 为 A 001 Hex(1010 0000 0000 0001)。
当 RT U 模式用在 字符格式中 时 , 错误校 验域 包含一 个 16 比特位 , 相当两个 8 位字节的 校验值 。 校验值 是对信息 内容计 算的 CRC 结果 。 CRC 域 被附 加在 信息 最后 , 作 为信 息最 后的 域 。CRC 域内低字 节被 附加 在先 , 跟 在后 面的 是高 字节 , CRC 高字节被设置为信息的最后 。 3.2 选择 CRC 生成器多项式
地址 0 被用在通信地址中 , 这个通 信地址 所有的从 地址都 认识 。 当 M odbus 协议被用在高 级的网络上 时 , 通 信不能 进行 , 也不能用别的方法代替 。 例如 , M odbus 升级版能用一个被全球 共享的数据库 。 这个数据库能被任意更改 。 2.4 功能域的设置
信息框架的功能 代码 域包 括两 个字 符的 ASCI I 或八 个字 节的 RT U 。 有效代码范围从 1 到 255(十 进制)。 当然 , 一些代 码能适用所有的 M odicon 控 制器 , 但是一 些代码 只可用 于某些 模式 , 并且还有一些被保留供 以后使 用 。 各信 息传送各 子设备 时 , 功能代码域告 诉子 设备 所要 进行 哪种 运行 类别 。 例如 , 读 一组不连续线圈或输入端的 开/ 关状 态 ;读 一组寄 存器的 内容 ; 写指定线圈或寄存器 ;或者允 许装载 , 记录 , 或 在子设备 中验证 程序 。 当子设备反应给主设备时 , 要用 代码域 功能显示 其他的 正常反应或一些错误发生(称为异 常反应)。 作为 正常响 应 , 子 设备简单应答原来的功能代码 。 作 为异常 反应 , 子设备 返回一 个代码 , 这个代码 等价 于原先 的功 能代码(在字 节中 最有 效的 设置)。 除了对例 外响应 的功 能代 码修 改外 , 子 设备 在响 应信 息数据域里设置 一个唯 一的 代码 。 这 样告 诉主 设备 发生 了哪 类错误 , 和错误的原因 。 3 RTU 错误校验域的内容 3.1 CRC 校验域的次序
64
福 建 电 脑 2004 年第 11 期
有两种通行的 16 位 CRC 多 项式 。 第 一种 是由 CCI T T 规 定的 。 经由信息段内各 字符 连接 而成 的信 息位 串对 应信 息多 项式的系数 , 信息多项式共有 n-16 项 , 即从 Xn -1 到 X16(n=信 息块或信息段总位数)。 这个多 项式要 生成多项 式作模 2 除法 运算 。 校验位串对应于上述除法最终得 到的余数 多项式的 X15 到 X0 项的系数 。 这个多项式简称为 CRC -CCI T T :X16 +X12 + X 5 +1。 最先由 IBM 用在第 一个 软盘控 制器(M odel 3770)上 , 很快便成为了微计算机 软盘控 制器的 标准 。 它也 用在 IBM 有 名的同步协议 HDLC/ SDLC(高级数据连接控 制/ 同步 数据连接 控制)中 。
另一种广为使用的 CRC 生成 多项式是 CRC -16:X16 +X15 +X2 +1 。 这种多项式尽管在捕获错误时不如 CRC-CCI T T 有 效 , 但它仍然得以 流行 。 其 原因 是它 有着长 久的 历史(在 IBM 的 BYSYN C— 二 进 制 同 步 通 信 协 议 — 中 使 用)。 M odbus 中 CRC 校验算法就是采用的就是 CRC -16 生成多项式 。 4 Modbus 中 CRC 校验快速 C 语言程序的实现 4 .1 Modbus 通信协议 CRC算 法
表 2 RT U 消息帧
开始标志 地址域 功能域 数据域 CRC 校验域 结束标志
图 1 M odbus 协议 应用框图 全部的 M odicon 控制器应 用 M odbus 数据 通信协 议 。 这个 协议定义了一种信息 结构 标准 , 不 管信 息在 何种 网络 上传 输 , 控制器都可 以识别 和应 用这个 结构 。 它描 述了 控制 器通 常接 入其他设备 的进程 , 它如 何应 答别 的设 备的 请求 , 如 何可 以检 查和显示错误 。 它为信 息域 的页 面格 式和 内容 建立 了一 个标 准的格式 。 为了分析信息 , M odbus 协议提供了为 M odicon 控 制器所应 用的内部标准 。 在 M odbus 网 络上 传输 期间 , 协 议决 定每 个控 制器如何知 道它的设 备地 址 , 如何 识别 信息 地址 ;决 定用 来操 作的类型 ;和提取所有的数据或包含在信息中 的其他信息 。 2 Modbus 协议中数据帧格式 2 .1 ASCII 帧格式 在 ASCI I 模 式 中 , 消 息 开 始于 一 个` :' 字 符(ASCI I 码 为 3A), 结束于一 个` 回 车/ 换 行' 对(CR/ LF)(ASCII 码 为 0D 和 0A)。 联网的设备不断地对` :' 字 符监控网络 总线 。 当一 个` :' 被接收到时 , 每个设备译解它 去查找 该地址 的设备 。 一 个典型 的消息帧如表 1。
T 1 -T 2 -T 3 -T 4 8 比特
8 比 特 n *8 比特
16 比特
T 1 -T 2 -T 3 -T 4
2.3 地址域的处理 信息框架的地址领域包括 2 个字符的 ASCII 或 8 个比特的
RT U , 有效可使用的设 备地址 是从 1 到 247(十 进制)单 个的可 使用设备被设置在从 1 到 247。 一个主地 址通过信 息地址领域 安排从属地址 。 当从属地址发送响 应是 , 它设 置自己的 地址在 响应领域地址中 , 让主地址知 道从地址正在工作 。
63modbus通信协议中crc校验的快速语言算法孟开元西安石油大学计算机学院陕西西安710065本文主要讨论了modbus通信协议的tu帧格式中常用的错误校验方法modbus协议反转crc校验的方法推导了反转crc校验快速计算表格语言实现了基于快速查表算法的循环冗余校验程序关键词校验算法循环冗余校验生成多项式查表法modbus协议应用简介modicon可编程控制器既可以在它们之间也可以和各种网络上其他的设备间进行数据传输
/ * 高 8 位 CRC 校验表 */ unsigned char CRCHig hBy teT able[ 256] = {
0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40,
2004 年第 11 期 福 建 电 脑
63
Modbus 通信协议中 CRC 校验的快速 C 语言算法
孟 开元
(西安石油大 学 计算机学院 陕西 西安 710065)
【摘 要】 本文主要讨论了 Modbus 通信协议的 R T U 帧 格式中常用的错误校验方法 , 即循环 冗余校验法(CRC)。 提出了 Modbus 协议反转 CRC 校验的方法 , 推导了反转 CRC 校验快 速计算 表格 , 并用 C 语 言实现 了基于快 速查 表算法的循环冗余校验程序 。 【关键词】 校验算法 , 循环冗余校验 , 生成多项式 , 查表法
表 1 ASCI I 消息帧格 式
开始标志 地址域 功能域 数据域 LRC 校验域 结束标志
1 字符` :' 2 字符 2 字符 n 字符 2 字符
2 字符 CR LF
2 .2 RTU 帧格式 在 RT U 模式中 , 消息开 始于 一个 默认 的至 少 3 .5 字 符时
间的间隔 。 这是最容易 被实 现的 在波 特率 中作 为一 多字 符时
Modbus 中生成 CRC 的步骤为 : 1)预 置一个 16 位寄 存器为十六进制数 FFF F(全为 1), 该 寄存器称为 CRC 寄存器 。 2)把 第一个 8 位数 据与 16 位 CRC 寄存器 的低 8 位相异 或 , 将结果放于 CRC 寄存器中 ; 3)把寄存器的内容右移 一位(向最低位 LSB 方向), 用 0 填 补最高位 M SB , 并检查最低位 ; 4)如果最低位 LSB 为 0, 重复步骤 3(再次移位); 如果最低位 LSB 为 1 , CRC 寄 存器 与多 项 式码 A001 Hex (1010 0000 0000 0001)进行异或 ; 5)重复步骤 3 和 4 , 直到右移 8 次 , 这样整个 8 位数据全部 进行了处理 ; 6)重 复步骤 2 到 5, 进行下一个 8 位数据的处理 ;直到所有 的字节被处理 。 7)最后得到的 CRC 寄存器内容即为 CRC 码 。 必须注意 , 当 CRC 寄存器 值被置入 消息时 , 它 的高位 和低 位字节必须交换 。 当 16 位 CRC(两个 8 位字节)在消息 中被传 送 , 低位字节将先被传送 , 随后传送高位字节 。 4 .2 CRC表的生成过 程 如果每次参与 CRC 计算的信 息为一个字节 , 该信息字节加 到 16 位的累加器中去时 , 只有 累加器的高 8 位或低 8 位与信息 字节相异或 , 异或 的结果 记为 组合 值 , 那么 累加 器中 的新 值等 于组合值加 上(按模 2 异或)累 加器中 未改 变的 那一 半即 为新 的 CRC 值 。 组合值只有 256 种可能 , 因此可利用硬件模拟算法 先算好它们的 CRC 值预先填入一 张表中 , 该表的每一单元对应 相对值的 CRC 。 这样 就可 以通 过查 表法 来计 算 C RC 值 , 以便 大大提高 CRC 运算的速度 。
1 Modbus 协议应用简介 Modicon 可编程控制器 , 既可以在它 们之间 , 也可以 和各种
网络上其他的设备间进行数 据传输 。 所支持的 网络包 括 M odbus 和 Modbus Plus 工业网络 , 还有标准 网络 , 如 M AP 和 Ethernet。 网络通过控 制器的接入线或者网 络适配 器 , 和 M odicon 可 利用的出口等相连 。 连接关系图见图 1 。
间 , 它被使用在网络中(显示为 T 1 -T 2 -T 3 -T 4 , 如 表 2)。 然 后被发送的是第 一个域 设备 地址 。 联 网的 设备 不断 地监 控网 络总线 , 包括在` 默认' 间隔期 间 。 当第 一个域(地址 域)被接收 到时 , 每台设备译解它去查找 该地址 的设备 。 在最后一 个传送 的字符后面 , 一个类似的至少 3.5 字符 时间间 隔标志者 消息的 结束 。 一个新的消息 在这 个间 隔之 后 开始 。 整 个消 息帧 必须 作为一连续的数据 流被传 送 。 如 果超 过 1 .5 字 符时 间的 默认 间隔在帧结束前发生 , 接收设备 删除不 完全的 消息并且 假设下 一个字节将是一条新消息的地址域 。 一个典型的 消息帧如 表 2 所示 。
当 RT U 模式用在 字符格式中 时 , 错误校 验域 包含一 个 16 比特位 , 相当两个 8 位字节的 校验值 。 校验值 是对信息 内容计 算的 CRC 结果 。 CRC 域 被附 加在 信息 最后 , 作 为信 息最 后的 域 。CRC 域内低字 节被 附加 在先 , 跟 在后 面的 是高 字节 , CRC 高字节被设置为信息的最后 。 3.2 选择 CRC 生成器多项式
地址 0 被用在通信地址中 , 这个通 信地址 所有的从 地址都 认识 。 当 M odbus 协议被用在高 级的网络上 时 , 通 信不能 进行 , 也不能用别的方法代替 。 例如 , M odbus 升级版能用一个被全球 共享的数据库 。 这个数据库能被任意更改 。 2.4 功能域的设置
信息框架的功能 代码 域包 括两 个字 符的 ASCI I 或八 个字 节的 RT U 。 有效代码范围从 1 到 255(十 进制)。 当然 , 一些代 码能适用所有的 M odicon 控 制器 , 但是一 些代码 只可用 于某些 模式 , 并且还有一些被保留供 以后使 用 。 各信 息传送各 子设备 时 , 功能代码域告 诉子 设备 所要 进行 哪种 运行 类别 。 例如 , 读 一组不连续线圈或输入端的 开/ 关状 态 ;读 一组寄 存器的 内容 ; 写指定线圈或寄存器 ;或者允 许装载 , 记录 , 或 在子设备 中验证 程序 。 当子设备反应给主设备时 , 要用 代码域 功能显示 其他的 正常反应或一些错误发生(称为异 常反应)。 作为 正常响 应 , 子 设备简单应答原来的功能代码 。 作 为异常 反应 , 子设备 返回一 个代码 , 这个代码 等价 于原先 的功 能代码(在字 节中 最有 效的 设置)。 除了对例 外响应 的功 能代 码修 改外 , 子 设备 在响 应信 息数据域里设置 一个唯 一的 代码 。 这 样告 诉主 设备 发生 了哪 类错误 , 和错误的原因 。 3 RTU 错误校验域的内容 3.1 CRC 校验域的次序
64
福 建 电 脑 2004 年第 11 期
有两种通行的 16 位 CRC 多 项式 。 第 一种 是由 CCI T T 规 定的 。 经由信息段内各 字符 连接 而成 的信 息位 串对 应信 息多 项式的系数 , 信息多项式共有 n-16 项 , 即从 Xn -1 到 X16(n=信 息块或信息段总位数)。 这个多 项式要 生成多项 式作模 2 除法 运算 。 校验位串对应于上述除法最终得 到的余数 多项式的 X15 到 X0 项的系数 。 这个多项式简称为 CRC -CCI T T :X16 +X12 + X 5 +1。 最先由 IBM 用在第 一个 软盘控 制器(M odel 3770)上 , 很快便成为了微计算机 软盘控 制器的 标准 。 它也 用在 IBM 有 名的同步协议 HDLC/ SDLC(高级数据连接控 制/ 同步 数据连接 控制)中 。
另一种广为使用的 CRC 生成 多项式是 CRC -16:X16 +X15 +X2 +1 。 这种多项式尽管在捕获错误时不如 CRC-CCI T T 有 效 , 但它仍然得以 流行 。 其 原因 是它 有着长 久的 历史(在 IBM 的 BYSYN C— 二 进 制 同 步 通 信 协 议 — 中 使 用)。 M odbus 中 CRC 校验算法就是采用的就是 CRC -16 生成多项式 。 4 Modbus 中 CRC 校验快速 C 语言程序的实现 4 .1 Modbus 通信协议 CRC算 法
表 2 RT U 消息帧
开始标志 地址域 功能域 数据域 CRC 校验域 结束标志
图 1 M odbus 协议 应用框图 全部的 M odicon 控制器应 用 M odbus 数据 通信协 议 。 这个 协议定义了一种信息 结构 标准 , 不 管信 息在 何种 网络 上传 输 , 控制器都可 以识别 和应 用这个 结构 。 它描 述了 控制 器通 常接 入其他设备 的进程 , 它如 何应 答别 的设 备的 请求 , 如 何可 以检 查和显示错误 。 它为信 息域 的页 面格 式和 内容 建立 了一 个标 准的格式 。 为了分析信息 , M odbus 协议提供了为 M odicon 控 制器所应 用的内部标准 。 在 M odbus 网 络上 传输 期间 , 协 议决 定每 个控 制器如何知 道它的设 备地 址 , 如何 识别 信息 地址 ;决 定用 来操 作的类型 ;和提取所有的数据或包含在信息中 的其他信息 。 2 Modbus 协议中数据帧格式 2 .1 ASCII 帧格式 在 ASCI I 模 式 中 , 消 息 开 始于 一 个` :' 字 符(ASCI I 码 为 3A), 结束于一 个` 回 车/ 换 行' 对(CR/ LF)(ASCII 码 为 0D 和 0A)。 联网的设备不断地对` :' 字 符监控网络 总线 。 当一 个` :' 被接收到时 , 每个设备译解它 去查找 该地址 的设备 。 一 个典型 的消息帧如表 1。
T 1 -T 2 -T 3 -T 4 8 比特
8 比 特 n *8 比特
16 比特
T 1 -T 2 -T 3 -T 4
2.3 地址域的处理 信息框架的地址领域包括 2 个字符的 ASCII 或 8 个比特的
RT U , 有效可使用的设 备地址 是从 1 到 247(十 进制)单 个的可 使用设备被设置在从 1 到 247。 一个主地 址通过信 息地址领域 安排从属地址 。 当从属地址发送响 应是 , 它设 置自己的 地址在 响应领域地址中 , 让主地址知 道从地址正在工作 。
63modbus通信协议中crc校验的快速语言算法孟开元西安石油大学计算机学院陕西西安710065本文主要讨论了modbus通信协议的tu帧格式中常用的错误校验方法modbus协议反转crc校验的方法推导了反转crc校验快速计算表格语言实现了基于快速查表算法的循环冗余校验程序关键词校验算法循环冗余校验生成多项式查表法modbus协议应用简介modicon可编程控制器既可以在它们之间也可以和各种网络上其他的设备间进行数据传输
/ * 高 8 位 CRC 校验表 */ unsigned char CRCHig hBy teT able[ 256] = {
0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x01, 0xc0 , 0x 80 , 0x 41 , 0x 00 , 0x c1, 0x81, 0x40, 0x00, 0xc1 ,0x 81 ,0x 40 ,0x 01 ,0x c0, 0x80, 0x41, 0x00, 0xc1 , 0x 81 , 0x 40 , 0x 01 , 0x c0, 0x80, 0x41, 0x01, 0xc0 ,0x 80 ,0x 41 ,0x 00 ,0x c1, 0x81, 0x40,
2004 年第 11 期 福 建 电 脑
63
Modbus 通信协议中 CRC 校验的快速 C 语言算法
孟 开元
(西安石油大 学 计算机学院 陕西 西安 710065)
【摘 要】 本文主要讨论了 Modbus 通信协议的 R T U 帧 格式中常用的错误校验方法 , 即循环 冗余校验法(CRC)。 提出了 Modbus 协议反转 CRC 校验的方法 , 推导了反转 CRC 校验快 速计算 表格 , 并用 C 语 言实现 了基于快 速查 表算法的循环冗余校验程序 。 【关键词】 校验算法 , 循环冗余校验 , 生成多项式 , 查表法
表 1 ASCI I 消息帧格 式
开始标志 地址域 功能域 数据域 LRC 校验域 结束标志
1 字符` :' 2 字符 2 字符 n 字符 2 字符
2 字符 CR LF
2 .2 RTU 帧格式 在 RT U 模式中 , 消息开 始于 一个 默认 的至 少 3 .5 字 符时
间的间隔 。 这是最容易 被实 现的 在波 特率 中作 为一 多字 符时
Modbus 中生成 CRC 的步骤为 : 1)预 置一个 16 位寄 存器为十六进制数 FFF F(全为 1), 该 寄存器称为 CRC 寄存器 。 2)把 第一个 8 位数 据与 16 位 CRC 寄存器 的低 8 位相异 或 , 将结果放于 CRC 寄存器中 ; 3)把寄存器的内容右移 一位(向最低位 LSB 方向), 用 0 填 补最高位 M SB , 并检查最低位 ; 4)如果最低位 LSB 为 0, 重复步骤 3(再次移位); 如果最低位 LSB 为 1 , CRC 寄 存器 与多 项 式码 A001 Hex (1010 0000 0000 0001)进行异或 ; 5)重复步骤 3 和 4 , 直到右移 8 次 , 这样整个 8 位数据全部 进行了处理 ; 6)重 复步骤 2 到 5, 进行下一个 8 位数据的处理 ;直到所有 的字节被处理 。 7)最后得到的 CRC 寄存器内容即为 CRC 码 。 必须注意 , 当 CRC 寄存器 值被置入 消息时 , 它 的高位 和低 位字节必须交换 。 当 16 位 CRC(两个 8 位字节)在消息 中被传 送 , 低位字节将先被传送 , 随后传送高位字节 。 4 .2 CRC表的生成过 程 如果每次参与 CRC 计算的信 息为一个字节 , 该信息字节加 到 16 位的累加器中去时 , 只有 累加器的高 8 位或低 8 位与信息 字节相异或 , 异或 的结果 记为 组合 值 , 那么 累加 器中 的新 值等 于组合值加 上(按模 2 异或)累 加器中 未改 变的 那一 半即 为新 的 CRC 值 。 组合值只有 256 种可能 , 因此可利用硬件模拟算法 先算好它们的 CRC 值预先填入一 张表中 , 该表的每一单元对应 相对值的 CRC 。 这样 就可 以通 过查 表法 来计 算 C RC 值 , 以便 大大提高 CRC 运算的速度 。
1 Modbus 协议应用简介 Modicon 可编程控制器 , 既可以在它 们之间 , 也可以 和各种
网络上其他的设备间进行数 据传输 。 所支持的 网络包 括 M odbus 和 Modbus Plus 工业网络 , 还有标准 网络 , 如 M AP 和 Ethernet。 网络通过控 制器的接入线或者网 络适配 器 , 和 M odicon 可 利用的出口等相连 。 连接关系图见图 1 。
间 , 它被使用在网络中(显示为 T 1 -T 2 -T 3 -T 4 , 如 表 2)。 然 后被发送的是第 一个域 设备 地址 。 联 网的 设备 不断 地监 控网 络总线 , 包括在` 默认' 间隔期 间 。 当第 一个域(地址 域)被接收 到时 , 每台设备译解它去查找 该地址 的设备 。 在最后一 个传送 的字符后面 , 一个类似的至少 3.5 字符 时间间 隔标志者 消息的 结束 。 一个新的消息 在这 个间 隔之 后 开始 。 整 个消 息帧 必须 作为一连续的数据 流被传 送 。 如 果超 过 1 .5 字 符时 间的 默认 间隔在帧结束前发生 , 接收设备 删除不 完全的 消息并且 假设下 一个字节将是一条新消息的地址域 。 一个典型的 消息帧如 表 2 所示 。