早学51时,宋老师的书就有了Modbus这方面的知识,但当时实验环境不足,没有深入研究,现在用于项目RS485等传感器Modbus特别记录协议。
一、传感器介绍
使用的传感器是光照度传感器,如下图所示。
该传感器有五条线,颜色与下表所示的功能相对应。
颜色 | 功能 |
---|---|
棕色线 | 电源正(12-24V) |
黑色线 | 电源负(12-24V) |
黄色线 | 485-A |
蓝色线 | 485-B |
注意,485A和B千万不要!
默认设备地址为0x01
传感器只能通过0x03指令读取光照度信息,光照度数据共32位,地址高16位0x07
在寄存器中,地址低16位0x08
寄存器。
二、RS485介绍
1、RS485特点
- 数据信号采用差分传输,能有效解决共模干扰问题
- 逻辑1以两线之间的电压差为基础
(0.2~6)V
逻辑0表示两线之间的电压差-(0.2~6)V
它是典型的差异通信
- 逻辑1以两线之间的电压差为基础
- 最大距离可达 1200 米
- 最大传输速度可以达到 10Mb/s 以上
- 其传输速率与传输距离成反比,仅在 100Kb/s 以下传输速度可以达到最大通信距离,如果需要传输更远的距离,可以使用中继。
- 允许多个收发设备接收同一条总线
- 多机通信可以在总线上联网实现,多个收发器可以挂在总线上,从现有开始 RS485芯片可以挂 32、 64、 128、 256 不同设备的驱动器等
- RS485 接口很简单, 与 RS232 所使用的 MAX232 它是相似的,只需要一个 RS485转换器可直接与单片机连接 UART 串口连接,使用完全相同的异步串行通信协议。
- 但是由于 RS485 差分通信,,也就是说,它是一种半双工通信。(所以后面有控制输入输出方向的方向dir位!)
2、RS典型的硬件电路485
其中,485-RX和485-TX可直接与单片机的串口相连。485-DIR接收普通输出IO可用于控制通信方向:默认情况下,低电平(处于接收状态),发送时拉高,发送后拉低!
三、Modbus介绍通信协议
1、Modbus介绍
UART、 I2C、 SPI 这些通信协议是底层协议和位级协议。Modbus这种通信协议是字节级的,称为应用层通信协议。该协议描述了控制器访问其他设备的过程,如何响应其他设备的要求,以及如何检测错误记录,并制定了通信数据的模式和内容的公共格式。
多机通信时, Modbus 协议规定,每个控制器必须知道其设备地址,识别根据地址发送的数据,并决定是否有动作和什么动作。如果需要回应,控制器将使用生成的反馈信息 Modbus 协议发出。
2、RTU 协议帧数据
Modbus 通信传输方式有两种,一种是 ASCII 一种是模式 RTU 模式。实际场合使用较多的当数RTU协议帧模式RTU格式如下图所示:
Modbus 的 RTU模式规定不同数据帧之间的间隔 3.超过5个字节通信时间(通常设置为5个ms)。
:每个设备都有自己的地址。当设备收到一帧数据时,程序首先判断和比较设备地址字节。如果它不同于自己的地址,则直接忽略这帧数据。如果它与自己的地址相同,则需要分析这帧数据。
如果地址是 0x00,被认为是命令,是所有从机设备都要执行的指令。
:在第二个字节功能代码字节中, Modbus 规定了一些功能代码。我们经常使用它0x03:读取一个或连续的寄存器
以及0x06:写入单个寄存器
。本文重点介绍了本项目中使用的光照度传感器,我们主要在程序中阅读传感器的数据0x03
功能码。
:跟在功能代码后面的是 n 个 8bit 数据 n 值是由功能代码确定的。不同功能代码背后的数据数量不同。当主机向从机器(传感器)发送读取数据的请求命令时,主机发送数据 n
组成部分为: 2 个字节的寄存器起始地址,加 2 寄存器数量的字节 N。如下图所示: 当从机接收到主机的请求命令并响应主机发送的命令时,从机数据 n 组成部分为: 1 因为我们回复的寄存器值是个字节的字节数 2 所以这个字节是字节数 2N 个,再加上 2N 寄存器值。如下图所示:
这里可能有点绕,但没关系。结合我们的实际传感器数据,这些规定可能很清楚。顺便说一句,我们需要提到的一件事是:
:CRC 除了最后两个字节外,校验函数还计算了前面所有字节的特定算法,计算后生成了一帧数据 16bit作为数据 CRC 在一帧数据的最后添加校准码。接收人收到数据后,前面的字节也会进行 CRC 计算,计算和发送 16bit 的 CRC 对数据进行比较,如果相同,则认为数据正常,无错误。如果比较不同,则表明数据在传输过程中出现错误。这一帧的数据将被丢弃,就像没收一样,发送方将在没有响应后进行相应的错误处理。
关于具体的CRC验证算法,如果真的看不懂,也不用深究,先用!
四、传感器通信实例
两个将用在下面Modbus调试上位机,演示实际情况Modbs通信过程。两款上位机均可从<这里>获取。提取码:fkc9
1、通用的Modbus调试精灵
界面如下图所示:
通过RS485转串设备将传感器连接到计算机选择相应的COM口,其他设置如上图所示,然后单击打开串口。将寄存器地址写入读取寄存器区域:7,数量为2。(即读取0x07和0x08两个寄存器的内容)写入发送窗口01 03 00 07 00 02 75 CA
,点击读出,就会收到01 03 04 00 00 00 00 5F BA 0B
下面将详细解释发送和接收的每个字节的含义。
01内容 | 含义 |
---|---|
设备地址 | |
03 | 功能码 |
00 | 要读取的起始地址高位 |
07 | 要读取的起始地址低位 |
00 | 寄存器数量高位 |
02 | 寄存器数量低位 |
75 | CRC校验高位 |
CA | CRC校验低位 |
内容 | 含义 |
---|---|
01 | 设备地址 |
03 | 功能码 |
04 | 读取的字节数 |
00 | 0x07地址的高8位 |
00 | 0x07地址的低8位 |
00 | 0x08地址的高8位 |
5F | 0x08地址的低8位 |
BA | CRC校验高位 |
0B | CRC校验低位 |
所以我们读取到的光照强度位:0x42,即95Lux
这里再次体会前面的协议规定中的主机发送请求,从机发送回应。还有前面提到的在 Modbus 协议里寄存器的地址和数值都是 16 位的(两个字节)。
2、专用的光照强度Modbus调试上位机
这个当然就是和这个传感器配套的上位机咯~
但是协议和上面介绍的通用一毛一样,可以比对学习。
emmmm,整个协议的分析和数据的读取到这里基本告一段落。