编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法
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语言算法相关推荐
- modbus协议crc校验c语言代码,MODBUS通信协议中CRC校验码的计算(C/C++)实现
错误检测的方法 错误校验(CRC)域占用两个字节,包含了一个16位的二进制值.CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较 ...
- 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码
题目要求: 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码. 如("我ABC",4)应该截为"我AB", ...
- 编写一个模拟航空客运定票系统的程序
原文地址:编写一个模拟航空客运定票系统的程序作者:木木女 实习报告 题目:2.7 编写一个模拟航空客运定票系统的程序 班级: 姓名: 学号:完成日期: 一. 需求分析: 1. 程序需要模拟航 ...
- Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数.编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数 题目 题目描述 破题 代码 运行示例 题目 ...
- Java //PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星
Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星. 注意: ...
- 习题:编写一个学生和教师数据输入和显示程序,学生数据有编号、姓名、班级和成绩,教师数据有编号、姓名、职称和部门。
完整题干: 编写一个学生和教师数据输入和显示程序,学生数据有编号.姓名.班级和成绩,教师数据有编号.姓名.职称和部门.要求将编号.姓名输入和显示设计成一个类person,并作为学生数据操作类stude ...
- 编写一个计算机矩形的周长和面积的程序 两种方法
编写一个计算机矩形的周长和面积的程序 操作步骤 方法一 基础篇 leight = int(input("输入矩形的长:")) width = int(input("输入矩 ...
- 计算机存储一个字节数是,一个字节可以存储多大的数字?
一个字节有8位,每一位两种状态1或者0计算机储存数据是以二进制的方式,有一位为符号位,所以最大数为01111111转化为十进制数为127.若无符号,最大数为11111111转化为十进制为255.二进制 ...
- 如何用Python编写一个求 1到n阶乘之和的程序
各位许久不见了,甚是想念! 前段时间我进入高中阶段学习,一直还没有适应,现在好些了就继续写博客了. 看到很多人关注我,点赞或是评论,我感觉太高兴了! C语言这块我暂时先放下了,我想自己学学Python ...
最新文章
- mybatis if标签比较字符串
- android webview实例,android WebView 使用实例
- 12. 定义类 【连载 12】
- 静态页中调用动态数据的三种办法
- break后面的语句还执行吗_【自学C#】|| 笔记 5 条件语句if、switch
- SPI参数化分配寄存器
- Cluster - LB - haproxy
- 生信宝典被分享最多的15篇文章
- 【BZOJ10561862】【codevs1985】排名系统,Splay+trie树
- 红黑树的java实现
- sg nc的java下载,01_SG-NC-客户端安装说明及培训材料下载 3
- java新建json 数组_Java创建JSON对象
- T60 Fan Error 解决办法.转自ZOL产品论坛-作者zxymb
- Redis与数据库数据同步解决方案
- 不用vpn的谷歌翻译网址
- 解决微信设置字体大小对 rem 适配方式的影响
- 问题记录1:网络和共享中心打不开的解决办法
- 32位 4G内存限制 linux,[操作系统]关于32位LINUX只支持4G内存的问题
- 企业跨境电商平台服务解决方案,跨境电子商务贸易业务框架搭建运维
- Android工程师应该具备的四大开发习惯