Modbus协议

Mod bus协议

实际项目中知识点补充随手记录,一直更新,自用学习查漏补缺,有空整理。

-Modbus 协议,(通俗来讲一种bus协议)定义了一种在控制器(例如 PLC、传感器、执行器等)之间进行通信的标准方式;
-通过Modbus,设备可以发送和接收数据,以便监视和控制各种过程,这些数据可以包括传感器读数、执行器控制指令、设备状态信息等;
-在 OSI(开放系统互连)模型的七层网络结构中,Modbus 协议位于应用层。

  • Modbus 协议是一种用于工业控制系统中的串行通信协议,面向消息,用于在工业设备(如传感器、执行器、PLC 等)之间进行数据传输和通信。

-横向对比: HTTP 协议是一种用于万维网(World Wide Web)中的应用层协议,用于在客户端和服务器之间传输超文本(如网页)和相关数据。

帧结构 = 地址 + 功能码+ 数据 + 校验

1. Modbus RTU(基于串行通信)

发送:从机的地址+我要干嘛的功能码+我要查的寄存器的地址+我要查的寄存器地址的个数+校验码
在这里插入图片描述

回复:从机的地址+主机发我的功能码+要发送给主机数据的字节数+数据+校验码
在这里插入图片描述
主机(master)发送,从机(slave)回应

2. Modbus TCP(基于以太网)

 1.两者基本一样,Modbus TCP协议就是Modbus RTU协议在前面加上七字节MBAP报文头(00000 6),然后去掉两个CRC校验码字节。

 2.TCP需要传入网络socket信息;而RTU需要传入串口相关信息。

二者区别

帧结构:
  • Modbus TCP:使用TCP/IP作为底层协议,数据以TCP数据包的形式传输。 Modbus TCP帧包含了TCP/IP头部,以及Modbus应用数据单元(ADU)。
  • Modbus RTU:使用二进制编码的串行帧结构进行数据传输。Modbus RTU帧包含了地址、功能码、数据、CRC(循环冗余校验)等字段。
RTU帧格式(最大256字节):

地址 +功能码+数据+CRC校验
从站地址(1 byte)+功能码(1 byte)+数据区(N bytes)+校验码(2 bytes)
在这里插入图片描述

TCP帧格式:

增添了一个MBAP报文,少了CRC校验(主要因为tcp可靠)
MBAP(7 byte) + 功能码(1 byte) + 数据(N byte)

在这里插入图片描述

MBAP报文头

在这里插入图片描述
事务元处理标识符:用于事务处理配对。在响应中,MODBUS 服务器复制请求的事务处理标识符。

协议标识符:用于系统内的多路复用。通过值 0 识别 MODBUS 协议。

长度:长度域是下一个域的字节数,包括单元标识符和数据域。

单元标识符:为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串 行链路之间的网关对 MODBUS 或 MODBUS+串行链路从站的通信。MODBUS 客户机在请求中设置 这个域,在响应中服务器必须利用相同的值返回这个域。

 - Modbus TCP:
Modbus TCP是一种基于TCP/IP协议的通信协议,用于在网络上进行通信。它使用了类似于因特网上网页浏览时使用的协议来传输数据。
在Modbus TCP中,通常会将数据存储在设备的寄存器中。这些寄存器可以包含不同类型的数据,例如整数、浮点数等等。
因此,当讨论Modbus TCP时,常常会提到“寄存器类型”,用来描述寄存器中存储的数据的类型和含义。

 - Modbus RTU
Modbus RTU是一种基于串行通信的通信协议,通常通过串口(如RS-232、RS-485等)进行通信。它是一种在工业领域广泛应用的通信协议,适用于远程设备之间的通信。
 

通常情况下,Modbus RTU主要包括以下寄存器类型:

  • Coil (线圈寄存器):通常用于表示开关量数据,对应功能码01和05。
  • Discrete Input(离散输入寄存器):输入状态寄存器,用于表示离散输入状态,对应功能码02。
  • Holding Register(保持寄存器):用于存储二进制或16位整数数据,对应功能码03和06。
  • Input Register(输入寄存器):用于存储输入数据,对应功能码04。

如根据不同对象类型的寄存器,计算地址

int GetModbusAddress(int iObjType, int iAddress)
{
   
	int tempAddress = -1;
	switch (iObjType)
	{
      // Coil (线圈寄存器)
		case D:			tempAddress = 0x0000 + iAddress; break;
		case ID:		tempAddress = 0x5000 + iAddress; break;
		case ID1xxxx:	tempAddress = 0x5100 + iAddress; break;
		case ID2xxxx:	tempAddress = 0x58D0 + iAddress; break;
		case ID3xxxx:	tempAddress = 0x5BF0 + iAddress; break;
		case QD:		tempAddress = 0x6000 + iAddress; break;
		case QD1xxxx:	tempAddress 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值