Modbus
-
-
- 0. 前言
- 1. 基本宏观概念(大方面,是什么,用什么)
-
- 1.1 通信模式分类
-
- 1.1.1 并行通信(数据同时传输)
- 1.1.2 串行通信(数据按顺序传输)
-
- 1.1.2.1 异步串行通信(最常用的通信方式)
- 1.2.2.2 同步串行通信
- 1.2 Modbus基本概念
- 1.3 应用场景
- 2. 分解模块概念(细节步骤,包括什么,如何定义和操作)
-
- 2.1 单播模式和广播模式
- 2.2 Modbus帧格式
- 2.3 寄存器(数据的存储和读取)
-
- 2.3.1 寄存器种类
- 2.3.2 寄存器地址分配
- 2.4 功能代码(主机发送的命令代码)
-
- 2.4.1功能码分类
- 2.4.2 例如一些功能码
- 2.5 异常码(服务器或从站返回的异常代号)
-
- 2.5.1 通信状况
- 2.5.2 响应类型
- 2.5.3 异常码表
- 2.5.4 事务处理过程
- 2.6 数据帧格式
-
- 2.6.1 0x01功能码(读线圈状态)
- 2.6.2 0x03功能码(读保持寄存器)
- 2.6.3 0x0f功能码(写多个线圈)
- 2.6.4 0x10功能码(写多个维持寄存器)
- 2.7 三种通信模式
-
- 2.7.1 串行传输模式(异步串行传输)
- 2.7.2 以太网(MODBUS TCP/IP)
-
0. 前言
最近学习Modbus,我0基础,学习前不知道Modbus是什么?我以前从未接触过这个协议;看了4天资料,CSDN博文总是不尽如人意,缺枝短叶,看完还是一头雾水;后来结合起来Modbus中文协议终于有了更彻底的理解。在这里仔细整理了两天的学习笔记,给出了相对完整的学习过程和知识记录。
1. 基本宏观概念(大方面,是什么,用什么)
:
-
- 并行通信
- 串行通信
1.1 通信模式分类
1.1.1 并行通信(数据同时传输)
并行通信通常用于快速设备之间,如CPU与存储设备、存储器和存储器、主机和打印机并行通信。并行通信,必须有多少数据线,如下图所示 位数据有11条数据线。
- :传输速度快
- :引脚资源占用较多
1.1.2 串行通信(数据一位一位顺序依次传送)
串行通信至少可以只需要一条通信线,只发送或只接收。因此,它大大节省了系统资源,降低了系统成本。由于只使用一条数据线,它通常用于在传输距离长、速度要求低的情况下,以降低传输速度换取资源。
- :通信线路简单,引脚资源少,成本低
- :传输速度慢
1.1.2.1 异步串行通信(最常用的通信方式)
通信格式固定,数据以相同的帧格式传输,每帧由起始位、数据位、奇偶校验位和停止位组成。
- :当通信线路上没有数据传输时,它处于高电平(逻辑1)状态。当发送设备发送字符数据时,首先发送低电平(逻辑0)信号,并告诉接收器开始发送数据。这个低电平是一个起始位置。当接收器收到此信息时,准备接收该信息。
- :可以是5 位、6 位、7 位、或8 数据传输时,低位在前。
- :用于数据传输过程中的检错
- :奇数是确保数据位和验证位1的数量
- :确保数据位和验证位1的数量为偶数
- :没有校准位,此时校准位补充一个停止位,即两个停止位
- :停止位可以是1或1.5 位或2 位置。接收端收到停止位置后,知道上一个字符已经传输完毕,同时准备接收下一个字符。如果停止位置后没有传输下一个字符,则保持线路为1。1意味着通信线路处于空闲等待状态。空闲位置的存在是异步通信的特点之一。
1.2.2.2 同步串行通信
- 通信双方共用一个时钟,这是同步通信区分为异步通信的最显著特征。为了确保正确的接收,发送人不仅传输数据,还传输同步时钟。
- 同步传输是以数据块为传输单位,在数据块传输过程中,为了提高通信速度,删除起始位置和停止位置。在数据开始传输之前,使用同步字符(通常约定1~2 (1),并通过时钟实现发送端和接收端的同步,即检测到规定的同步字符后,连续按顺序传输数据,直到数据传输完成。
- 数据块和数据块之间的时间间隔是固定的,不允许有空位。当线路闲置或不发送信息时,发送同步字符。
- 在同步传输中,发送方在接收方发送响应后发送数据包。
- 同步串行和异步串行
- 串行通信原理和实验模拟
- UART串口校验方法(无校验、奇偶校验、固定校验)
- 奇偶校验
1.2 Modbus基本概念
- 是一种,是Modicon公司(现施耐德电气)SchneiderElectric)1979年使用可编程逻辑控制器(PLC)通信而发表。Modbus已成为工业领域通信协议的业界标准(Defacto),并且现在是工业电子设备之间常用的连接方式,是工业自动化领域里使用最普遍的协议。随着电子技术计算机和通信技术的不断发展,Modbus也从最古老的发展到了 和。
- Modbus是上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
- 从1979年开始,Modbus作为工业串行链路的事实标准,Modbus使成千上万的自动化设备能够通信。目前,对简单而精致的Modbus结构的支持仍在增长。互联网用户能够使用TCP/P栈上的保留系统端口502访问。
- ModbusModbus是一个,并且提供功能码规定的服务。 Modbus功能码是 Modbus请求/应答PDU的元素。
- Modbus是一种,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。
- 【百度百科】
1.3 应用场景
- 工业、建筑、基础设施
- 每种设备(PC、HMI、控制面板、驱动器、运动控制、I/O设备……)都能使用Modbus协议来启动远程操作。同样的通信能够在基于串行链路和以太网TCP/IP网络上进行。网关能够实现在各种使用Modbus协议的总线或网络之间的通信。
2. 分解模块概念(细节步骤,包括什么东西,怎么定义和运作的)
通信就是交流,协议就是交流的规范或者语言。Modbus简单来说就是主机和远程设备的交流语言。工业上,比如我想获得工厂温度、湿度信息,那我先通过传感器获得温度湿度数据,保存到记录里,我在办公室想知道这个信息,那么我只要保证三点:和工厂的控制设备连接、发送命令,控制设备返回响应,这三项满足,就能远程获取信息或者控制控制器了。
那么这里面包括了几点:数据的存储和读取(线圈和寄存器)、命令的种类(功能码)、数据的传输(通信模式、数据帧格式)、数据正确与否的检验(校验)、反馈或响应(异常码)等模块。
:
-
- 寄存器种类
- 寄存器地址分配
-
- 功能码分类
- 部分功能码举例
-
- 通信状况
- 响应类型
- 异常码表
- 事务处理流程
-
- 0x01功能码
- 0x03功能码
- 0x0f功能码
- 0x10功能码
-
- 串行传输模式:RTU、ASCII
- 以太网(TCP/IP)
2.1 单播模式与广播模式
:“”通讯。主站只寻找某一确定的从站,从站接收到命令后处理,并返回一个应答报文。主站需要发出一个命令报名并处理从站返回的报文,从站需要接收主站的命令报文并发出一个应答报文。每个子节点必须有唯一的地址(1-247)。
“”。主站向所有从站发送请求,对于主站发送的广播请求没有应答返回,广播请求必须是写命令。所有从站必须接收写功能的广播。地址0用来广播通信。
2.2 Modbus帧格式
Modbus应用协议定义了一个独立于通信层的PDU(Protocol DataUnit),在不同的总线或者网络的Modbus协议同过在PDU上添加对应的附加域,构造出能用于当前通信的ADU。
Modbus合法字节地址为十进制0-247,0为广播地址,每个子设备地址为1-247。主节点将子节点地址填入地址域来寻找子节点,子节点将自己的地址填入来告知主节点是哪个子节点在应答。
- 表明了主节点要求子节点执行的操作。
- 包括了请求时的具体细节或者返回时的数据细节。
- 是串行传输中对地址域和PDU的冗余校验值,不同的传输模式采用不同的校验方式
2.3 寄存器(数据的存储和读取)
2.3.1 寄存器种类
| 寄存器种类 | 说明 | PLC类比 | 举例 |
|---|---|---|---|
| 线圈状态 | 输出端口。可设定端口的输出状态,也可以读取该位的输出状态。可分为两种不同的执行状态,例如保持型或边沿触发型。可读可写。 | DO数字量输出 | 电磁阀输出,MOSFET输出,LED显示等。 |
| 离散输入状态 | 输入端口。通过外部设定改变输入状态,可读但不可写。 | DI数字量输入 | 拨码开关,接近开关等。 |
| 保持寄存器 | 输出参数或保持参数,控制器运行时被设定的某些参数。可读可写。 | AO模拟量输出 | 模拟量输出设定值,PID运行参数,变量阀输出大小,传感器报警上限下限。 |
| 输入寄存器 | 输入参数。控制器运行时从外部设备获得的参数。可读但不可写。 | AI模拟量输入 | 模拟量输入 |
2.3.2 寄存器地址分配
寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代表寄存器类型。
寄存器协议地址指指通信时使用的寄存器地址,例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。例如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002,虽然两个PLC寄存器寄存器通信时使用相同的地址,但是需要使用不同的功能码访问,不同的功能码对应操作对应确定的PLC地址,所以访问时不存在冲突。
| 寄存器PLC地址 | 寄存器协议地址 | 适用的功能码(指令代号) | 寄存器种类 | 读写状态 |
|---|---|---|---|---|
| 00001-09999 | 0000-FFFF | 01H、05H、0FH | 线圈状态 | 可读可写 |
| 10001-19999 | 0000-FFFF | 02H | 离散输入状态 | 可读 |
| 30001-39999 | 0000-FFFF | 04H | 输入寄存器 | 可读 |
| 40001-49999 | 0000-FFFF | 03H、06H、0FH | 保持寄存器 | 可读可写 |
2.4 功能码(主机发送的命令代码)
2.4.1功能码分类
功能码按操作对象可以分为两种:位操作功能码(最小单位是bit)和字操作功能码(最小单位为2字节)
-
是较好地被定义的功能码
-
保证是唯一的
-
MODBUS组织可改变的
-
公开证明的
-
具有可用的一致性调试
-
由Modbus-IDA.org确认的
:
- 有两个用户定义功能码的定义范围,即65-72和十进制100-110
- 用户没有MODBUS组织的任何批准就可以选择和实现一个功能码
- 不能保证被选功能码的使用是唯一的
- 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。
:
- 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。
2.4.2 部分功能码举例
| 功能码 | 异常功能码(+ 0×80) | 中文名称 | 寄存器PLC地址 | 位操作/字操作 | 操作数量 |
|---|---|---|---|---|---|
| 0×01 | 0×81 | 读线圈状态 | 00001-09999 | 位操作 | 单个或多个 |
| 0×02 | 0×82 | 读离散输入状态 | 10001-19999 | 位操作 | 单个或多个 |
| 0×03 | 0×83 | 读保持寄存器 | 40001-49999 | 字操作 | 单个或多个 |
| 0×04 | 0×84 | 读输入寄存器 | 30001-39999 | 字操作 | 单个或多个 |
| 0×05 | 0×85 | 写单个线圈 | 00001-09999 | 位操作 | 单个 |
| 0×06 | 0×86 | 写单个保持寄存器 | 40001-49999 | 字操作 | 单个 |
| 0×0F | 0×8F | 写多个线圈 | 00001-09999 | 位操作 | 多个 |
| 0×10 | 0×90 | 写多个保持寄存器 | 40001-49999 | 字操作 | 多个 |
2.5 异常码(服务器或从站返回的异常代号)
2.5.1 通信状况
- 请求正确的到达服务器,并且请求的内容服务器可以处理,那么服务器返回一个正常响应
- 请求正确的到达服务器,但是请求服务器无法处理(例如请求读一个不存在的寄存器),此时服务器将返回一个异常响应,通知主机错误和错误的类型。
- 请求到达服务器,但是不正确,检测到了通信错误(奇偶校验、LRC、CRC等等),那么不返回响应,主机将最终成为超时状态
- 请求就没到达服务器,服务器没收到也就更不会响应,主机也会成为超时状态
2.5.2 响应类型
-
:
-
:响应功能码 = 请求功能码
-
:请求中要求的任何数据
-
:响应帧自身计算
从站地址 功能码 数据 校验码(低位) 校验码(高位) 从站自身地址 与请求功能码保持一致(范围:0x00-0x7f) 请求中要求的任何数据 XX XX
-
-
:
-
用来为客户机提供处理过程中与被发现的差错相关的信息
-
:响应功能码 = 请求功能码 + 0x80(见2.4.2)
-
:提供一个异常码来指示差错原因
-
:响应帧自身计算
从站地址 功能码 数据 校验码(低位) 校验码(高位) 从站自身地址 请求功能码 + 0x80 异常码 XX XX
-
2.5.3 异常码表
| 代码 | 名称 | 含义 |
|---|---|---|
| 01 | 非法功能 | 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且要求返回寄存器值。 |
| 02 | 非法数据地址 | 对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说,带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生异常码 02。 |
| 03 | 非法数据值 | 对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。 |
| 04 | 从站设备故障 | 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 |
| 05 | 确认 | 与编程命令一起使用。服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机(或主站)中发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完成处理。 |
| 06 | 从属设备忙 | 与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。当服务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。 |
| 0A | 不可用网关路径 | 与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。 |
| 0B | 网关目标设备响应失败 | 与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。 |
2.5.4 事务处理流程
2.6 数据帧格式
2.6.1 0x01功能码(读线圈状态)
-
从站地址 功能码 起始地址(高位) 起始地址(低位) 数量(高位) 数量(低位) 校验码(低位) 校验码(高位) 0x03 0x01 0x00 0x13 0x00 0x1B XX XX :0x03(3号) :0x01(读线圈状态) :线圈状态 :0x0013(索引地址 = 19) : 00001 + 19 = 00020(线圈状态PLC地址范围:00001-09999) :0x1B(1B = 27个,即27bit数据) :00020 - 00046(从00020开始27个线圈) :XXXX
-
从站地址 功能码 字节计数 字节一 字节二 字节三 字节四 校验码(低位) 校验码(高位) 0x03 0x01 0x04 0xCD 0x6B 0xB2 0x05 YY YY 返回从3号从站读取的共4个字节的数据,数据为:0xCD、0x6B、0xB2、0x05(为了举例子暂时编的),校验码为YYYY。
由于读取的是线圈(bit),若读取的个数不为8的倍数,比如这次读27bit,则取整数字节4字节32bit返回,剩余5bit用0补全。
2.6.2 0x03功能码(读保持寄存器)
-
从站地址 功能码 起始地址(高位) 起始地址(低位) 数量(高位) 数量(低位) 校验码(低位) 校验码(高位) 0x03 0x03 0x00 0x06 0x00 0x02 XX XX :0x03(3号) :0x03(读保持寄存器) :保持寄存器 :0x0006(索引地址 = 6) : 40001 + 6 = 40007(保持寄存器PLC地址范围:40001-49999) :0x02(02 = 2个,即2×2byte = 4byte数据)(一个寄存器为2字节) :40007-40008(从40007开始2个寄存器) :XXXX
-
从站地址 功能码 字节计数 字节一(高位) 字节一(低位) 字节二(高位) 字节二(低位) 校验码(低位) 校验码(高位) 0x03 0x03 0x02 0xA1 0x05 0x04 0xCD YY YY 返回从3号从站读取的共2个寄存器的数据,数据为:0xA105(40007上的数据)、0x04CD(40008上的数据)(为了举例子暂时编的),校验码为YYYY。
2.6.3 0x0f功能码(写多个线圈)
-
从站地址 功能码 起始地址(高位) 起始地址(低位) 数量(高位) 数量(低位) 字节数 字节一 字节二 字节三 校验码(低位) 校验码(高位) 0x01 0x0f 0x00 0x13 0x00 0x15 0x03 0x12 0x1A 0x04 XX XX :0x01(1号) :0x0f(写多个线圈) :线圈 :0x0013(索引地址 = 19) : 00001 + 19 = 00020(线圈状态PLC地址范围:00001-09999) :0x15(0x15 = 21bit数据) :21bit + 3bit = 24bit = 3byte(只能 :00020-00040(从00020开始21个线圈) :0x12(0x12 = 18 = 0001 0010) :0x1A(0x1A = 26 = 0001 1010) :0xAC(0x04 = 4 = 0000 0100)(最高三位为补0) :XXXX
若写入的线圈个数不为8的倍数,则高位补0使其字节数为整数。
-
(在原报文基础上除去字节数和具体字节并加上当前校验码)
从站地址 功能码 起始地址(高位) 起始地址(低位) 数量(高位) 数量(低位) 校验码(低位) 校验码(高位) 0x01 0x0f 0x00 0x13 0x00 0x15 YY YY 向1号从站起始地址为00020处写入21个线圈的值成功,校验码为YYYY。
2.6.4 0x10功能码(写多个保持寄存器)
-
从站地址 功能码 起始地址(高位) 起始地址(低位) 数量(高位) 数量(低位) 字节数 字节 校验码(低位) 校验码(高位) 0x01 0x10 0x00 0x53 0x00 0x02 0x04 0x13141A1B XX XX :0x01(1号) :0x10(写多个保持寄存器) :保持寄存器 :0x0053(索引地址 = 83) : 40001 + 83 = 40084(线圈状态PLC地址范围:40001-49999) :0x02(02 = 2个,即2×2byte = 4byte数据)(一个寄存器为2字节) :40084-40085(从40084开始2个保持寄存器) :0x04(4个) :0x13141A1B(40084保持寄存器写入0x1314 = 0001 0011 0001 0100 ,40085保持寄存器写入0x1A1B = 0001 1010 0001 1011) :XXXX
-
(在原报文基础上除去字节数和具体字节并加上当前校验码)
从站地址 功能码 起始地址(高位) 起始地址(低位) 数量(高位) 数量(低位) 校验码(低位) 校验码(高位) 0x01 0x10 0x00 0x53 0x00 0x02 YY YY 向1号从站的40084位置开始写入两个保持寄存器成功,校验码为YYYY。
2.7 三种通信模式
2.7.1 串行传输模式(异步串行传输)
主从协议,位于OSI模型的第二层。由于没有冲突检测,为了防止混乱,只有一个主站,向“从站”发送命令并处理从节点的响应,从站接收主站的命令并做出响应;主站只能启动一个Modbus事务处理,从站没有收到主站的请求时不主动传输数据,也不与其他从站通信。
物理层上,最常用 2线制接口或4线制接口,当需要短距离的点到点通信时,也可以使用串行接口。
串行总线作为客户机,从站作为服务器。在串行链路上,所有设备的传输模式(及串行口参数)必须相同。所有设备必须实现RTU模式,ASCII模式只是一个选项,默认模式必须是RTU模式。
-
-
:8位二进制,每个8位字节含有两个4位十六进制字符
-
- :1个起始位,8个数据位,1个奇偶校验位,1个停止位
- :1个起始位,8个数据位,2个停止位
-
:从左到右:最低有效位(LSB)…最高有效位(MSB)
-
- 默认校验模式必须是偶校验,为了保证和其他产品的兼容性,建议使用无校验。
- 如果使用无校验,那么多附加一个停止位来满足定长11位异步字符。
-
地址 功能码 数据 CRC校验 1byte = 8bit 1byte = 8bit Nbyte = N×8bit 2byte = 16bit
-
从站地址:1字节 = 8位(1byte = 8bit)
功能码:1字节 = 8位(1byte = 8bit)
数据:0-252字节
CRC循环冗余校验:2字节 = 16位(2byte = 16bit)
-
:用时长至少为3.5个字符时间的空闲间隔将报文帧区分开,如果3.5个字符时间未接收到字符,则视为该帧结束。 :用1.5个字符时间判断帧的完整性,如果两个字符之间的空闲间隔大于1.5个字符时间,那么认为报文帧不完整,接收站丢弃这个报文帧。
-
发送方计算CRC的值并附加到帧尾,接收报文的过程中,接收设备重新计算CRC的值,并将计算的结果和接收到的CRC比较;若不相等,则产生了错误。
-
用两个ASCII码字符发送报文中的一个8位字节,当通信链路或者设备不能满足RTU模式的定时管理要求时使用。
- :十六进制,ASCII字符0-9,A-F,报文中每个ASCII字符表示一个十六进制字符
-
- 有校验:1个起始位,7个数据位,1个奇偶校验位,1个停止位
- 无校验:1个起始位,7个数据位,2个停止位
- :从左到右:最低有效位(LSB)…最高有效位(MSB)
-
- 默认校验模式必须是偶校验,为了保证和其他产品的兼容性,建议使用无校验。
- 如果使用无校验,那么多附加一个停止位来满足定长异步字符。
-
起始 地址 功能码 数据 LRC校验 结束 1字符’:'冒号 2字符 2字符 0-2×252字符 2字符 2字符(回车换行CR,LF)
- 一个报文必须以一个冒号(:)字符(十六进制ASCII 3A)作为起始,以回车换行(CRLF)(十六进制ASCII 0D和0A)作为结束。
- 报文中字符间时间间隔不能超过1s,除非配置了更长时间的超时,例如广域网应用可以要求4-5s超时,若超时,则表示已经出现错误。
-
- 校验内容不包括起始符和结束符
- 对报文中除起始符和结束符外的所有连续的8位字节相加,忽略任何进位,然后求其二进制补码得到LRC
- LRC的结果也被编码为2个ASCII码字符。
2.7.2 以太网(MODBUS TCP/IP)
串行链路上一个主站多个从站的模式演变为多个客户机和多个服务器的模式,IANA(Internet Assigned NumbersAuthority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,ModbusTCP/IP服务器端通常该端口作为接收报文的端口, 这是目前在仪表与自动化行业中唯一分配到的端口号。
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。
在TCP/IP上使用一种专用报文头来识别Modbus应用数据单元ADU,即。
- 用MBAP报文头中的取代MODBUS串行链路上通常使用的MODBUS 。这个单元标识符用于设备的通信,这些设备使用单个 IP 地址支持多个独立 MODBUS 终端单元,例如:网桥、路由器和网关。
- 用接收者可以验证完成报文的方式设计所有 MODBUS 请求和响应。对于 MODBUS PDU 有固定长度的功能码来说,仅功能码就足够了。对于在请求或响应中携带一个可变数据的功能码来说,数据域包括字节数。
- 当在 TCP 上携带 MODBUS 时,即使将报文分成多个信息包来传输,办事在 MBAP 报文头上携带,以便接收者能识别报文边界。显式和隐式长度规则的存在以及 的使用(在以太网上)将对请求或响应报文产生极小的未检出干扰。
- :用于事务处理配对。在响应中,MODBUS 服务器复制请求的事务处理标识符。
- :用于系统内的多路复用。通过值 0 识别 MODBUS 协议。
- :长度域是下一个域的字节数,包括单元标识符和数据域。
- :为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串 行链路之间的网关对 MODBUS 或 MODBUS+串行链路从站的通信。MODBUS 客户机在请求中设置 这个域,在响应中服务器必须利用相同的值返回这个域。
协议数据单元前加MBAP报文头,没有了校验码,其他数据格式相同 请求帧格式:
| 事务元处理标识符(高位) | 事务元处理标识符(低位) | 协议标识符(高位) | 协议标识符(低位) | 长度(高位) | 长度(低位) | 单元标识符 | 功能码 | 起始地址(高位) | 起始地址(低位) | 寄存器数量(高位) | 寄存器数量(低位) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x15 | 0x01 | 0x00 | 0x00 | 0x00 | 0x06 | 0xFF | 0x03 | 0x00 | 0x06 | 0x00 | 0x02 |
:
| 事务元处理标识符(高位) | 事务元处理标识符(低位) | 协议标识符(高位) | 协议标识符(低位) | 长度(高位) | 长度(低位) | 单元标识符 | 功能码 | 字节计数 | 字节一(高位) | 字节一(低位) | 字节二(高位) | 字节二(低位) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x15 | 0x01 | 0x00 | 0x00 | 0x00 | 0x06 | 0xFF | 0x03 | 0x02 | 0xA1 | 0x05 | 0x04 | 0xCD |
- MODBUS协议整理——功能码简述
- ModbusTcp和ModbusRtu
- Modbus协议中文版