齐护机器人ModbusRTU RS485-TTL通信模块
一、概念理解
Modbus协议是一种由Modicon公司(现为施耐德电气Schneider Electric)于1979年发表的网络通信协议,旨在实现可编辑逻辑控制器(PLC)之间的通信。
1.1 什么是Modbus RTU?
Modbus RTU是一种串行通信协议,它被广泛用于工业环境中各种电子设备之间的通信。这种协议是Modbus协议家族中的一种,专门设计用于在串行线路上传输数据。
1.2 Modbus RTU的基础概念
串行通信:Modbus RTU使用串行通信方式,即数据在一条线路上一个接一个地传输。这种方式与并行通信相比,虽然速度较慢,但成本更低,且更适合长距离传输。
RS-485接口:Modbus RTU通常使用RS-485接口进行物理连接。RS-485是一种差分信号传输方式,具有抗噪声干扰能力强、传输距离远等优点。
数据包结构:Modbus RTU的数据包由地址域、功能码、数据域和校验码等部分组成。每个部分都有其特定的作用,如地址域用于标识从设备,功能码用于指示要执行的操作等。
1.3 Modbus RTU的工作原理
主从通信模式:Modbus RTU采用主从通信模式,即一个主设备(如PLC)可以与多个从设备(如传感器、执行器等)进行通信。主设备负责发起通信请求,而从设备则根据请求做出响应。
数据请求与响应:当主设备需要读取或写入从设备的数据时,它会发送一个包含地址域、功能码和数据域的数据包给从设备。从设备接收到数据包后,会根据功能码执行相应的操作,并将结果返回给主设备。
校验与错误处理:为了确保数据的准确性,Modbus RTU数据包中包含校验码。当从设备接收到数据包后,会进行校验计算,如果校验结果不正确,则会认为数据包有误,并做出相应的错误处理。
1.4 Modbus RTU的进阶概念
波特率与数据位:波特率是指每秒传输的比特数,它决定了通信的速度。数据位则是指每个数据包中传输的数据比特数。在实际应用中,需要根据设备的性能和通信距离等因素选择合适的波特率和数据位。
奇偶校验与停止位:除了校验码外,Modbus RTU还支持奇偶校验和停止位等错误检测机制。奇偶校验通过在数据位后面添加一位校验位来检测数据是否出错,而停止位则用于标识数据包的结束。
地址分配与设备识别:在Modbus RTU网络中,每个设备都有一个唯一的地址。主设备通过发送包含目标设备地址的数据包来与特定设备进行通信。这种方式使得主设备能够同时与多个从设备进行通信,而不会发生混淆。
1.5 Modbus RTU的实际应用
工业自动化:Modbus RTU被广泛用于工业自动化领域,如PLC与传感器、执行器之间的通信等。通过Modbus RTU协议,PLC可以实时读取传感器的数据,并根据数据做出相应的控制决策。
智能建筑:在智能建筑领域,Modbus RTU也被用于各种智能设备的通信中。例如,智能照明系统、智能安防系统等都可以通过Modbus RTU协议实现数据的传输和控制。
远程监控与维护:通过Modbus RTU协议,还可以实现远程设备的监控和维护。技术人员可以通过网络远程访问设备的数据和状态信息,从而及时发现并解决问题。
1.6 Modbus TCP/IP与Modbus UDP简介
除了Modbus RTU外,Modbus协议家族还包括Modbus TCP/IP和Modbus UDP等版本。它们都是基于以太网的通信协议,具有更高的传输速度和更广泛的适用范围。其中,Modbus TCP/IP利用TCP/IP协议进行数据传输,而Modbus UDP则利用UDP协议的低延迟和低开销特点进行数据传输。这些版本使得Modbus协议能够在更广泛的领域中得到应用。
1.7 工作原理与特点
主从通信:Modbus协议采用主从通信方式,即一个设备作为主设备(Master),负责发起请求,而其他设备作为从设备(Slave),负责响应请求。这种通信模式确保了数据交换的可靠性和有序性。
串行通信:Modbus协议是一种串行通信协议,数据按位依次传输,每位数据占据固定的时间长度,并使用少数几条通信线路完成系统间的信息交换。
帧结构:Modbus协议每发送一次数据就是一个数据帧,每个数据帧都必须符合Modbus的帧结构。帧结构通常包括地址、功能码、数据和校验等部分。
多种传输模式:Modbus协议支持多种传输模式,包括Modbus-RTU、Modbus-ASCII、Modbus-TCP/IP等。其中,Modbus-RTU使用二进制格式进行数据传输,通讯效率更高;Modbus-ASCII使用ASCII码进行数据传输,可读性好但通讯效率更低;Modbus-TCP/IP则是基于以太网的一种通讯方式,具有高速、稳定的特点。
1.8. 物理接口
由于 Modbus 是一种应用层协议,因此任何支持承载数字数据的物理接口都可用于部署 Modbus。然而,由于 Modbus 在工业环境中的普遍性,主要用于 Modbus 的接口类型是最强大的。
RS-232 – RS-232 是一种传统的串行通信接口标准。尽管 USB 等现代串行接口已经取代了它,但许多术语今天仍在使用。由于 RS-232 是一个串行接口,我们可以将其用于 Modbus RTU 和 Modbus ASCII。
RS-485 – 与 RS-232 相比,RS-485 具有更高的速度、更长的电缆,并且信号更强大。基于 RS-485 的 Modbus 可能是部署 Modbus 协议的最流行方式。我们可以使用 Modbus RTU 或 Modbus ASCII。
以太网 – 在大容量数据传输方面,以太网无疑是最好的之一,仅次于光纤。以太网的多功能性使其成为所有行业的最爱。我们几乎可以通过以太网实现任何数据协议。这是封装数据并将其发送到目标的问题。Modbus TCP/IP 专为以太网实施量身定制。
无线 – 只要通信接口允许可靠且可寻址的数据传输和多点方案,它就适用于 Modbus。根据无线链路的能力,可以实现任何模式的 Modbus。然而,由于无线传输和网络的不可预测性和复杂性,各行各业更喜欢有线链路而不是无线链路。
1.9. 协议版本
多年来,随着许多新的物理接口标准的推出,Modbus 协议已被调整以适应这些接口,从而提高通信效率。
Modbus RTU – RTU 代表远程终端单元,主要用于串行通信。串行通信接口包括 UART、RS-485、RS-232 等。在 Modbus RTU 中,数据被分组为单独的帧,并以二进制格式表示。RTU 消息可以是命令或数据(请求/响应)。每个数据帧都以基本 CRC 码结尾,用于检测传输中的错误。
Modbus ASCII – 这类似于 Modbus RTU,不同之处在于所有数据都仅使用 ASCII 字符作为 ASCII 等效项发送。例如,像 153 这样的整数值以三个字符 “1”、“5” 和 “3” 的形式发送,而不是以二进制格式直接表示数字。这样做的好处是,您可以以人类可读的格式查看消息,并且可以轻松调试通信。但作为副作用,在大多数情况下,它使所需的数据带宽增加了一倍。
Modbus TCP/IP – 顾名思义,这是对以太网接口的改编。在这种情况下,利用 TCP/IP 的速度和寻址功能,数据通过以太网电缆作为 TCP/IP 数据包传输。以太网也是一种高效、快速和强大的通信接口,使其成为工业应用的理想选择。
Modbus UDP – TCP/IP 并不是唯一可以在以太网中使用的协议。一些 Modbus 实现利用了 UDP 的低延迟和低开销。
QH modbus 模块物理层是RS-485,协议版本为Modbus RTU 。
1.10. 报文格式
modbus报文包含站号、功能码、数据、和CRC校验码。这里不做详细叙述。
1 功能码
重点关注功能码,通常设备通讯说明书会告诉你读取设备数据所需要的功能码及地址。
功能码 功能说明
01H 读取输出线圈
02H 读取输入线圈
03H 读取保持寄存器
04H 读取输入寄存器
05H 写入单线圈
06H 写入单寄存器
0FH 写入多线圈
10H 写入多寄存器
2 寄存器分类
Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。最初Modbus协议借鉴了PLC中寄存器的含义,但是随着Modbus协议的广泛应用,寄存器的概念进一步泛化,不再是指具体的物理寄存器,也可能是一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。
数据区块 前缀
线圈 0
离散量输入 1
输入寄存器 3
保持寄存器 4
3 寄存器地址分配
Modbus寄存器地址分配(不同的设备,可访问的地址范围不同,以下是其中一个示例)
寄存器种类 寄存器PLC地址 寄存器Modbus协议地址 简称 读写状态
线圈状态 00001 ~0999 0000H~ FFFFH 0x 可读可写
离散输人状态 10001~ 19999 0000H~ FFFFH 1x 只读
保持寄存器 40001~49999 0000H~ FFFFH 4x 可读可写
输入寄存器 30001~ 39999 0000H~ FFFFH 3x 只读
二、 编程功能块
2.1 图形化编程功能块位置
齐护教育版Mixly:ESP32 Arduino/C02/AIcam/UNO主板:齐护工业应用–>ModbusRTU
Mixly2RC4及以上:ESP32 Arduino 云端库导入【齐护ModbusRTU库】
齐护编程Scratch: ESP32 Arduino 添加扩展–>通讯–>ModbusRTU
2.2 编程功能块说明
2.2.1初始化
Mixly
Scratch
初始化modbusRTU模块,选择串口引脚和串口接口,以及串口参数。这些参数需要与连接在RS-485上所有的设备一致。
序列号:请查看【3.4 序列号】的详细说明。
波特率:串口所使用的波特率,与连接的其它设备一致。
串口参数如 SERIAL_8N1 后三位代表的意义如下:
其中 8表示数据位(modbus固定为8位)
N :无校验 E :偶检验 O :奇校验
1或2表示停止位
2.2.2 写多个
Mixly
Scratch
ModbusRTU 写多个保持寄存器(功能码0x10),在远程设备中写入连续寄存器块,数据变量类型为uint16_t类型的数组。
站号:从站站号
地址:从站寄存器起始地址,地址范围0 – 65535。
数量:要写入寄存器的数量,最多可以写入 123 个连续的 16 位 寄存器。
数据:需要写入的数据,类型为uint16_t类型的数组,数组的长度必须等于或大于写入的数量。
返回:
该函数返回数据含义如下:
正常返回为该指令的功能码
返回-1时为通讯故障,原因可能为以下几点: 发送失败、接收失败、响应与请示地址不同。
当出现其它错误时会将错误代码+100返回,
错误代码如下所示:
0x01 非法功能 (Illegal Function)
0x02 非法数据地址 (Illegal Data Address)
0x03 非法数据值 (Illegal Data Value)
0x04设备故障 (Slave Device Failure)
0x05设备忙 (Acknowledge)
0x06负号应答 (Negative Acknowledge)
0x07内存区保留 (Memory Parity Error)
0x08Gateway路径不存在 (Gateway Path Not Available)
0x0AGateway目标失败 (Target Device Failed to Respond)
如下图所示功能块,所有写多个数据的程序块内参数含义相同。
写多个线圈
Mixly
Scratch
2.2.3 写单个
Mixly
Scratch
ModbusRTU 写单个保持寄存器(功能码0x06),在远程设备中写入连续寄存器块,数据变量类型为uint8_t类型的数据。
站号:同上
地址:同上
数量:同上
数据:同上。
返回:同上
所有写单个数据的程序块内参数含义相同
写单个线圈
Mixly
Scratch
2.2.4 读取功能块
Mixly
Scratch
ModbusRTU读取数据,从远程设备中读取数据到变量中,变量的类型要与功能块上一致。
站号:同上
地址:同上
数量:同上
数据:同上。
返回:同上
2.2.5 通讯超时设置
设置从服务器接收响应的超时时间,在设置时间内如果没有数据到达则表示接收数据完成。默认值50ms(能满足大部分通讯),每种设备的响应时间不尽相同,请设置合适的超时时间以达到最高效率。设置时间过长会影响收发效率,时间过短可能会造成通讯错误。
Mixly
Scratch
三、 模块介绍
3.1 模块功能介绍
齐护RS485转TTL模块
3.3V与5.0V电源、信号完美兼容的RS485自动流向控制模块无需“收-发”控制,使用本模块跟您操作串口一样简单 (1)、3. 3V与5.0V信号兼容 (2)、采用原装进口芯片,工业级设计,抗干扰能力强同时采用更为有效的485防雷设计,可在工业现场及野外恶劣的环境下使用,工作温度为-40°C至+85°C,传输距离可达千米( 具体距离和使用环境,传输速率有关连。) (3)具有RXD、TXD信号指示灯,收发状况尽收眼底。
模块兼容3.3V~5V信号,供电建议不超过5V。
序号 端子名称 功能
1 VCC 3.3V或5V(模块电源+)
2 TXD 模块串口发送
3 RXD 模块串口接收
4 GND 电源地
5 A+ RS485 A+
6 B- RS485 B-
7 EARTH 接大地,用于防干扰
3.2 终端电阻
短接R0可使用内置120Ω电阻做为终端电阻。
什么时候需要加终端电阻?
在RS485通信中,长总线传输和多终端连接,需要在总线的两端加终端电阻。具体请查阅相关资料。
3.3 防干扰
由于工业控制环境恶劣,通信线路中会出现更多的干扰耦合,从而影响RS485总线的可靠性,甚至会损坏RS485收发器芯片。
常见防干扰措施:
RS485总线隔离
在485总线上添加隔离器件。
使用屏蔽双绞线
使用带屏蔽的双绞线,并且屏蔽层单点接大地,连接能够有效的抑制干扰。
增加TVS管或串联磁珠
在总线上增加TVS管或串联磁珠,可起到保护485收发器效果。
3.4 序列号
序列号印于产品两侧,为产品唯一标识,编写程序时需要使用。
四、 主站例程(ESP32)
与永宏PLC的modbusRTU通讯示例
4.1 使用器材
永宏PLC FBS60MT+FBS-CB5通讯板(485)
QH_modbus通讯模块
齐护C02开发板(ESP32)
4.2 接线
C02–>QH_modbus通讯模块
C02 QH_modbus通讯模块
3.3V或5V VCC
GND GND
16 RX
17 TX
QH_modbus通讯模块—>PLC(如实际应用应使用屏蔽双绞线,并接地)
QH_modbus通讯模块 PLC 485接口
A+ +
B- -
注:PLC接入电源前请确认接线正确再上电!
4.3 PLC参数设置
设置PLC通信模块参数为 9600 8N1,通讯协议为Modbus RTU(Slave)从站。有些PLC做为modbusRTU的从站需要编写PLC程序,永宏PLC不需要。设置完成后PLC断电重启后通讯参数才会生效。
4.4 PLC地址
查阅PLC手册,可以看出永宏的modbus只支持0X与4X寄存器。也就是只支持线圈和保持寄存器相关的功能指令。
例如:
Y输出,使用读写线圈指令,地址范围0~255(表中是+1后的,在我们编程中不需要+1)读取和写入。
X输入,使用读线圈指令,地址范围1000~1255
R0寄存器,对应读保持寄存器指令,地址范围0~4167。
4.5 写保持寄存器
站号、波特率、数据位、停止位、校验位设置需要与PLC一致。
连续对R0开始的10个寄存器写入数据,在写入完成之后对每个数据+1。
写入指令执行完成后将执行结果码保存到result,再判断是否成功写入。
abc变量用于计算通讯用时。
Mixly
Scratch
联机PLC监视PLC寄存器的变化
4.6 读保持寄存器
读取寄存器与写入寄存器的使用方法相似。
Mixly
Scratch
联机PLC观察数据,PLC数据与串口打印数据一致。
所有其它读取功能使用方法与其相同,注意变量的类型要与功能块标识一样
五、从站例程(ESP32)
5.1 使用器材
USB转485通讯线,电脑端使用modbus Poll模拟modbusRTU主站
QH_modbus通讯模块
齐护C02开发板(ESP32芯片)
5.2 接线
C02–>QH_modbus通讯模块
C02 QH_modbus通讯模块
3.3V或5V VCC
GND GND
16 RX
17 TX
QH_modbus通讯模块—>USB转485通讯线
QH_modbus通讯模块 USB转485通讯线
A+ A+
B- B+
5.3, 程序
做为从端,只能被动的接收消息,被动的接收主端的读写寄存器请求并响应。
只有配好对应的寄存器,主端才能去访问,否则会回复对应的错误信息。
Mixly
Scratch
5.4 电脑端modbus poll软件配置
设置与C02相同串口参数
点击菜单 连接–>连接
连接选择 serial port
串口设置选择USB转485线的串口端口号
其它的波特率、数据位、校验位、停止位与程序中相同。
设置–>读/写定义,配置读写寄地址,这里的地址用于在主画面显示.
从站ID填写程序中的站号
地址与程序中相同
数量,填写你要读取的数量
扫描间隔,读取的间隔时间
点击连接后图中1表示连接成功。双击对应的值可以修改其中的值。
也可以使用菜单功能中的单个指令对寄存进行操作。
可以使用其它命令读写从机寄存器
从主站对其数据修改后,我们可以从C02的串口观察到实际数据的更改。
六、主站例程(UNO)
UNO的使用和ESP32没有太大区别,唯一不同的是UNO下使用的是软串口,无法定义除波特率外的其它参数(数据位、停止位、校验)。固定数据位为8,停止位为1,无校验。
图中例为读取从站保持寄存器示例。
Mixly
写保持寄存器
Mixly
七、从站例程(UNO)
UNO下从站暂时不可用。
八、 相关下载
测试程序:modbus_例程