1、Modbus通信协议介绍
Modbus通信协议是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信,OSI模型见图1.1。
图1.1
Modbus是一个请求/应答协议,并且提供功能码规定的服务,modbus功能码是modbus请求/应答PDU的元素。
Modbus通信栈见图1.2所示。
图1.2
Modbus缩略语:
ADU 应用数据单元
HDLC 高级数据链路控制
HMI 人机界面
IETF 因特网工程工作组
I/O 输入/输出设备
IP 互连网协议
MAC 介质访问控制
MB MODBUS 协议
MBAP MODBUS 协议
PDU 协议数据单元
PLC 可编程逻辑控制器
TCP 传输控制协议
2、Modbus通信协议描述
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域。
Modbus通用帧见图1.3所示。
图1.3
启动Modbus事务处理的客户机创建Modbus应用数据单元。功能码向服务器指示将执行哪种操作。
Modbus协议建立了客户机启动的请求格式。
用一个字节编码Modbus数据单元的功能码域。有效的码字范围是十进制1-255(128-255是异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。
从客户机向服务器设备发送的 报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。
在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息。功能码仅说明操作。
如果在一个正确接收的MODBUS ADU中,不出现与请求MODBUS功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求 MODBUS 功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。
当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应,modbus事务处理见图1.4。
图1.4 modbus事务处理(无差错)
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1,异常响应见图1.5所示。
3、Modbus功能码定义
modbus功能码定义见图1.6所示。
图1.6
4、以功能码03为例进行介绍
在远程设备通信中,使用03功能码读取保存寄存器连续块的内容,请求PDU说明了起始寄存器地址和寄存器数量,从零开始寻址寄存器,因此寻址寄存器1-16为0-15.
将响应报文中的寄存器数据分成每个寄存器有两个字节,每个字节中直接地调整二进制内容,对于每个寄存器,第一个字节包括高位比特,第二个字节包括低位比特。
请求 | ||
功能码 | 1个字节 | 0x03 |
起始地址 | 2个字节 | 0x0000至0xffff |
寄存器数量 | 2个字节 | 1-125(0x7D) |
响应 | ||
功能码 | 1个字节 | 0x03 |
字节数 | 1个字节 | 2xN |
寄存器值 | Nx2个字节 |
|
N=寄存器的数量 |
错误 | ||
差错码 | 1个字节 | 0x83 |
异常码 | 1个字节 | 01/02/03/04 |
以读取寄存器108-110为例
请求 | 响应 | ||||
域名 | (十六进制) | 备注 | 域名 | (十六进制) | 备注 |
功能码 | 03 |
| 功能 | 03 | ··· |
高起始地址 | 00 | 0x006B | 字节数 | 06 | 2*3个字节 |
低起始地址 | 6B | 寄存器值Hi(108) | 02 | 0x022B | |
高寄存器编号 | 00 | 0x0003 | 寄存器值Lo(108) | 2B | |
低寄存器编号 | 03 | 寄存器值Hi(109) | 00 | 0x0000 | |
| 寄存器值Lo(109) | 00 | |||
寄存器值Hi(110) | 00 | 0x0064 | |||
寄存器值Lo(110) | 64 |
读保持寄存器流程框图见图1.7所示
图1.7