文章目录
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