1. ModBus基本知识
ModBus是作为主从通讯的常用通讯手段之一,在实际应用场景中,主设备一般为工控机,从设备则一般为PLC,ModBus采集模块,带485通讯的传感器、仪器仪表等。根据物理接口,将通讯大体分为串口通讯和以太网口通讯。
其中RS232/RS485/RS422为串口通讯,对应ModBus RTU及ModBus ASCII通讯协议。
RS-232:全双工收发接口,这个基本用在点对点通信场景下,不适合多点拓扑连接,采用共模电平编码,一般需要Rxd/Txd/Gnd三根线连接。
RS-485:半双工收发接口,这是最为常用的modbus物理层,信号采用差分电平编码,用一对双绞线现场布线,抗干扰性能也不错
RS-422:全双工收发接口,这种物理层也有比较多的应用,信号采用差分电平编码,需要两对双绞线现场布线,抗干扰性能也不错。与RS-485相比,其优势在于可以实现全双工,通信的效率高些,所需要的代价就是现场布线需要两对双绞线,增加了一定的成本。
以太网口通讯则对应ModBus TCP通讯协议,主从设备通过以太网传输数据和通讯控制。
2.ModBus报文格式及调试
0x01 读线圈
0x02 读离散量输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器
2.1 TCP的报文格式
2.2 TCP的调试
MODSIM32(服务端) 网络调试助手(客户端)
Step.1 win+R打开运行,输入cmd,进入命令行窗口。
在命令行窗口输入ipconfig,查询本地的ip地址。
查找本地的IP地址,即IPv4后面这一段,我这里以192.168.1.110.为例。
Step.2 打开Modsim及网络调试助手,并进行连接。
找到菜单栏中的文件-新建后,点击连接设置-连接-Modbus/TCP连接。
输入端口号8080,点击确认。(别的也可以,自己规定的。)
窗口中4个参数的含义分别是:
Address:起始的线圈序号
Length:线圈个数
Device id :从站站号
MODBUS Point Type:Modbus通讯的功能号。
服务端设置好了后,设置客户端,即网络调试助手。协议类型选择TCP_Client,即TCP服务端。远程主机地址与命令行中查询到的地址要保持一致,端口号则与服务端设置的端口号保存一致。接受设置和发送设置,都要选择HEX而不是ASCII!!设置好了之后点击连接即可。
Step.3 按照报文格式传输数据
我们把TCP报文格式一节中,读线圈功能码的报文举例,复制过来。即
格式 | 事务处理标识 | 协议标识 | 报文长度 | 单元标识 | 功能码 | 起始地址 | 寄存器个数 |
字节占用 | 2 | 2 | 2 | 1 | 1 | 2 | 2 |
报文举例 | 00 01 | 00 00 | 00 06 | 01 | 01 | 00 00 | 00 08 |
事务处理标识没有什么意义。
协议标识默认00 00。
报文长度06,则表示后面还有6个字节分别是,01 01 00 00 00 08 共计6个。
单元标识表示站号地址,即上文提到的Device id(站号)
功能码01为读线圈功能码。
起始地址00 00,从0开始读取。
寄存器个数表示线圈个数,在这里为8个。
3.1 打开Modsim窗口,双击00001,将线圈状态改为开。
3.2 打开网络调试助手
将报文举例的数据复制到其中,并发送。得到服务端返回的数据。
00 01 :事务处理表示,没什么意义
00 00 :协议标识,默认00 00
00 04:报文长度,表示后面还有4个字节
01:代表站号地址,是1号站回复的
01:功能码,代表读线圈
01:代表后面读回来的数据占用1个字节
01:读回来的数据,01(十六进制)
到这里就完成了TCP的连接与调试。