Modbus通信协议中CRC校验的快速C语言算法

2004年第11期            福 建 电 脑  63

Modbus通信协议中CRC校验的快速C语言算法

孟开元

(西安石油大学计算机学院陕西西安710065)

【摘 要】 本文主要讨论了Modbus通信协议的RTU帧格式中常用的错误校验方法,即循环冗余校验法(CRC)。

提出了Modbus协议反转CRC校验的方法,推导了反转CRC校验快速计算表格,并用C语言实现了基于快速查表算法的循环冗余校验程序。

【关键词】 校验算法,循环冗余校验,生成多项式,查表法

1 Modbus协议应用简介

Modicon可编程控制器,既可以在它们之间,也可以和各种网络上其他的设备间进行数据传输。所支持的网络包括Mod2bus和ModbusPlus工业网络,还有标准网络,如MAP和Ether2net。网络通过控制器的接入线或者网络适配器,和Modicon可利用的出口等相连。连接关系图见图1

间,它被使用在网络中(显示为T1-T2-T3-T4,如表2)。然后被发送的是第一个域设备地址。联网的设备不断地监控网络总线,包括在‘默认’间隔期间。当第一个域(地址域)被接收到时,每台设备译解它去查找该地址的设备。在最后一个传送的字符后面,一个类似的至少3.5字符时间间隔标志者消息的结束。一个新的消息在这个间隔之后开始。整个消息帧必须作为一连续的数据流被传送。如果超过1.5字符时间的默认间隔在帧结束前发生,2所示2---T4

CRC校验域

8比特

8比特

n38比特

16比特

结束标志

T1-T2-T3-T4

2.3地址域的处理

信息框架的地址领域包括2个字符的ASCII或8个比特的RTU,有效可使用的设备地址是从1到247(十进制)单个的可使用设备被设置在从1到247。一个主地址通过信息地址领域安排从属地址。当从属地址发送响应是,它设置自己的地址在响应领域地址中,让主地址知道从地址正在工作。

地址0被用在通信地址中,这个通信地址所有的从地址都认识。当Modbus协议被用在高级的网络上时,通信不能进行,也不能用别的方法代替。例如,Modbus升级版能用一个被全球

图1 Modbus协议应用框图

共享的数据库。这个数据库能被任意更改。

全部的Modicon控制器应用Modbus数据通信协议。这个

2.4功能域的设置

协议定义了一种信息结构标准,不管信息在何种网络上传输,

信息框架的功能代码域包括两个字符的ASCII或八个字

控制器都可以识别和应用这个结构。它描述了控制器通常接

节的RTU。有效代码范围从1到255(十进制)。当然,一些代

入其他设备的进程,它如何应答别的设备的请求,如何可以检

码能适用所有的Modicon控制器,但是一些代码只可用于某些

查和显示错误。它为信息域的页面格式和内容建立了一个标

模式,并且还有一些被保留供以后使用。各信息传送各子设备

准的格式。

时,功能代码域告诉子设备所要进行哪种运行类别。例如,读

为了分析信息,Modbus协议提供了为Modicon控制器所应

一组不连续线圈或输入端的开/关状态;读一组寄存器的内容;

用的内部标准。在Modbus网络上传输期间,协议决定每个控

写指定线圈或寄存器;或者允许装载,记录,或在子设备中验证

制器如何知道它的设备地址,如何识别信息地址;决定用来操

程序。当子设备反应给主设备时,要用代码域功能显示其他的

作的类型;和提取所有的数据或包含在信息中的其他信息。

正常反应或一些错误发生(称为异常反应)。作为正常响应,子

2 Modbus协议中数据帧格式

设备简单应答原来的功能代码。作为异常反应,子设备返回一

2.1ASCII帧格式

个代码,这个代码等价于原先的功能代码(在字节中最有效的

在ASCII模式中,消息开始于一个‘:’字符(ASCII码为

设置)。除了对例外响应的功能代码修改外,子设备在响应信

3A),结束于一个‘回车/换行’对(CR/LF)(ASCII码为0D和

息数据域里设置一个唯一的代码。这样告诉主设备发生了哪

0A)。联网的设备不断地对‘:’字符监控网络总线。当一个‘:’

类错误,和错误的原因。

被接收到时,每个设备译解它去查找该地址的设备。一个典型

3 RTU错误校验域的内容

的消息帧如表1。

3.1CRC校验域的次序

表1 ASCII消息帧格式

当RTU模式用在字符格式中时,错误校验域包含一个16

开始标志地址域功能域数据域LRC校验域结束标志

比特位,相当两个8位字节的校验值。校验值是对信息内容计

1字符‘:’2字符2字符n字符2字符2字符CRLF算的CRC结果。CRC域被附加在信息最后,作为信息最后的

域。CRC域内低字节被附加在先,跟在后面的是高字节,CRC2.2RTU帧格式

在RTU模式中,消息开始于一个默认的至少3.5字符时高字节被设置为信息的最后。间的间隔。这是最容易被实现的在波特率中作为一多字符时3.2选择CRC生成器多项式

编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法相关推荐

  1. modbus协议crc校验c语言代码,MODBUS通信协议中CRC校验码的计算(C/C++)实现

    错误检测的方法 错误校验(CRC)域占用两个字节,包含了一个16位的二进制值.CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较 ...

  2. 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码

    题目要求: 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码. 如("我ABC",4)应该截为"我AB", ...

  3. 编写一个模拟航空客运定票系统的程序

    原文地址:编写一个模拟航空客运定票系统的程序作者:木木女 实习报告 题目:2.7 编写一个模拟航空客运定票系统的程序 班级: 姓名: 学号:完成日期: 一.  需求分析: 1.     程序需要模拟航 ...

  4. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数

    6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数.编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数 题目 题目描述 破题 代码 运行示例 题目 ...

  5. Java //PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星

    Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星. 注意: ...

  6. 习题:编写一个学生和教师数据输入和显示程序,学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部门。

    完整题干: 编写一个学生和教师数据输入和显示程序,学生数据有编号.姓名.班级和成绩,教师数据有编号.姓名.职称和部门.要求将编号.姓名输入和显示设计成一个类person,并作为学生数据操作类stude ...

  7. 编写一个计算机矩形的周长和面积的程序 两种方法

    编写一个计算机矩形的周长和面积的程序 操作步骤 方法一 基础篇 leight = int(input("输入矩形的长:")) width = int(input("输入矩 ...

  8. 计算机存储一个字节数是,一个字节可以存储多大的数字?

    一个字节有8位,每一位两种状态1或者0计算机储存数据是以二进制的方式,有一位为符号位,所以最大数为01111111转化为十进制数为127.若无符号,最大数为11111111转化为十进制为255.二进制 ...

  9. 如何用Python编写一个求 1到n阶乘之和的程序

    各位许久不见了,甚是想念! 前段时间我进入高中阶段学习,一直还没有适应,现在好些了就继续写博客了. 看到很多人关注我,点赞或是评论,我感觉太高兴了! C语言这块我暂时先放下了,我想自己学学Python ...

最新文章

  1. mybatis if标签比较字符串
  2. android webview实例,android WebView 使用实例
  3. 12. 定义类 【连载 12】
  4. 静态页中调用动态数据的三种办法
  5. break后面的语句还执行吗_【自学C#】|| 笔记 5 条件语句if、switch
  6. SPI参数化分配寄存器
  7. Cluster - LB - haproxy
  8. 生信宝典被分享最多的15篇文章
  9. 【BZOJ10561862】【codevs1985】排名系统,Splay+trie树
  10. 红黑树的java实现
  11. sg nc的java下载,01_SG-NC-客户端安装说明及培训材料下载 3
  12. java新建json 数组_Java创建JSON对象
  13. T60 Fan Error 解决办法.转自ZOL产品论坛-作者zxymb
  14. Redis与数据库数据同步解决方案
  15. 不用vpn的谷歌翻译网址
  16. 解决微信设置字体大小对 rem 适配方式的影响
  17. 问题记录1:网络和共享中心打不开的解决办法
  18. 32位 4G内存限制 linux,[操作系统]关于32位LINUX只支持4G内存的问题
  19. 企业跨境电商平台服务解决方案,跨境电子商务贸易业务框架搭建运维
  20. Android工程师应该具备的四大开发习惯

热门文章

  1. 《活出生命的意义》:人生有何意义?
  2. 哲学到编程:思想的实例化
  3. 产品经理,你来自江湖
  4. MySQL索引背后的数据结构及算法原理-转
  5. 如何在eclipse中装myeclipse的插件
  6. python交互式和文件式_使用Python创建和自动化交互式仪表盘
  7. rstudio 管道符号_R中的管道指南
  8. leetcode 1011. 在 D 天内送达包裹的能力(二分法)
  9. Spring—集成Junit
  10. podcast播客资源_为什么播客是我的新维基百科-完美的非正式学习资源