【实用篇】ModbusTCP协议详解

概述

Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

(视频:先来了解什么是Modbus通讯?)

A

Modbus TCP数据帧

ModbusTCP的数据帧可分为两部分:MBAP+PDU。

(一)报文头MBAP:MBAP为报文头,长度为7字节,组成如下:

(二)帧结构PDU:PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

(1)功能码:Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。

(2)根据对象的不同,Modbus的功能码有:

(3)说明更详细的表:

B

PDU详细结构

(1)0x01:读线圈:在从站中读1~2000个连续线圈状态,ON=1,OFF=0

  • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)

  • 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)

  • 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
    00 01 00 00 00 06 01 01 00 02 00 08

  • 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
    00 01 00 00 00 04 01 01 01 01

(2)0x05:写单个线圈:将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF。

  • 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)

  • 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)

  • 如:将地址为0x0003的线圈设为ON
    00 01 00 00 00 06 01 05 00 03 FF 00

  • 回:写入成功
    00 01 00 00 00 06 01 05 00 03 FF 00

(3)0x0F:写多个线圈:将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF。

  • 请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L

  • 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L

(4)0x02:读离散量输入:从一个从站中读1~2000个连续的离散量输入状态。

  • 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)

  • 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))

  • 如:从地址0x0000开始读0x0012个离散量输入
    00 01 00 00 00 06 01 02 00 00 00 12

  • 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
    00 01 00 00 00 06 01 02 03 01 04 00

(5)0x04:读输入寄存器:从一个远程设备中读1~2000个连续输入寄存器。

  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

  • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)

  • 如:读起始地址为0x0002,数量为0x0005的寄存器数据
    00 01 00 00 00 06 01 04 00 02 00 05

  • 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
    00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

(6)0x03:读保持寄存器:从远程设备中读保持寄存器连续块的内容。

  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

  • 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)

  • 如:起始地址是0x0000,寄存器数量是 0x0003
    00 01 00 00 00 06 01 03 00 00 00 03

  • 回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
    00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

(7)0x06:写单个保持寄存器:在一个远程设备中写一个保持寄存器。

  • 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)

  • 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)

  • 如:向地址是0x0000的寄存器写入数据0x000A
    00 01 00 00 00 06 01 06 00 00 00 0A

  • 回:写入成功
    00 01 00 00 00 06 01 06 00 00 00 0A

(8)0x10:写多个保持寄存器:在一个远程设备中写连续寄存器块(1~123个寄存器)。

  • 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)

  • 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

  • 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
    00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F

  • 回:写入成功
    00 01 00 00 00 06 01 10 00 00 00 01

C

Modbus TCP示例报文

ModBusTcp与串行链路Modbus的数据域是一致的,具体数据域可以参考串行Modbus。这里给出几个ModbusTcp的链路解析说明,辅助新人分析报文。

image.png

image.png

D

Modbus TCP通信

(一)通信方式

Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。

  • 主站请求:功能码+数据

  • 从站正常响应:请求功能码+响应数据

  • 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型

  • 需要超时管理机制,避免无期限的等待可能不出现的应答

  • IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

(二)通信过程

  • connect 建立TCP连接

  • 准备Modbus报文

  • 使用send命令发送报文

  • 在同一连接下等待应答

  • 使用recv命令读取报文,完成一次数据交换

  • 通信任务结束时,关闭TCP连接

E

仿真软件

  • Modbus poll 和Modbus slave是一组Modbus仿真软件,可以实现Modbus RTU、TCP、串口仿真等。

  • 仿真软件下载关注公众号回复:Modbuspoll

  • 仿真软件下载关注公众号回复:Modbusslave

  • undefined

  • 在ModbusTCP中,Modbus poll 作为客户端请求数据,Modbus slave 作为服务器端处理请求。

  • 使用c语言编写客户端连接Modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。

  • 使用软件时,需要指定功能码,在setup->slave definition或者poll definition中进行设置。
    – slave ID:从站编号(事务标识符)
    – function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作
    – address:开始地址
    – quantity:寄存器/线圈/离散量 的数量

  • 免责声明:本文转自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系删除,谢谢!

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值