Modbus学习文档
0. 前言
最近学习Modbus,本人0基础,学习之前都不知道Modbus是什么,以前从未接触过这个协议;看资料看了4天,CSDN上的博文总是不尽人意、缺枝短叶,看完仍是一头雾水;后来结合着Modbus中文协议,终于算是有了比较透彻的理解。在此细心的整理了两天的学习笔记,给出了一个比较完整的学习流程和知识记录。
1. 基本宏观概念(大方面,是什么,干啥用的)
目录:
-
1.1通信模式分类
- 并行通信
- 串行通信
- 1.2单播模式与广播模式
- 1.3Modbus基本概念
- 1.4应用场景
1.1 通信模式分类
并行通信(数据各位同时传送)
一般快速设备之间采用并行通信,譬如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。并行通讯,有多少位数据就必须有多少根数据线,如下图是11 位数据就有11 根数据线。
- 优点:传输速度快
- 缺点:占用引脚资源多
串行通信(数据一位一位顺序依次传送)
串行通信最少可以只需一根通信线,只发或只收。因而大大节省了系统资源,降低了系统成本。由于只用一根数据线,所以是以降低传送速度来换取资源的,它常用在传送距离远,速度要求不高的场合。
-
优点:通信线路简单,占用引脚资源少,成本低
-
缺点:传输速度慢
-
异步串行通信(最常采用的通信方式)
具有固定的通信格式,数据以相同的帧格式传送,每一帧由起始位、数据位、奇偶校验位和停止位组成。
起始位:通信线路上没有数据传输的时候处于高电平(逻辑“1“)状态,当发送设备发送一个字符数据时,先发送一个低电平(逻辑“0“)信号,告诉接收端”开始发送数据了“,这个低电平就是一个起始位,接收端收到这个信息就准备接收信息。
数据位:可以是5 位、6 位、7 位、或8 位。数据传送时,低位在前。
奇偶校验位:用于数据传输过程的检错
- 奇校验:保证数据位和校验位“1”的个数为奇数
- 偶校验:保证数据位和校验位“1”的个数为偶数
- 无校验:没有校验位,此时校验位用一个停止位补充,即有两个停止位
停止位:停止位可以是1位、也可以是1.5 位或2 位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一字符作好准备。若停止位后不是紧接着传送下一个字符,则让线路保持为“1”。“1”表示通信线路处于空闲等待状态。存在空闲位是异步通信的特性之一。
-
同步串行通信
通信双方共用一个时钟,这是同步通信区分于异步通信的最显著的特点,为了保证接收正确无误,发送方除了传送数据外,还要传送同步时钟。
同步传输是以数据块为传输单位,在数据块传送时,为提高通信速度,去掉了起始位和停止位。数据开始传送前用同步字符来指示(常约定1~2 个),并由时钟来实现发送端和接收端的同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到一块数据传送完毕。
数据块与数据块之间的时间间隔是固定的,且不允许有空位,当线路空闲或不发信息时,发送同步字符。
同步传输中,发送方发出数据后等接收方发回响应以后才发下一个数据包。
参考文章
1.2 Modbus基本概念
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式,是工业自动化领域里使用最普遍的协议。随着电子技术计算机和通信技术的不断发展, Modbus也从最古老的RS232/Rs485串行总线发展到了 ModbusTCP和透明就绪工业以太网。
Modbus是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
从1979年开始,Modbus作为工业串行链路的事实标准,Modbus使成千上万的自动化设备能够通信。目前,对简单而精致的 Modbus结构的支持仍在增长。互联网用户能够使用TCP/P栈上的保留系统端口502访问。
ModbusModbus是一个请求/应答协议,并且提供功能码规定的服务。 Modbus功能码是 Modbus请求/应答PDU的元素。
Modbus是一种应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。
参考:
1.3 应用场景
工业、建筑、基础设施
每种设备(PC、HMI、控制面板、驱动器、运动控制、I/O设备……)都能使用Modbus协议来启动远程操作。同样的通信能够在基于串行链路和以太网TCP/IP网络上进行。网关能够实现在各种使用 Modbus协议的总线或网络之间的通信。
2. 分解模块概念(细节步骤,包括什么东西,怎么定义和运作的)
通信就是交流,协议就是交流的规范或者语言。Modbus简单来说就是主机和远程设备的交流语言。工业上,比如我想获得工厂温度、湿度信息,那我先通过传感器获得温度湿度数据,保存到记录里,我在办公室想知道这个信息,那么我只要保证三点:和工厂的控制设备连接、发送命令,控制设备返回响应,这三项满足,就能远程获取信息或者控制控制器了。
那么这里面包括了几点:数据的存储和读取(线圈和寄存器)、命令的种类(功能码)、数据的传输(通信模式、数据帧格式)、数据正确与否的检验(校验)、反馈或响应(异常码)等模块。
目录:
- 2.1 单播模式与广播模式
- 2.2 Modbus地址规则
- 2.3 Modbus帧格式
-
2.4 寄存器
- 寄存器种类
- 寄存器地址分配
-
2.5 功能码
- 功能码分类
- 部分功能码举例
-
2.6 异常码
- 通信状况
- 响应类型
- 异常码表
- 事务处理流程
-
2.7 数据帧格式
- 0x01功能码
- 0x03功能码
- 0x0f功能码
- 0x10功能码
-
2.8 三种通信模式
- 串行传输模式:RTU、ASCII
- 以太网(TCP/IP)
2.1 单播模式与广播模式
单播模式:“一对一”通讯。主站只寻找某一确定的从站,从站接收到命令后处理,并返回一个应答报文。主站需要发出一个命令报名并处理从站返回的报文,从站需要接收主站的命令报文并发出一个应答报文。每个子节点必须有唯一的地址(1-247)。
广播模式:“一对所有”。主站向所有从站发送请求,对于主站发送的广播请求没有应答返回,广播请求必须是写命令。所有从站必须接收写功能的广播。地址0用来广播通信。
2.2 Modbus帧格式
Modbus应用协议定义了一个独立于通信层的协议数据单元PDU(Protocol Data Unit),在不同的总线或者网络的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 通信状况
当主机向设备发送命令后,可能会出现以4下种情况:
- 请求正确的到达服务器,并且请求的内容服务器可以处理,那么服务器返回一个正常响应
- 请求正确的到达服务器,但是请求服务器无法处理(例如请求读一个不存在的寄存器),此时服务器将返回一个异常响应,通知主机错误和错误的类型。
- 请求到达服务器,但是不正确,检测到了通信错误(奇偶校验、LRC、CRC等等),那么不返回响应,主机将最终成为超时状态
- 请求就没到达服务器,服务器没收到也就更不会响应,主机也会成为超时状态
2.5.2 响应类型
综上,根据服务器处理结果,可以建立两种类型的响应:
-
一个正常MODBUS应答帧:
-
功能码域:响应功能码 = 请求功能码
-
数据域:请求中要求的任何数据
-
校验码:响应帧自身计算
从站地址 功能码 数据 校验码(低位) 校验码(高位) 从站自身地址 与请求功能码保持一致(范围:0x00-0x7f) 请求中要求的任何数据 XX XX
-
-
一个异常MODBUS应答帧:
-
用来为客户机提供处理过程中与被发现的差错相关的信息
-
功能码域:响应功能码 = 请求功能码 + 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)
目标起始PLC地址: 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)
目标起始PLC地址: 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)
目标起始PLC地址: 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)
目标起始PLC地址: 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事务处理,从站没有收到主站的请求时不主动传输数据,也不与其他从站通信。
物理层上,最常用RS-485 2线制接口或4线制接口,当需要短距离的点到点通信时,也可以使用RS-232串行接口。
串行总线作为客户机,从站作为服务器。在串行链路上,所有设备的传输模式(及串行口参数)必须相同。所有设备必须实现RTU模式,ASCII模式只是一个选项,默认模式必须是RTU模式。
-
RTU(远程终端单元)(采用8bit异步串行通信方式)(使用CRC循环冗余校验)
-
编码系统:8位二进制,每个8位字节含有两个4位十六进制字符
-
字节格式(11位)
有校验:1个起始位,8个数据位,1个奇偶校验位,1个停止位
无校验:1个起始位,8个数据位,2个停止位
-
串行发送字符:从左到右:最低有效位(LSB)…最高有效位(MSB)
-
校验(奇校验ODD、偶校验EVEN和无校验NONE)
默认校验模式必须是偶校验,为了保证和其他产品的兼容性,建议使用无校验。
如果使用无校验,那么多附加一个停止位来满足定长11位异步字符。
-
帧格式(最大256字节)
地址 功能码 数据 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循环冗余校验,2字节,检验整个报文内容)
发送方计算CRC的值并附加到帧尾,接收报文的过程中,接收设备重新计算CRC的值,并将计算的结果和接收到的CRC比较;若不相等,则产生了错误。
-
ASCII(使用LRC纵向冗余校验)
用两个ASCII码字符发送报文中的一个8位字节,当通信链路或者设备不能满足RTU模式的定时管理要求时使用。
-
编码系统:十六进制,ASCII字符0-9,A-F,报文中每个ASCII字符表示一个十六进制字符
-
字节格式(10位)
有校验:1个起始位,7个数据位,1个奇偶校验位,1个停止位
无校验:1个起始位,7个数据位,2个停止位
-
串行发送字符:从左到右:最低有效位(LSB)…最高有效位(MSB)
-
校验(奇校验ODD、偶校验EVEN和无校验NONE)
默认校验模式必须是偶校验,为了保证和其他产品的兼容性,建议使用无校验。
如果使用无校验,那么多附加一个停止位来满足定长10位异步字符。
-
帧格式(最大513字节)
起始 地址 功能码 数据 LRC校验 结束 1字符’:'冒号 2字符 2字符 0-2×252字符 2字符 2字符(回车换行CR,LF) 一个报文必须以一个冒号(:)字符(十六进制ASCII 3A)作为起始,以回车换行(CRLF)(十六进制ASCII 0D和0A)作为结束。
报文中字符间时间间隔不能超过1s,除非配置了更长时间的超时,例如广域网应用可以要求4-5s超时,若超时,则表示已经出现错误。
-
帧校验(LRC纵向冗余校验)
校验内容不包括起始符和结束符
对报文中除起始符和结束符外的所有连续的8位字节相加,忽略任何进位,然后求其二进制补码得到LRC
LRC的结果也被编码为2个ASCII码字符。
-
2.7.2 以太网(MODBUS TCP/IP)
MODBUS TCP/IP通信结构:
串行链路上一个主站多个从站的模式演变为多个客户机和多个服务器的模式,IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,Modbus TCP/IP服务器端通常该端口作为接收报文的端口, 这是目前在仪表与自动化行业中唯一分配到的端口号。
MODBUS TCP/IP帧:
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。
在TCP/IP上使用一种专用报文头来识别Modbus应用数据单元ADU,即MBAP报文头。
- 用MBAP报文头中的单个字节单元标识符取代MODBUS串行链路上通常使用的MODBUS
从站地址域。这个单元标识符用于设备的通信,这些设备使用单个 IP 地址支持多个独立
MODBUS 终端单元,例如:网桥、路由器和网关。 - 用接收者可以验证完成报文的方式设计所有 MODBUS 请求和响应。对于 MODBUS PDU
有固定长度的功能码来说,仅功能码就足够了。对于在请求或响应中携带一个可变数据的功能码来说,数据域包括字节数。 - 当在 TCP 上携带 MODBUS 时,即使将报文分成多个信息包来传输,办事在 MBAP 报文头上携带附加长度信息,以便接收者能识别报文边界。显式和隐式长度规则的存在以及
CRC-32 差错校验码的使用(在以太网上)将对请求或响应报文产生极小的未检出干扰。
MBAP报文头格式(长7字节):
- 事务元处理标识符:用于事务处理配对。在响应中,MODBUS 服务器复制请求的事务处理标识符。
- 协议标识符:用于系统内的多路复用。通过值 0 识别 MODBUS 协议。
- 长度:长度域是下一个域的字节数,包括单元标识符和数据域。
- 单元标识符:为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串 行链路之间的网关对 MODBUS 或 MODBUS+串行链路从站的通信。MODBUS 客户机在请求中设置 这个域,在响应中服务器必须利用相同的值返回这个域。
MODBUS TCP/IP帧格式:
协议数据单元前加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协议中文版