首页 > 其他分享 >基于RS485的Modbus协议

基于RS485的Modbus协议

时间:2024-07-26 16:00:02浏览次数:11  
标签:基于 01 引脚 RS485 00 Modbus 寄存器

RS485:用来传输数据,RS485是一种差分传输的串行通信标准,以其强大的抗干扰能力、长距离传输和多点通信能力,在工业控制领域得到广泛应用。RS485使用一对差分信号线(A和B)来传输数据,差分信号能有效抵抗共模干扰,提高通信的可靠性。RS485通信可以是半双工或全双工,具体取决于应用配置。在半双工模式下,同一时刻只能发送或接收数据。

Modbus:用来解析数据,Modbus是一种用于电子控制器上的一种通用语言,通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议是一个master/slave(主/从)架构的协议。有一个节点是master节点(一般为上位机),其他使用Modbus协议参与通信的节点是slave节点(一般为下位机)。每一个slave设备都有一个唯一的地址。特点:完全公开发表并且无版权要求、易于部署和维护、对供应商来说,修改移动本地的比特或字节没有很多限制。

RS485通信

RS485的电气特性:逻辑“1”,VA>VB,以两线间的电压差为+(2~6)V表示;逻辑“0”,VB>VA,以两线间的电压差为-(2~6)V表示。

TTL电气特性:逻辑“1”,表示3.3~5V;逻辑“0”,表示0V;

        由于STM32的UART/USART接口输出的是TTL电平信号,而RS485接口需要差分信号(抗干扰能力强,传输距离远),因此需要通过RS485收发器(如SP3485)进行电平转换。

 如图所示的485芯片,接到单片机上的引脚有三个,USART的TX引脚连接到RS485收发器的DI(数据输入)引脚,USART的RX引脚连接到RS485收发器的RO(数据输出)引脚。,同时将RS485收发器的DE(驱动器使能)和RE(接收器使能)引脚连接到STM32的一个GPIO引脚,用于控制收发器的发送和接收模式。

引脚A和B:这是RS485通信中的一对差分信号线,用于传输数据。在RS485收发器芯片上,这两个引脚是必需的,用于连接到通信总线。

引脚RE(Receiver Enable,接收使能)和DE(Driver Enable,驱动使能):这两个引脚用于控制RS485收发器的工作模式。RE引脚低电平时,收发器处于接收状态;DE引脚高电平时,收发器处于发送状态。在某些自动收发设计的RS485收发器中,可能不需要这两个引脚,而是通过内部逻辑自动切换收发状态。在上图中是将这两个引脚接到一个GPIO口上,用于控制RS485收发器的RE和DE引脚。STM32的一个或多个GPIO引脚被配置为输出模式,用于在发送和接收数据时切换RS485收发器的工作模式。当RS485_EN是高电平为发送状态,低电平为接收状态。(RS485与串口通信区别可能就在于需要使能引脚去控制数据的接收或者发送)

MODBUS协议

Modbus RTU:运行在串口上的协议,采用二进制表现形式以及紧凑的数据结构,通信效率较高,应用比较广泛。它使用串行通信方式,并且后续的命令/数据带有循环冗余校验的校验和。

Modbus ASCII:同样运行在串口上的协议,但采用ASCII码进行传输,每个字节的开始和结束都有特殊字符作为标志,传输效率低于Modbus RTU,一般只在通讯量较少时使用。

Modbus TCP/IP:基于以太网的变体,使用TCP/IP协议栈进行数据传输。它使用标准的以太网物理层和IP网络连接,可以通过以太网进行设备间的通信。与Modbus RTU和Modbus ASCII相比,Modbus TCP/IP具有更高的通信速度和更好的可靠性。

 Modbus协议的功能码

常用的功能码一般就是03读命令、06写命令、16写命令

 通信报文或数据包格式

用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为
异常响应保留) 。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。
通信地址:1~247,指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令。

利用Modbus_poll和Modbus_slave演示

首先下载一个串口模拟助手比如VSPD;

下载Modbus_poll和Modbus_slave后打开两个软件

这里我用的是模拟串口,将端口10与端口11连接起来,在poll软件中选择的是COM10->COM11,在slave软件中选择的是COM11->COM10。

 03读命令功能码

 分析一下上述的报文协议

Tx:01 03 00 00 00 01 84 0A
Rx:01 03 02 00 10 B9 88

 主机发送的报文TX:01(地址码8bit)、03(功能码8bit,03为读命令)、0000(寄存器起始地址16bit)、0001(读取寄存器个数N*16bit)、840A(CRC校验16bit);读取01从机的起始地址为0000的一位寄存器数据。

从机的应答RX:01(地址码8bit)、03(功能码8bit,03为读命令)、02(字节数=寄存器数*2)、0010(数据区)、B988(CRC校验);
数据区的0010就是刚才在slave软件中填写的寄存器数据16的十六进制表达,如果刚才写的是32,现在的数据区就为0020。02字节数就是表示读取到两个字节,后面的两个字节表示读取的数据。如果是04,则表示后面的4个字节就是从从机中读取的数据。

如何确定主机接收和从机发送的数据包,靠的是两者的时间间隔。如果两个数据包之间间隔3.5个字符,则确定一包数据发送完成。115200波特率,3.5个字符的时间:1个字符位10bit,3.5*10=35bit,35/115200=3ms左右的时间,只要超过这个时间就认为一包数据发送完成。
在一包数据中字符与字符之间不能超过1.5个字符时间。

06写命令功能码

注意,06写命令只能写一个寄存器,所以在修改配置的时候需要将寄存器值quantity需要改成1。

Tx:01 06 00 00 00 20 88 12
Rx:01 06 00 00 00 20 88 12

 主机发送的报文TX:01(地址码8bit)、06(功能码8bit,06为写命令)、0000(寄存器起始地址16bit)、0020(数据区,写入寄存器的值16bit)、8812(CRC校验16bit);向01从机的起始地址为0000的一位寄存器数据写入数据32。

从机的应答RX:在接收完成后,06功能码将主机发送的数据包原样返回给主机。

16写命令功能码(写多个寄存器)

分析数据协议
Tx:01 10 00 00 00 02 04 00 07 00 0F 02 6A
Rx:01 10 00 00 00 02 41 C8

 主机发送的报文TX:01(地址码8bit)、10(十六进制功能码8bit,16为写命令,)、0000(寄存器起始地址16bit)、0002(寄存器个数)、04(字节数)、0007(数据区,写入寄存器的值16bit)、000F(数据区,写入寄存器的值16bit)、026A(CRC校验16bit);向01从机的起始地址为0000的寄存器1数据写入数据7,后面的寄存器2写入15。

从机的应答RX:01(地址码8bit)、10(功能码8bit,16为写命令)、0000(寄存器起始地址)、0002(寄存器个数)、41C8(CRC校验);相当于告诉主机,数据接收完成,从0000地址接收了4个寄存器的数据。

标签:基于,01,引脚,RS485,00,Modbus,寄存器
From: https://blog.csdn.net/2401_83703513/article/details/140699202

相关文章