Modbus TCP通信协议

编辑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近工作需要用到Modbus-TCP通信协议,找了些资料开始学习,顺便记录学习过程。

提示:以下是本篇文章正文内容,下面案例可供参考

一、协议是什么?

类似于人与人沟通用的语言,协议是设备之间沟通的语言,是通信双方都要遵守的内容规范,这样通信双方才能理解传递的数据代表的含义。
协议规范可以有很多种,来适应不同的设备以及通信要求,Modbus是一个串行通信协议。

我们在看Modbus的时候,经常会看到485串口,232串口,这些是什么呢?

RS232,RS485是一种电平标准

数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压、-1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。

那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232

也就是RS-485电平标准确定传输过来的数据是0还是1,在此基础上,这些字节数据根据modbus通信协议来进行数据的交互传输。
硬件层协议:解决0和1的可靠传输,常有RS232、RS485、CAN、IIC、SPI …
软件层协议:解决传输目的,常有Modbus、TCP/IP、CANopen …

二、Modbus协议

1.概念

Modbus是一种应用层报文传输协议,定义了控制器能认识和使用的消息结构,位于OSI模型上的第七层应用层,协议本身并没有定义物理层,定义了控制器能够认识和使用的消息结构,不管它们是通过何种网络、何种端口进行通讯的。
简单来说,Modbus是一个总线通信协议,但是不依赖于硬件总线。

2.支持接口和报文类型

Modbus协议支持多种电气接口,如串口和以太网口。
不同的电气接口对应使用不同的报文类型,Modbus报文类型分为ASCII、RTU和TCP/IP三种。
Modbus协议使用串口传输时可以选择ASCII或者RTU模式,支持RS232、RS422和RS485标准;通过以太网传输时使用TCP。

3.优点

(1)公开发表并且无版权要求
(2)对供应商来说,修改移动本地的比特或字节没有很多限制。
(3)Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信
采用master/slave方式通信。

4.工作过程

Modbus是一主多从的通信协议,工作过程如下:

主机(Master)向从机(Slave)发送请求;
从机分析并处理请求,并向主机发送结果;
如果有任何问题,从机将返回一个异常码。

Modbus工作过程
Modbus通信中只有一个设备可以发送请求。从机只能接收主机发送的数据来进行响应,不能自己发消息给主机,从机之间不能直接通讯。
Modbus不能同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。
Modbus没有忙机制判断,需要通过软件的方式来判断是否正常接收。

5.Modbus ASCII、RTU

Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式。一个ModBus命令包含了打算执行的设备的Modbus地址。所有设备都会收到命令,但只有指定位置的设备会执行及回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令)。所有的Modbus命令包含了检查码,以确定到达的命令没有被破坏(数据校验)。基本的ModBus命令能指令一个RTU改变它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。

三、Modbus TCP协议

1.数据传输方式

Modbus的数据传输被定义为对存储区的读写,并且存储的数据类型可以分为布尔量(1位)和寄存器(16位)
Modbus协议规定4个存储区:
在这里插入图片描述
Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。

2.Modbus TCP数据帧

Modbus TCP的数据帧可以分为两部分:MBAP+PDU。

在这里插入图片描述
在这里插入图片描述

2.1 报文头MBAP

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

序号名称字节长度说明
1事务处理标识2可以理解为报文的序号,一般每次通信之后就要加1以区别不同的通信数据报文。
2协议标识200 00表示Modbus TCP协议
3长度2表示接下来总字节数
4单元标识符1可以理解为设备地址

2.2 帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

PDU:协议数据单元,Modbus PDU(protocol data unit)

modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。
在这里插入图片描述
线圈:PLC的输出位,开关量,在modbus中可读可写;
离散量:PLC的输入位,开关量,在modbus中只读;
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在modbus中只读;
保持寄存器:PLC中用于输出模拟量信号的寄存器,在modbus中可读可写。

根据对象的不同,Modbus的功能码有:
在这里插入图片描述

2.3 数据报文结构举例

请求:00 00 00 00 00 06 09 03 00 00 00 01
响应:00 00 00 00 00 05 09 03 02 12 34

一次modbus tcp读取保持寄存器的通信分析(省略了ip/tcp头):从左向右分析该数据报文:

请求

00 00为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文;

00 00表示协议标识符,00 00为modbus协议;

00 06为数据长度,用来指示接下来数据的长度,单位字节;

09为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址。以上七个字节也被称为modbus报文头;

03为功能码,此时代码03为读取保持寄存器数据;

00 00为起始地址;

00 01为寄存器数量,(word数量)。

响应:

00 00为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;

00 00为协议标识符,与先前对应的请求保持一致;

00 05为数据长度,用来指示接下来数据的长度,单位字节;

09为设备地址,应答报文要求与先前对应的请求保持一致;

03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;

02指示接下来数据的字节长度;

12 34为被读取的保持寄存器中的数据值,即要求被读取的地址为00 00的保持寄存器中的数值为1234h。

3.通信方式

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

主站请求:功能码+数据
从站正常响应:请求功能码+响应数据
从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
注意:需要超时管理机制,避免无期限的等待可能不出现的应答


参考博文:https://blog.csdn.net/as480133937/article/details/123197782?spm=1001.2014.3001.5502
https://blog.csdn.net/zwxue251/article/details/24154951
https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1
https://zhuanlan.zhihu.com/p/554975366?utm_id=0
https://baijiahao.baidu.com/s?id=1752820511641531972&wfr=spider&for=pc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值