CN103546467B - 在TCP/IP网络上应用Modbus RTU协议的方法 - Google Patents
在TCP/IP网络上应用Modbus RTU协议的方法 Download PDFInfo
- Publication number
- CN103546467B CN103546467B CN201310500238.6A CN201310500238A CN103546467B CN 103546467 B CN103546467 B CN 103546467B CN 201310500238 A CN201310500238 A CN 201310500238A CN 103546467 B CN103546467 B CN 103546467B
- Authority
- CN
- China
- Prior art keywords
- frame
- byte
- data field
- current
- length
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Abstract
本发明公开了一种在TCP/IP网络上应用Modbus RTU协议的方法,该TCP/IP网络中包括客户端和服务器端,包括如下步骤:对于每一请求帧:首先读取前两个字节,根据功能码判断当前请求帧的数据区的字节长度,服务器端获取数据区的内容;服务器端读取当前请求帧的下两个字节,获取CRC校验码;对于每一应答帧:首先读取前两个字节,根据功能码判断当前应答帧的数据区的字节长度,客户端获取数据区的内容;客户端读取当前应答帧的下两个字节,获取CRC校验码。本发明具有以下有益效果:实现了Modbus RTU协议在TCP/IP网络上的应用,且应用效果稳定;根据Modbus RTU协议每一帧中的功能码推断该帧的字节大小,能准确判断出每一帧的大小,有效鉴别每一帧的结束。
Description
技术领域
本发明属于通信技术领域,具体涉及一种在TCP/IP网络上应用ModbusRTU协议的方法。
背景技术
工业标准Modbus协议在工业现场的通信方式上被广泛使用,Modbus协议有两种格式,即:Modbus RTU和Modbus TCP/IP。其中前者使用在485串口总线之类的场景下,后者使用在TCP/IP网络环境下。但由于特殊的需求,有些情况下需要在TCP/IP网络下应用Modbus RTU格式的协议数据,然而由于Modbus RTU格式和TCP/IP网络分别具有各自的特点,不能相互兼容,目前没有实现Modbus RTU协议在TCP/IP网络下应用的有效方法。
Modbus是以帧为单位的通信协议,其中每一帧的格式具有明确定义。其在串行线路上的实现Modbus RTU则充分利用485等串行总线的特点,使用时间缝隙来进行帧的区分,即如果在规定的时间内没有收到更多信号,则认为一帧接收完毕,如果继续收到信号,则认为是新一帧的开始。而由于TCP/IP网络的本身特点,无法利用时间缝隙来区分两帧,而Modbus RTU并非为TCP/IP网络设计,在协议本身的字段中,没有足够的显式信息可在TCP/IP网络中鉴别出一帧的结束。因此,目前难以实现Modbus RTU协议在TCP/IP网络上的应用。
发明内容
为了克服现有技术中存在的缺陷,本发明一种在TCP/IP网络上应用Modbus RTU协议的方法,本发明具体的技术方案如下:
在TCP/IP网络上应用Modbus RTU协议的方法,该TCP/IP网络中包括客户端和服务器端,包括如下步骤:
步骤S1,客户端向服务器端发送请求,请求中包括若干请求帧,等待服务器端回应;
步骤S2,服务器端依次接收请求帧,对于每一请求帧:
服务器端读取当前请求帧的第一个字节,获取从站地址;
服务器端读取当前请求帧的下一个字节,获取功能码;
根据功能码判断当前请求帧的数据区的字节长度;设请求帧数据区的字节长度为N,服务器端读取当前请求帧的下N个字节,获取数据区的内容;
服务器端读取当前请求帧的下两个字节,获取CRC校验码,当前请求帧接收完毕;
步骤S3,服务器端向客户端发送应答,应答中包括若干应答帧;
步骤S4,客户端依次接收应答帧,对于每一应答帧:
客户端读取当前应答帧的第一个字节,获取从站地址;
客户端读取当前应答帧的下一个字节,获取功能码;
根据功能码判断当前应答帧的数据区的字节长度;设应答帧数据区的字节长度为M,客户端读取当前应答帧的下M个字节,获取数据区的内容;
客户端读取当前应答帧的下两个字节,获取CRC校验码,当前应答帧接收完毕。
作为优化方案,步骤S2中根据功能码判断当前请求帧的数据区的字节长度的方法具体为:判断功能码是否为0x03,若是则认为请求帧数据区的字节长度为4个字节;
步骤S4中根据功能码判断当前应答帧的数据区的字节长度的方法具体为:判断功能码是否为0x03,若是则读取下一个字节,获取字节数,设字节数为P;应答帧数据区的字节长度为1+P个字节。
作为优化方案,步骤S2中根据功能码判断当前请求帧的数据区的字节长度的方法具体为:判断功能码是否为0x06,若是则认为请求帧数据区的字节长度为4个字节;
步骤S4中根据功能码判断当前应答帧的数据区的字节长度的方法具体为:判断功能码是否为0x06,若是则认为应答帧数据区的字节长度为4个字节。
作为优化方案,步骤S2中根据功能码判断当前请求帧的数据区的字节长度的方法具体为:判断功能码是否为0x10,若是则
读取下两个字节,获取写入地址;
读取下一个字节,获取写入长度的高位,设写入长度的高位为H;读取下一个字节,获取写入长度的低位,设写入长度的低位为L;
请求帧数据区的字节长度为4+H×256+L个字节;
步骤S4中根据功能码判断当前应答帧的数据区的字节长度的方法具体为:判断功能码是否为0x10,若是则认为应答帧数据区的字节长度为4个字节。
作为优化方案,步骤S4中根据功能码判断当前应答帧的数据区的字节长度的方法进一步包括:判断功能码的最高位是否为1,若是则认为应答帧数据区的字节长度为1个字节。
作为优化方案,步骤S1之前还包括:步骤S0,服务器端在一socket端口开启监听,客户端向此socket端口建立连接,开始通信。
作为优化方案,步骤S4之后还包括:循环重复执行步骤S1至S4。
与现有技术相比,本发明具有以下有益效果:
(1)本发明实现了Modbus RTU协议在TCP/IP网络上的应用,且应用效果稳定;
(2)本发明根据Modbus RTU协议每一帧中的功能码推断该帧的字节大小,能准确判断出每一帧的大小,有效鉴别每一帧的结束。
附图说明
图1为本发明的总流程图;
图2为本发明请求帧的接收流程图;
图3为本发明应答帧的接收流程图。
具体实施方式
先简单介绍一下每个Modbus RTU帧的格式,每个Modbus RTU帧的结构从前到后依次包括一个字节的从站地址、一个字节的功能码、零或至少一个字节的数据区以及两个字节的CRC校验码(循环冗余校验码)。由此可见,从站地址、功能码以及CRC校验码所占的字节数都是确定,确定每一帧的大小,关键就在于判断数据区的字节大小。
下面结合附图以实施例的方式详细描述本发明。
实施例1:
如图1所示,在TCP/IP网络上应用Modbus RTU协议的方法,该TCP/IP网络中包括客户端和服务器端,包括如下步骤:
步骤S0,服务器端在一socket端口开启监听,客户端向此socket端口建立连接,开始通信。
步骤S1,客户端向服务器端发送请求,请求中包括若干请求帧,等待服务器端回应。
步骤S2,服务器端依次接收请求帧,对于每一请求帧:
服务器端读取当前请求帧的第一个字节,获取从站地址;
服务器端读取当前请求帧的下一个字节,获取功能码;
根据功能码判断当前请求帧的数据区的字节长度;设请求帧数据区的字节长度为N,服务器端读取当前请求帧的下N个字节,获取数据区的内容;
服务器端读取当前请求帧的下两个字节,获取CRC校验码,当前请求帧接收完毕。
步骤S3,服务器端向客户端发送应答,应答中包括若干应答帧。
步骤S4,客户端依次接收应答帧,对于每一应答帧:
客户端读取当前应答帧的第一个字节,获取从站地址;
客户端读取当前应答帧的下一个字节,获取功能码;
根据功能码判断当前应答帧的数据区的字节长度;设应答帧数据区的字节长度为M,客户端读取当前应答帧的下M个字节,获取数据区的内容;
客户端读取当前应答帧的下两个字节,获取CRC校验码,当前应答帧接收完毕。
循环重复执行上述步骤S1至S4可完成客户端和服务器端之间的多次请求和应答。
由上述的Modbus RTU帧的格式可知,每一帧的第一个字节存储的是从站地址,第二个字节存储的是功能码,读取每一帧的前两个字节后就获得了从站地址和功能码。每一个功能码对应一个特定的定义,该功能码决定了每一帧数据区中各部分的内容以及各部分所占的字节数。请求帧和应答帧在数据结构是相同的,区别在于相同功能码决定的请求帧和应答帧的数据区中的内容不同,数据区的各部分内容和所占的字节数也不相同。
在本实施例中,如图2所示,服务器端对每一请求帧的接收流程如下:
根据获取的当前请求帧的功能码进行如下流程:
步骤S21,判断功能码是否为0x03,若是则认为请求帧数据区的字节长度为4个字节;若否则进入步骤S22。
功能码0x03的定义为读保持寄存器,在请求帧中,功能码0x03定义请求帧的数据区包含2个字节的起始地址(即要读取的寄存器的起始地址)以及2个字节的寄存器数量(即要读取的寄存器的数量),因此,依次读取这4个字节即可获取所要读取的寄存器的起始地址以及寄存器数量。
步骤S22,判断功能码是否为0x06,若是则认为请求帧数据区的字节长度为4个字节;若否则进入步骤S23。
功能码0x06的定义为写单个寄存器,在请求帧中,功能码0x06定义请求帧的数据区包含2个字节的寄存器地址(即要写入的寄存器的地址)以及2个字节的寄存器值(即要写入寄存器的值),因此,依次读取这4个字节即可获取所要写入的寄存器地址以及寄存器值。
步骤S23,判断功能码是否为0x10,若是则读取下两个字节,获取写入地址;
读取下一个字节,获取写入长度的高位,设写入长度的高位为H;读取下一个字节,获取写入长度的低位,设写入长度的低位为L;
请求帧数据区的字节长度为4+H×256+L个字节。
功能码0x10的定义为写多个寄存器,在请求帧中,功能码0x10定义请求帧的数据区的前2个字节为起始地址(即要写入的寄存器的起始地址),之后2个字节为写入长度(这2个字节中,第1个字节为高位H,第2个字节为低位L)(写入长度即为要写入寄存器的值的字节长度);根据写入长度的高位H以及写入长度的低位L进行计算,可获取数据区剩余的字节长度为H×256+L个字节,这H×256+L个字节即存储的是所要写入寄存器的值;综上所述,整个请求帧数据区的字节长度为4+H×256+L个字节。
在本实施例中,如图3所示,客户端对每一应答帧的接收流程如下:
根据获取的当前应答帧的功能码进行如下流程:
步骤S41,判断功能码的最高位是否为1,若是则认为应答帧数据区的字节长度为1个字节;否则进入步骤S42。
当功能码的最高位为1时,则定义为错误响应,此时应答帧数据区包括1个字节的异常码,因此读取下1个字节即可获得异常码。
步骤S42,判断功能码是否为0x06,若是则认为应答帧数据区的字节长度为4个字节;否则进入步骤S43。
功能码0x06的定义为写单个寄存器,在应答帧中,功能码0x06定义应答帧的数据区包含2个字节的寄存器地址(即已写入的寄存器的地址)以及2个字节的寄存器值(即已写入寄存器的值),因此,依次读取这4个字节即可获取写入的寄存器地址以及寄存器值。
步骤S43,判断功能码是否为0x10,若是则认为应答帧数据区的字节长度为4个字节;否则进入步骤S44。
功能码0x10的定义为写多个寄存器,在应答帧中,功能码0x10定义应答帧的数据区包含2个字节的起始地址(即已写入的寄存器的起始地址)以及2个字节的寄存器数量(即已写入的寄存器的数量),因此,依次读取这4个字节即可获取写入的寄存器的起始地址以及寄存器数量。
步骤S44,判断功能码是否为0x03,若是则读取下一个字节,获取字节数,设字节数为P;应答帧数据区的字节长度为1+P个字节。
功能码0x03的定义为读保持寄存器,在应答帧中,功能码0x03定义应答帧的数据区包含1个字节的字节数P(即已读取的寄存器值的字节长度),因此,读取下P个字节即可获取寄存器值(即从寄存器中读取的值);综上所述,整个请求帧数据区的字节长度为1+P个字节。
通过上述方法步骤即可实现在TCP/IP网络上应用Modbus RTU协议完成对寄存器的读写,且根据功能码推断每一帧的字节大小,准确性高,能有效鉴别每一帧的结束,使得应用效果稳定。
以上公开的仅为本申请的一个具体实施例,但本申请并非局限于此任何本领域的技术人员能思之的变化,都应落在本申请的保护范围内。
Claims (7)
1.在TCP/IP网络上应用Modbus RTU协议的方法,该TCP/IP网络中包括客户端和服务器端,其特征在于,包括如下步骤:
步骤S1,所述客户端向所述服务器端发送请求,所述请求中包括若干请求帧,等待服务器端回应;
步骤S2,所述服务器端依次接收所述请求帧,对于每一请求帧:
所述服务器端读取当前请求帧的第一个字节,获取从站地址;
所述服务器端读取当前请求帧的下一个字节,获取功能码;
根据所述功能码判断当前请求帧的数据区的字节长度;设请求帧数据区的字节长度为N,所述服务器端读取当前请求帧的下N个字节,获取数据区的内容;
所述服务器端读取当前请求帧的下两个字节,获取CRC校验码,当前请求帧接收完毕;
步骤S3,所述服务器端向所述客户端发送应答,所述应答中包括若干应答帧;
步骤S4,所述客户端依次接收所述应答帧,对于每一应答帧:
所述客户端读取当前应答帧的第一个字节,获取从站地址;
所述客户端读取当前应答帧的下一个字节,获取功能码;
根据所述功能码判断当前应答帧的数据区的字节长度;设应答帧数据区的字节长度为M,所述客户端读取当前应答帧的下M个字节,获取数据区的内容;
所述客户端读取当前应答帧的下两个字节,获取CRC校验码,当前应答帧接收完毕。
2.根据权利要求1所述的在TCP/IP网络上应用Modbus RTU协议的方法,其特征在于,
所述步骤S2中根据所述功能码判断当前请求帧的数据区的字节长度的方法具体为:判断功能码是否为0x03,若是则认为请求帧数据区的字节长度为4个字节;
所述步骤S4中根据所述功能码判断当前应答帧的数据区的字节长度的方法具体为:判断功能码是否为0x03,若是则读取下一个字节,获取字节数,设所述字节数为P;应答帧数据区的字节长度为1+P个字节。
3.根据权利要求1所述的在TCP/IP网络上应用Modbus RTU协议的方法,其特征在于,
所述步骤S2中根据所述功能码判断当前请求帧的数据区的字节长度的方法具体为:判断功能码是否为0x06,若是则认为请求帧数据区的字节长度为4个字节;
所述步骤S4中根据所述功能码判断当前应答帧的数据区的字节长度的方法具体为:判断功能码是否为0x06,若是则认为应答帧数据区的字节长度为4个字节。
4.根据权利要求1所述的在TCP/IP网络上应用Modbus RTU协议的方法,其特征在于,
所述步骤S2中根据所述功能码判断当前请求帧的数据区的字节长度的方法具体为:判断功能码是否为0x10,若是则
读取下两个字节,获取写入地址;
读取下一个字节,获取写入长度的高位,设写入长度的高位为H;读取下一个字节,获取写入长度的低位,设写入长度的低位为L;
请求帧数据区的字节长度为4+H×256+L个字节;
所述步骤S4中根据所述功能码判断当前应答帧的数据区的字节长度的方法具体为:判断功能码是否为0x10,若是则认为应答帧数据区的字节长度为4个字节。
5.根据权利要求2-4任一项所述的在TCP/IP网络上应用Modbus RTU协议的方法,其特征在于,
所述步骤S4中根据所述功能码判断当前应答帧的数据区的字节长度的方法进一步包括:判断功能码的最高位是否为1,若是则认为应答帧数据区的字节长度为1个字节。
6.根据权利要求1所述的在TCP/IP网络上应用Modbus RTU协议的方法,其特征在于,所述步骤S1之前还包括:
步骤S0,所述服务器端在一socket端口开启监听,所述客户端向此socket端口建立连接,开始通信。
7.根据权利要求1所述的在TCP/IP网络上应用Modbus RTU协议的方法,其特征在于,所述步骤S4之后还包括:循环重复执行步骤S1至S4。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310500238.6A CN103546467B (zh) | 2013-10-23 | 2013-10-23 | 在TCP/IP网络上应用Modbus RTU协议的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310500238.6A CN103546467B (zh) | 2013-10-23 | 2013-10-23 | 在TCP/IP网络上应用Modbus RTU协议的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103546467A CN103546467A (zh) | 2014-01-29 |
CN103546467B true CN103546467B (zh) | 2016-08-17 |
Family
ID=49969515
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310500238.6A Expired - Fee Related CN103546467B (zh) | 2013-10-23 | 2013-10-23 | 在TCP/IP网络上应用Modbus RTU协议的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103546467B (zh) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104038499A (zh) * | 2014-06-17 | 2014-09-10 | 宁波三星电气股份有限公司 | 基于modbus rtu协议的数据传输方法 |
CN105808549B (zh) * | 2014-12-30 | 2020-07-07 | 施耐德电器工业公司 | 基于映射文件自动组帧及分析帧的客户端方法 |
CN104580187B (zh) * | 2014-12-31 | 2018-09-04 | 厦门为那通信科技有限公司 | 一种实现不同modulebus协议的外置设备与服务器交互的方法 |
CN105278918B (zh) * | 2015-10-15 | 2017-12-08 | 珠海格力电器股份有限公司 | 寄存器的读取方法和采用该读取方法的寄存器 |
CN105599255A (zh) * | 2016-01-14 | 2016-05-25 | 宁波长飞亚塑料机械制造有限公司 | 一种注塑机控制器与辅机通讯方法 |
CN105847249A (zh) * | 2016-03-22 | 2016-08-10 | 英赛克科技(北京)有限公司 | 一种用于Modbus网络的安全防护系统以及方法 |
CN108306865B (zh) * | 2018-01-15 | 2021-02-12 | 厦门科灿信息技术有限公司 | 基于Netty框架的modbus粘包处理方法、装置 |
CN109040246B (zh) * | 2018-08-02 | 2022-03-08 | 广州虚拟动力网络技术有限公司 | 一种基于时间队列机制的组网通讯方法和系统 |
CN110311848A (zh) * | 2019-08-02 | 2019-10-08 | 杭州远流科技有限公司 | 一种Modbus RTU通讯协议提高通讯效率的方法 |
CN112422485B (zh) * | 2019-08-23 | 2023-05-26 | 北京东土科技股份有限公司 | 一种传输控制协议的通信方法及装置 |
CN111510362B (zh) * | 2020-04-23 | 2021-08-24 | 宁波伟立机器人科技股份有限公司 | 一种基于ModBus数据服务功能的通信方法及系统 |
CN112350912B (zh) * | 2020-10-29 | 2021-07-27 | 山东八五信息技术有限公司 | 一种基于Modbus协议的数据采集方法、系统和装置 |
CN113162931B (zh) * | 2021-04-22 | 2023-04-07 | 中煤科工集团重庆研究院有限公司 | 一种在广域网传输Modbus RTU协议报文的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1482782A (zh) * | 2003-06-20 | 2004-03-17 | 上海大学 | Modbus/tcp工业以太网和设备网现场总线间的协议转换方法和装置 |
JP2010287034A (ja) * | 2009-06-11 | 2010-12-24 | Koyo Electronics Ind Co Ltd | 外部機器とPLCとのModbusプロトコル通信アドレス表示方式 |
CN103152236A (zh) * | 2012-12-31 | 2013-06-12 | 人民电器集团有限公司 | Modbus与TCP的协议转换模块和智能断路器 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070050525A1 (en) * | 2005-08-25 | 2007-03-01 | Moxa Technologies Co., Ltd. | [virtual com port for remote i/o controller] |
-
2013
- 2013-10-23 CN CN201310500238.6A patent/CN103546467B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1482782A (zh) * | 2003-06-20 | 2004-03-17 | 上海大学 | Modbus/tcp工业以太网和设备网现场总线间的协议转换方法和装置 |
JP2010287034A (ja) * | 2009-06-11 | 2010-12-24 | Koyo Electronics Ind Co Ltd | 外部機器とPLCとのModbusプロトコル通信アドレス表示方式 |
CN103152236A (zh) * | 2012-12-31 | 2013-06-12 | 人民电器集团有限公司 | Modbus与TCP的协议转换模块和智能断路器 |
Non-Patent Citations (1)
Title |
---|
基于Modbus的现场总线控制系统研究与设计;刘锋;《中国优秀硕士论文全文数据库 信息科技辑》;20071115(第05期);第I140-395页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103546467A (zh) | 2014-01-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103546467B (zh) | 在TCP/IP网络上应用Modbus RTU协议的方法 | |
US9489328B2 (en) | System on chip and method for accessing device on bus | |
CN103905333A (zh) | 一种物联网多协议接入转换装置及其控制方法 | |
CN110191204A (zh) | 一种内网设备间通信方法、系统、装置及计算机存储介质 | |
CN103546532B (zh) | 一种应用共享数据的方法及系统 | |
CN108132868A (zh) | 一种数据监控方法、装置、计算设备及存储介质 | |
CN105278918B (zh) | 寄存器的读取方法和采用该读取方法的寄存器 | |
CN105119926A (zh) | 一种基于Socket连接的多通道双工通讯方法 | |
CN112866018A (zh) | 物联网管理系统及方法 | |
US20230239358A1 (en) | Method for fowarding data, device, storage medium and data transmission system | |
CN106487864A (zh) | 数据连接的建立方法、服务端及移动终端 | |
CN114710513A (zh) | 一种网络数据的处理系统及方法 | |
CN107168810A (zh) | 一种计算节点内存共享系统及读、写操作内存共享方法 | |
CN112243033B (zh) | 获取内存信息的方法、装置、设备及计算机可读存储介质 | |
CN113238856A (zh) | 一种基于rdma的内存管理方法及装置 | |
CN108696393A (zh) | 一种基于大数据的网络流量分析系统 | |
US20180176664A1 (en) | Declarative iot data control | |
CN111314495A (zh) | 基于物联网LoRaWAN的通信方法、装置、设备、存储介质和系统 | |
CN111510363A (zh) | 基于modbus协议的从站转换装置及其控制方法 | |
CN108282374B (zh) | 一种配置ncsi网卡的方法、系统及可读存储介质 | |
CN115372810A (zh) | 继电保护数字孪生体的构建方法、装置、存储介质及设备 | |
CN105447136A (zh) | 基于WiFi智能插座的提高数据库写入速度的方法及系统 | |
CN111338567B (zh) | 一种基于Protocol Buffer的镜像缓存方法 | |
US20170118168A1 (en) | Computer and network attribute setting method | |
CN201976212U (zh) | 一种应用于工业监控设备的图像冗余缓存电路 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160817 Termination date: 20181023 |