准备工具
首先看两个工具:Modbus Slave 和 Modbus Poll;
这两款软件在调试通讯的时候,必不可少;
Modbus概述
Modbus 协议已广泛应用于当今工业控制领域。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC 可编程控制器等。Modbus 通讯物理接口可以选用串口(包括RS232 和 RS485),也可以选择以太网口。其通信遵循以下的过程:
● 主设备向从设备发送请求;
● 从设备分析并处理主设备的请求,然后向主设备发送结果;
● 如果出现任何差错,从设备将返回一个异常功能码。
注:带前缀 0x 或后缀 H 的数据为十六进制。
Modbus TCP/IP
在 Modbus 协议中,主机发送 Modbus 请求,从机根据请求内容向主机返回响应。主机总是主动方,从机总是被动方; 在 Modbus TCP 中,主机是客户端,而从机是服务器端,因此,在一个局域网中可存在多个主机和多个从机。主机和从机、服务端和客户端的关系如图:
Modbus TCP 指令说明
PDU(报文)由功能码+数据组成。功能码为 1 字节,数据长度不定,由具体功能决定。常用功能码如下表所示:
- 读线圈寄存器 01H
(1)描述:读线圈寄存器当前状态。
(2)查询:例如从机地址为 01H,线圈寄存器的起始地址为 0013H,结束地址为 0037H。该次查询总共访问 37个线圈寄存器。
我们先从这两个工具中获取一段报文:
打开这两个软件:
建立连接:(Modbus Poll 同理)
选择读取线圈状态
点击OK,打开连接
Modbus Poll 连接设置(与Modbus Slave基本类似) :
点击OK,建立连接
通讯设置好后,设置值,如下图:
如果上面设置没问题,此时两边的号地址内容是同时变化:
我们截取报文,分析发送报文,打开方式如下:
报文成对出现,Tx是请求报文,Rx是响应报文 ,我们选中一段报文Copy出来分析:
Tx:006-
02 12 00 00 00 06 01 01 00 00 00 0A
Rx:007-
02 12 00 00 00 05 01 01 02 01 00
Client request:
02 12 00 00 00 06 01 01 00 00 00 0A
上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( header handle);
02 12 00 00 00 06
02 12两个字节是Client发出的检验信息,Sever端只是需要将这两个字节的内容copy以后再放到response的报文的相应位子就可以了。
00 00 两个字节是表示tcp/ip 的协议的modbus的协议;
00 06 两个字节表示的是header handle后面还有多长的字节,即表示的是该字节以后的字节长度(lengch),可以看到在00 06后面还有 “01 01 00 00 00 0A” 6个字节,所以这两个字节表示的就是6;
PDU:
“01 01 00 00 00 0A”
01 一个字节表示slave address;
01 为Fuction code ;
00 00 表示Client request的寄存器地址;
00 0A 表示request 10个寄存器的长度;(寄存器个数)16进制的0A 即0*16+10=10。
Server response:
02 12 00 00 00 05 01 01 02 01 00
Header handle : “ 02 12 00 00 00 05”
02 12 为Server返回的检验码,copy from Client request;
其它的表示与客户端的表示相同
00 00 两个字节是表示tcp/ip 的协议的modbus的协议;
00 05 两个字节表示的是header handle后面还有多长的字节,即表示的是该字节以后的字节长度(lengch),可以看到在00 05后面还有 “01 01 02 00 00” 5个字节,所以这两个字节表示的就是5;
PDU:
“ 01 01 02 00 00”
01 是Slave address,从地址数;
01 是Function code ;
02 表示了回复给Clientrequest的需要读的寄存器的值的个数;
01 00 表示了2 个字节的值。(数据从左往右表示 高低位调换即: 0000 0001 ->01,与Modbus Slave中显示的1000 0000 00,4个为一个16进制数值;一个寄存器16个位,即2个字节);
其余功能码报文解析与上文基本类似。