Modbus通信协议+Modbus串口调试工具+Java版协议解析源码

网络与串口二合一调试助手TCPCOM:

https://download.csdn.net/download/liuyuan_java/87454762

Modbus调试工具,模拟串口调试工具

https://download.csdn.net/download/liuyuan_java/87427475

Configure Virtual Serial Port Driver (VSPD) 串口模拟工具

https://download.csdn.net/download/liuyuan_java/87426831

Java实现DL/T645-2007协议报文的下发和上行报文的解析

https://download.csdn.net/download/liuyuan_java/87454726

Java版DLT645-2007电能表协议解析源码(串口协议解析)

https://download.csdn.net/download/liuyuan_java/87454734

什么是Modbus协议

MODBUS OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备
之间提供客户机 / 服务器通信。

简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信

而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IIC SPI UART串口通信协议等等。而Modbus也是一个串行通信协议。

什么是RS-485 RS-232

我们在看Modbus的时候,经常会看到485串口,232串口,这些是什么呢?

RS232,RS485是一种电平标准

数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。

那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232

RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。

  • 全双工
  • 逻辑1:-15V–5V
  • 逻辑0:+3V–+15V

RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~6V表示0,两线压差为+2~6V表示1

  • 半双工
  • 逻辑1:+2V–+6V
  • 逻辑0: -6V—2V
  • 注意485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压

也就是RS-485电平标准确定传输过来的数据是0还是1,在此基础上,这些字节数据根据modbus通信协议来进行数据的交互传输。

Modbus协议说明

Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus提供通用语言用于彼此通信的设备和设备。
Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议

最简单的说,Modbus就是一个总线通信协议,像IIC SPI这种,但是他不依赖于硬件总线

Modbus之所以使用广泛,是有他的优点的

  • Modbus协议标准开放、公开发表且无版权要求
  • Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等
  • Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络

举一个简单的例子,我们常用的IIC通信协议,需要在物理上连接iic总线,然后加上拉电阻,规定好物理层的高低电平。
 


而 Modbus协议是一种应用层报文传输协议,协议本身并没有定义物理层,定义了控制器能够认识和使用的消息结构,不管它们是经过何种网络进行通信的。 所以能够适应多种电气接口,因此使用非常广泛。

Modebus通信过程

注意Modbus是一主多从的通信协议

Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。

也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。

从机不会自己发送消息给主站,只能回复从主机发送的消息请求。


并且,Modbus并没有忙机制判断,比方说主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。

举例

现在,我们来探讨Modbus数据传输的方式,可以简单地理解成打电话。并且是单向通信的打电话

主机发送数据,首先需要从机的电话号码(区分每个从机,每个地址必须唯一),告诉从机打电话要干什么事情,然后是需要发送的内容,最后再问问从机,我说的话你都听清楚了没有呀,没有听错吧?
 

然后从机这里,得到了主机打过来的电话,从机回复主机需要的内容,主机得到从机数据,这样就是一个主机到从机的通信过程

就好比老师和你打电话,老师拨通了你的电话号,然后老师跟你说,小王呀,我这里需要你给我发东西发的内容是上周的一周总结,你说好的,然后打开你电脑的文件夹,把你的周报发给老师,这就是一个通信过程。

Modbus存储区

既然从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型

并且存储的数据类型可以分为 :布尔量 和 16位寄存器

  • 布尔量比如IO口的电平高低,灯的开关状态等。
  • 16位寄存器比如 传感器的温度数据,存储的密码等。

Modbus协议规定了4个存储区 分别是0-4区 其中0区和4区是可读可写,1区和3区是只读。

区号名称读写地址范围
0区输出线圈可读可写布尔量00001-09999
1区输入线圈只读布尔量10001-19999
2区输入寄存器只读寄存器30001-39999
3区保持寄存器可读可写寄存器40001-49999

并且Modbus还给每个区都划分了地址范围 主机向从机获取数据时,只需要告诉从机数据的起始地址,还有获取多少字节的数据,从机就可以发送数据给主机

Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。

Modbus协议类型

在上面我们已经说明了Modbus可以在各种介质上传输,那么他的传输模式也分为三种。包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型

串行端口存在多个版本的Modbus协议,而最常见的是下面四种:

  • Modbus-Rtu
  • Modbus-Ascii
  • Modbus-Tcp
  • ModbusPlus

Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。

当然常用的就是RTU模式,ASCII一般很少

举一个简单的例子,如果我们需要发送一个数字10 那么RTU模式下,只需要发送0x0A 而ASCII码模式则需要发送0x31(1) 0x30(0)两个字节数据。 详细的我们等下再阐述

Modbus-RTU协议

Modbus报文帧结构

一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。

Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容

Modbus协议在串行链路上的报文格式如下所示:

从站地址功能码数据CRC/LRC
1 byte1 byteN bytes2 bytes
  • 帧结构 = 从机地址 + 功能吗 + 数据 + 校验
  • 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)

  • 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.

  • 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。

  • 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确

Modbus功能码

Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。

Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:

功能码功能说明
01H读取输出线圈
02H读取输入线圈
03H读取保持寄存器
04H读取输入寄存器
05H写入单线圈
06H写入单寄存器
0FH写入多线圈
10H写入多寄存器

当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。

CRC校验

错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。
比如主机发出01 06 00 01 00 17 98 04, 98 04 两个字节是校验位,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误,这些数据就不能要。

CRC校验流程:

1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7、最终CRC寄存器的值就是CRC的值。

此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不在阐述

下面我们来看详细的发送和接收数据:

1、主机对从机读数据操作

主机发送报文格式如下:

从站地址功能码起始(高)起始(低)数量(高)数量(低)校验
0x010x030x000x010x000x010xD5 0xCA

含义:

0x01:从机的地址
0x03:查询功能,读取从机寄存器的数据
0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取.
0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址
0xD5 0xCA: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址功能码字节计数字节1字节2校验
0x010x030x020x010x000x17

含义:

0x01:从机的地址
0x03:查询功能,读取从机寄存器的数据
0x02: 返回字节数为2个 一个寄存器2个字节
0x00 0x17:寄存器的值是0017
0xF8 0x4A: 循环冗余校验 CRC

2、主机对从机写数据操作

主机发送报文格式如下:

从站地址功能码数据地址(高)数据地址(低)数据(高)数据(低)校验
0x010x060x000x010x000x170x98 0x04

含义:

0x01:从机的地址
0x06:修改功能,修改从机寄存器的数据
0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0001-0x0003的存储内容
0x00 0x17: 要修改的数据值为0017
0x98 0x04: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址功能码数据地址(高)数据地址(低)数据(高)数据(低)校验
0x010x060x000x010x000x170x98 0x04

含义:

0x01:从机的地址
0x06:修改功能,修改从机寄存器的数据
0x00 0x01: 代表修改的起始寄存器地址.说明是0x0000
0x00 0x17:修改的值为0017
0x98 0x04: 循环冗余校验 CRC

从机的回复和主机的发送是一样的,如果不一样说明出现了错误

Modbus-ACSII协议

在消息中的每个字节都作为两个ASCII字符发送

十六进制的0-F 分别对应ASCII字符的0…9,A…F

也就是0x30~0x3A 0x41~0x46

下方是ascii的报文帧

  • 1个字节起始位

  • 2个字节地址位

  • 2个字节功能位

  • n个数据位,最小的有效位先发送

  • LRC(纵向冗长检测) 注意校验方式不同

  • 结束符CR LF

可以看到数据部分更加繁琐,正常我们使用都是用RTU格式,ASCII码格式有了解即可。


总结:
ModbusASCII有开始字符(和结束字符(CR LF),可以作为一帧数据开始和结束的标志,而ModbusRTU没有这样的标志,需要用时间间隔来判断一帧报文的开始和结束,协议规定的时间为3.5个字符周期,就是说一帧报文开始前,必须有大于3.5个字符周期的空闲时间,一帧报文结束后,也必须要有3.5个字符周期的空闲时间否则就会出现粘包的情况。

注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。
在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=/960038.5=0.00401s1000=4.01ms

Modbus-TCP协议

我们首先看下Modbus-TCP和Modbus-ACSII的区别

Modbus-TCP并不需要从从机地址,而是需要MBAP报文头

并且不需要差错校验,因为TCP本身就具有校验差错的能力

MBAP报文头格式如下:

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MODBUS是一种通信协议,在工业自动化领域中广泛应用。VC则是Visual C++的缩写,是一种编程语言和开发环境。串口是一种通过串行通信传输数据的接口。 MODBUS协议通过串口实现通信,使得不同设备之间能够进行数据交互。可以使用VC编程语言来实现MODBUS协议的相关功能,开发出与MODBUS设备进行通信的应用程序。 在VC中,可以使用串口通信库来进行串口通信的操作。可以通过打开串口、设置串口参数(如波特率、数据位、停止位等)、读取和发送数据等操作,与MODBUS设备进行通信。 通过VC编程实现MODBUS协议的串口通信,可以实现读取和写入MODBUS设备的数据。可以通过发送相应的命令和参数,对设备进行读取数据、写入数据等操作。可以根据MODBUS协议的规范进行数据的处理和解析,确保数据的正确性和可靠性。 总之,MODBUS VC串口是指通过VC编程语言实现MODBUS协议的串口通信。这种通信方式可以实现MODBUS设备的数据交互,并且可以根据需要进行读取和写入操作。通过VC编程,可以开发出与MODBUS设备进行通信的应用程序,实现工业自动化中的数据交互和控制功能。 ### 回答2: Modbus是一种通信协议,用于连接不同设备之间的通信。它是一种简单且可靠的串行通信协议,支持多主从模式。Modbus通信可以通过多种物理层,如串口、以太网等进行。其中,Modbus RTU和Modbus ASCII是基于串口的两种常见的Modbus通信方式。 Modbus RTU是一种二进制通信方式,通过串口进行数据传输。它通过在串口上发送二进制数据帧来实现设备之间的通信。数据帧包括了设备地址、功能码、数据内容和CRC等字段。Modbus RTU通信是主从模式的,主设备发起通信请求,从设备回复响应。这种通信方式具有高效、实时性强等特点,广泛应用于工业自动化领域。 Modbus ASCII是一种基于ASCII码的通信方式,同样通过串口进行数据传输。与Modbus RTU相比,Modbus ASCII在数据传输过程中使用ASCII码来表示二进制数据,因此通信速度较慢。Modbus ASCII通信与Modbus RTU类似,也是通过设备地址、功能码、数据内容和校验和等字段进行通信。它同样适用于工业自动化领域,特别适用于需要远距离传输的应用场景。 在使用Modbus VC串口时,首先需要选择合适的串口通信类型,即Modbus RTU或Modbus ASCII。然后,配置串口参数,如波特率、数据位数、校验位等。接下来,通过编程或相关软件实现Modbus通信协议解析和封装,实现设备之间的数据交换。最后,进行通信测试和调试,确保通信正常。 通过Modbus VC串口,可以实现设备之间的快速、可靠的数据传输。它被广泛应用于工业控制系统、能源监控系统等领域,为工业自动化系统的组网和数据交换提供了便利。同时,Modbus VC串口还支持多主从模式,使得多个设备可以同时与主设备进行通信,提高了系统的可扩展性和灵活性。 ### 回答3: Modbus VC串口是一种基于Modbus通信协议的串口通信方式。Modbus是一种通用的工业领域通信协议,常用于工业自动化设备之间的数据传输。 Modbus VC串口是指通过虚拟串口(Virtual COM Port)实现Modbus通信。虚拟串口是一种软件模拟的串口,可以将串口数据通过计算机的USB接口传输。它可以模拟物理串口的所有传输特性,包括数据、波特率、奇偶校验等。 使用Modbus VC串口进行通信有以下几个步骤: 1. 配置串口参数:首先需要设置串口通信的参数,如波特率、数据位、校验位等。这些参数需要和目标设备的通信配置匹配。 2. 建立通信连接:通过虚拟串口软件建立与目标设备的通信连接。通常,虚拟串口会将计算机的USB接口映射为一个虚拟串口号,通过该串口号可以和目标设备进行通信。 3. 发送/接收数据:通过Modbus协议的命令和寄存器地址,可以向目标设备发送数据请求,获取设备的状态或读取寄存器中的数据。同时,设备也可以向计算机发送数据响应,完成数据的交互。 Modbus VC串口具有简单、方便、稳定的特点,可以实现计算机与Modbus设备之间的数据传输。它在工业自动化、楼宇控制、能源管理等领域广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡壶好茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值