编写一个字节数的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

1-780-png_6_0_0_59_453_364_276_862.5_1236-946-0-269-946.jpg

间,它被使用在网络中(显示为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生成器多项式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode1319. 连通网络的操作次数(并查集)

用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个…

Codeforces 600E Lomsat gelral (树上启发式合并)

题目链接 Lomsat gelral 占坑……等深入理解了再来补题解…… #include <bits/stdc.h>using namespace std;#define rep(i, a, b) for (int i(a); i < (b); i)typedef long long LL;const int N 600010;int n; int cc[N], col[N], sz[N], son[N]; LL ans[N];vect…

如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘

问题产生背景&#xff1a; 使用CloudStack KVM组合进行资源池纳管工作&#xff0c;通过ISO镜像文件创建了两个模板&#xff1a; RHEL6U3 64位系统以及WindowsServer2008 R2 SP1 64位系统。然后通过模板创建实例&#xff0c;挂载外接存储&#xff0c;实例启动后&#xff0c;通过…

云计算openstack介绍

转载于:https://www.cnblogs.com/WIU1905/p/11107593.html

C语言Node lt T gt,c语言论坛填空;#includelt;stdio.hgt;# 爱问知识人

填空&#xff1b;#include #include #define N 6typedef struct node {int data;struct node *next;填空&#xff1b;#include #include #define N 6typedef struct node {int data;struct node *next;} NODE;void fun(NODE *h){ NODE *p, *q; int t;/**********found*********…

gitlab设置邮件服务器_如何设置您自己的一次性电子邮件服务器

gitlab设置邮件服务器by Oren Geva由Oren Geva 如何设置您自己的一次性电子邮件服务器 (How To Setup Your Own Disposable Email Server) Disposable email services are online services that provide temporary email addresses for registering or signing up on websites…

leetcode442. 数组中重复的数据

给定一个整数数组 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08;n为数组长度&#xff09;, 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗&#xff1f; 示例&#xff1a; 输入: [4,3,2…

C语言基础注意点

一、基础知识篇 &#xff08;一&#xff09;关键字 1&#xff0c;存储类型 A、auto 声明自动变量&#xff0c;一般不使用 B、static 声明静态变量 C、extern 声明变量是在其他文件正声明&#xff08;可看做引用变量&#xff09; D、register 声明积有器变量 2、常用…

**加密解密基础、PKI及SSL、创建私有CA**

进程间通信 socket通信 客户端-->请求--> 路由转发 --> 服务端&#xff0c;取出资源 --> 封装为可响应给客户端的请求报文从接收请求端口发出 SSL/TLS协议的实现 OpenSSL OpenSSL程序组件 1234[rootlocalhost CA]# rpm -ql openssl /usr/lib/libcrypto.so.10 //加…

json 文件打读取

1。获取文件路径 /** BookController.class.getClassLoader().getResource("static/json/book_nav.json").getPath() 获取当期运行时的项目json文件路径*/JSONObject json JsonResourceUtils.getJsonObjFromResource(BookController.class.getClassLoader().getReso…

16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M

#define _iic_h_//pic单片机IIC通信初始化函数声明void iiccsh(void);//pic单片机IIC通信读外围设备函数声明//功能&#xff1a;传送一个8位地址&#xff0c;返回一个8位数据unsigned char iicread(unsigned char data);//pic单片机IIC通信给外围器件发送函数声明//功能&#x…

如何从XMLHttpRequest创建自定义获取API

What is your worst nightmare?你最可怕的噩梦是什么&#xff1f; That sounded dark, but it’s not a rhetorical question. I really want to know because I am about to tell you mine. Along the way, we will learn some things like how the fetch API works and als…

leetcode637. 二叉树的层平均值

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。示例 1&#xff1a;输入&#xff1a;3/ \9 20/ \15 7 输出&#xff1a;[3, 14.5, 11] 解释&#xff1a; 第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。/*** Definition for a b…

5.3 上午

观看英语课程——《恋练有词》 学习Linux 转载于:https://www.cnblogs.com/bgd140206110/p/6801164.html

AD库转换为KiCAD库的方法

AD库转换为KiCAD库的方法 参照博主另外一篇文档&#xff1a; AD转换为KiCAD的方法&#xff0c;点击此处转载于:https://www.cnblogs.com/zhiqiang_zhang/p/11109560.html

遗传算法求解装箱问题c语言,求解装箱问题的遗传算法-南昌航空大学期刊网.pdf...

求解装箱问题的遗传算法-南昌航空大学期刊网1998 2 Journal of Nanchang Institute of Aeronautical Technology 21998方 平    李 娟( 南昌航空工业学院)  ( 西北工业大学): ( Bin Packing) ,, , D( irst it De-creasing) ,: ; ; ;: TP301. 6( )( Bin Packing) , :1 2 …

mysql索引随记

为什么80%的码农都做不了架构师&#xff1f;>>> 先了解下Btree&#xff1a;https://my.oschina.net/u/3646190/blog/1593094 为什么每个数据项&#xff0c;即索引字段要尽量的小&#xff0c;比如int占4字节&#xff0c;要比bigint8字节少一半&#xff1f; 通过上面…

leetcode79. 单词搜索(回溯算法)

给定一个二维网格和一个单词&#xff0c;找出该单词是否存在于网格中。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 示例: board [ [‘A’,‘…

react钩子_迷上了钩子:如何使用React的useReducer()

react钩子So the React Conference just happened and as always something new happened. Hooks happened! The React team talked about suspense, lazy loading, concurrent rendering, and hooks :D.因此&#xff0c;React会议刚刚发生&#xff0c;并且一如既往地发生了一些…

开发注意事项

明确需求 - 沟通 - 定好上下游接口 次序乱不得转载于:https://www.cnblogs.com/zslzz/p/6802437.html