Modbus协议规范最新修改稿.docx
- 文档编号:23404404
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:170
- 大小:3.41MB
Modbus协议规范最新修改稿.docx
《Modbus协议规范最新修改稿.docx》由会员分享,可在线阅读,更多相关《Modbus协议规范最新修改稿.docx(170页珍藏版)》请在冰豆网上搜索。
Modbus协议规范最新修改稿
前言
-----------串行链路和TCP/IP上的MODBUS标准介绍
该标准包括两个通信规程中使用的MODBUS应用层协议和服务规范:
·串行链路上的MODBUS
MODBUS串行链路取决于TIA/EIA标准:
232-F和485-A。
·TCP/IP上的MODBUS
MODBUSTCP/IP取决于IETF标准:
RFC793和RFC791有关。
串行链路和TCP/IP上的MODBUS是根据相应ISO层模型说明的两个通信规程。
下图强调指出了该标准的主要部分。
绿色方框表示规范。
灰色方框表示已有的国际标准(TIA/EIA和IETF标准)。
MODBUS标准分为三部分。
第一部分(“Modbus协议规范”)描述了MODBUS事物处理。
第二部分(“MODBUS报文传输在TCP/IP上的实现指南”)提供了一个有助于开发者实现TCP/IP上的MODBUS应用层的参考信息。
第三部分(“MODBUS报文传输在串行链路上的实现指南”)提供了一个有助于开发者实现串行链路上的MODBUS应用层的参考信息。
第一部分:
Modbus协议
第一部分:
Modbus协议
1引言
1.1范围
MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
自从1979年出现工业串行链路的事实标准以来,MODBUS使成千上万的自动化设备能够通信。
目前,继续增加对简单而雅观的MODBUS结构支持。
互联网组织能够使TCP/IP栈上的保留系统端口502访问MODBUS。
MODBUS是一个请求/应答协议,并且提供功能码规定的服务。
MODBUS功能码是MODBUS请求/应答PDU的元素。
本文件的作用是描述MODBUS事务处理框架内使用的功能码。
1.2规范性引用文件
1.RFC791,互联网协议,Sep81DARPA
2.MODBUS协议参考指南RevJ,MODICON,1996年6月,doc#PI_MBUS_300
MODBUS是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。
目前,使用下列情况实现MODBUS:
以太网上的TCP/IP。
各种媒体(有线:
EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行传输。
MODBUSPLUS,一种高速令牌传递网络。
图1:
MODBUS通信栈
2缩略语
ADU应用数据单元
HDLC高级数据链路控制
HMI人机界面
IETF因特网工程工作组
I/O输入/输出设备
IP互连网协议
MAC介质访问控制
MBMODBUS协议
MBAPMODBUS协议
PDU协议数据单元
PLC可编程逻辑控制器
TCP传输控制协议
3背景概要
MODBUS协议允许在各种网络体系结构内进行简单通信。
图2:
MODBUS网络体系结构的实例
每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用MODBUS协议来启动远程操作。
在基于串行链路和以太TCP/IP网络的MODBUS上可以进行相同通信。
一些网关允许在几种使用MODBUS协议的总线或网络之间进行通信。
4总体描述
4.1协议描述
MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。
特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。
图3:
通用MODBUS帧
启动MODBUS事务处理的客户机创建MODBUS应用数据单元。
功能码向服务器指示将执行哪种操作。
MODBUS协议建立了客户机启动的请求格式。
用一个字节编码MODBUS数据单元的功能码域。
有效的码字范围是十进制1-255(128-255为异常响应保留)。
当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。
向一些功能码加入子功能码来定义多项操作。
从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。
这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。
在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息。
功能码仅说明操作。
如果在一个正确接收的MODBUSADU中,不出现与请求MODBUS功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。
如果出现与请求MODBUS功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。
例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数据内容。
当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。
对于一个正常响应来说,服务器仅对原始功能码响应。
图4:
MODBUS事务处理(无差错)
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1。
图5MODBUS事务处理(异常响应)
☞注释:
需要管理超时,以便明确地等待可能不会出现的应答。
串行链路上第一个MODBUS执行的长度约束限制了MODBUSPDU大小(最大RS485ADU=256字节)。
因此,对串行链路通信来说,MODBUSPDU=256-服务器地址(1字节)-CRC(2字节)=253字节。
从而:
RS232/RS485ADU=253字节+服务器地址(1byte)+CRC(2字节)=256字节。
TCPMODBUSADU=249字节+MBAP(7字节)=256字节。
MODBUS协议定义了三种PDU。
它们是:
●MODBUS请求PDU,mb_req_pdu
●MODBUS响应PDU,mb_rsp_pdu
●MODBUS异常响应PDU,mb_excep_rsp_pdu
定义mb_req_pdu为:
mb_req_pdu={function_code,request_data},其中
function_code-[1个字节]MODBUS功能码
request_data-[n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。
定义mb_rsp_pdu为:
mb_rsp_pdu={function_code,response_data},其中
function_code-[1个字节]MODBUS功能码
response_data-[n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。
定义mb_excep_rsp_pdu为:
mb_excep_rsp_pdu={function_code,request_data},其中
function_code-[1个字节]MODBUS功能码+0x80
exception_code-[1个字节],在下表中定义了MODBUS异常码。
4.2数据编码
●MODBUS使用一个‘big-Endian’表示地址和数据项。
这意味着当发射多个字节时,首先发送最高有效位。
例如:
寄存器大小值
16–比特0x1234发送的第一字节为0x12然后0x34
☞注释:
更详细的信息参见[1]。
4.3MODBUS数据模型
MODBUS以一系列具有不同特征表格上的数据模型为基础。
四个基本表格为:
基本表格
对象类型
访问类型
内容
离散量输入
单个比特
只读
I/O系统提供这种类型数据
线圈
单个比特
读写
通过应用程序改变这种类型数据
输入寄存器
16-比特字
只读
I/O系统提供这种类型数据
保持寄存器
16-比特字
读写
通过应用程序改变这种类型数据
输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。
如果这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四个表格全部覆盖了另外一个表格。
对于基本表格中任何一项,协议都允许单个地选择65536个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
很显然,必须将通过MODBUS处理的所有数据放置在设备应用存储器中。
但是,存储器的物理地址不应该与数据参考混淆。
要求仅仅是数据参考与物理地址的链接。
MODBUS功能码中使用的MODBUS逻辑参考数字是以0开始的无符号整数索引。
●MODBUS模型实现的实例
下例实例示出了两种在设备中构造数据的方法。
可能有不同的结构,这个文件中没有全部描述出来。
每个设备根据其应用都有它自己的数据结构。
实例1:
有4个独立块的设备
下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、输入量和输出量。
由于不同块中的数据不相关,每个块是相互独立。
按不同MODBUS功能码访问每个块。
图6:
带有独立块的MODBUS数据模型
实例2:
仅有1个块的设备
在这个实例中,设备仅有1个数据块。
通过几个MODBUS功能码可能得到一个相同数据,或者通过16比特访问或1个访问比特。
图7:
仅带有1个块的MODBUS数据模型
4.4MODBUS事务处理的定义
下列状态图描述了在服务器侧MODBUS事务处理的一般处理过程。
图8:
MODBUS事务处理的状态图
一旦服务器处理请求,使用合适的MODBUS服务器事务建立MODBUS响应。
根据处理结果,可以建立两种类型响应:
●一个正MODBUS响应:
●响应功能码=请求功能码
●一个MODBUS异常响应(参见第6.14节):
●用来为客户机提供处理过程中与被发现的差错相关的信息;
●响应功能码=请求功能码+0x80;
●提供一个异常码来指示差错原因。
5功能码分类
有三类MODBUS功能码。
它们是:
公共功能码
●是较好地被定义的功能码,
●保证是唯一的,
●MODBUS组织可改变的,
●公开证明的,
●具有可用的一致性测试,
●MBIETFRFC中证明的,
●包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。
用户定义功能码
●有两个用户定义功能码的定义范围,即65至72和十进制100至110。
●用户没有MODBUS组织的任何批准就可以选择和实现一个功能码
●不能保证被选功能码的使用是唯一的。
●如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。
保留功能码
●一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。
图9:
MODBUS功能码分类
5.1公共功能码定义
功能码
码
子码
(十六进制)
页
数
据
访
问
物理离散量输入
读输入离散量
02
02
11
内部比特
读线圈
01
01
10
比特访问
或
写单个线圈
05
05
16
物理线圈
写多个线圈
15
0F
37
输入存储器
读输入寄存器
04
04
14
读多个寄存器
03
03
13
16比特访问
内部存储器
写单个寄存器
06
06
17
或
写多个寄存器
16
10
39
物理输出存储器
读/写多个寄存器
23
17
47
屏蔽写寄存器
22
16
46
文件记录访问
读文件记录
20
6
14
42
写文件记录
21
6
15
44
封装接口
读设备识别码
43
14
2B
6功能码描述
6.101(0x01)读线圈
在一个远程设备中,使用该功能码读取线圈的1至2000连续状态。
请求PDU详细说明了起始地址,即指定的第一个线圈地址和线圈编号。
从零开始寻址线圈。
因此寻址线圈1-16为0-15。
根据数据域的每个比特将响应报文中的线圈分成为一个线圈。
指示状态为1=ON和0=OFF。
第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。
其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。
如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。
字节数量域说明了数据的完整字节数。
请求PDU
功能码
1个字节
0x01
起始地址
2个字节
0x0000至0xFFFF
线圈数量
2个字节
1至2000(0x7D0)
响应PDU
功能码
1个字节
0x01
字节数
1个字节
N*
线圈状态
N个字节
n=N或N+1
*N=输出数量/8,如果余数不等于0,那么N=N+1
错误
功能码
1个字节
功能码+0x80
异常码
1个字节
01或02或03或04
这是一个请求读离散量输出20-38的实例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能
起始地址Hi
起始地址Lo
输出数量Hi
输出数量Lo
01
功能
字节数
输出状态27-20
输出状态35-28
输出状态38-36
01
00
03
13
CD
00
6B
13
05
将输出27-20的状态表示为十六进制字节值CD,或二进制11001101。
输出27是这个字节的MSB,输出20是LSB。
通常,将一个字节内的比特表示为MSB位于左侧,LSB位于右侧。
第一字节的输出从左至右为27至20。
下一个字节的输出从左到右为35至28。
当串行发射比特时,从LSB向MSB传输:
20...27、28...35等等。
在最后的数据字节中,将输出状态38-36表示为十六进制字节值05,或二进制00000101。
输出38是左侧第六个比特位置,输出36是这个字节的LSB。
用零填充五个剩余高位比特。
注:
用零填充五个剩余比特(一直到高位端)。
图10:
读取线圈状态图
6.202(0x02)读离散量输入
在一个远程设备中,使用该功能码读取离散量输入的1至2000连续状态。
请求PDU详细说明了起始地址,即指定的第一个输入地址和输入编号。
从零开始寻址输入。
因此寻址输入1-16为0-15。
根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。
指示状态为1=ON和0=OFF。
第一个数据字节的LSB(最低有效位)包括在询问中寻址的输入。
其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。
如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。
字节数量域说明了数据的完整字节数。
请求PDU
功能码
1个字节
0x02
起始地址
2个字节
0x0000至0xFFFF
输入数量
2个字节
1至2000(0x7D0)
响应PDU
功能码
1个字节
0x82
字节数
1个字节
N*
输入状态
N*×1个字节
*N=输出数量/8,如果余数不等于0,那么N=N+1
错误
差错码
1字节
0x82
异常码
1字节
01或02或03或04
这是一个请求读取离散量输入197-218的实例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能
起始地址Hi
起始地址Lo
输出数量Hi
输出数量Lo
02
功能
字节数
输入状态204-197
输入状态212-205
输入状态218-213
02
00
03
C4
AC
00
DB
16
35
将离散量输入状态204-197表示为十六进制字节值AC,或二进制10101100。
输入204是这个字节的MSB,输入197是这个字节的LSB。
将离散量输入状态218-213表示为十六进制字节值35,或二进制00110101。
输入218位于左侧第3比特,输入213是LSB。
注:
用零填充2个剩余比特(一直到高位端)。
图11:
读离散量输入的状态图
6.303(0x03)读保持寄存器
在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。
请求PDU说明了起始寄存器地址和寄存器数量。
从零开始寻址寄存器。
因此,寻址寄存器1-16为0-15。
将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。
对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。
请求
功能码
1个字节
0x03
起始地址
2个字节
0x0000至0xFFFF
寄存器数量
2个字节
1至125(0x7D)
响应
功能码
1个字节
0x03
字节数
1个字节
2×N*
寄存器值
N*×2个字节
*N=寄存器的数量
错误
差错码
1个字节
0x83
异常码
1个字节
01或02或03或04
这是一个请求读寄存器108-110的实例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能
高起始地址
低起始地址
高寄存器编号
低寄存器编号
03
功能
字节数
寄存器值Hi(108)
寄存器值Lo(108)
寄存器值Hi(109)
寄存器值Lo(109)
寄存器值Hi(110)
寄存器值Lo(110)
03
00
06
6B
02
00
2B
03
00
00
00
64
将寄存器108的内容表示为两个十六进制字节值022B,或十进制555。
将寄存器109-110的内容分别表示为十六进制0000和0064,或十进制0和100。
图12:
读保持寄存器的状态图
6.404(0x04)读输入寄存器
在一个远程设备中,使用该功能码读取1至大约125的连续输入寄存器。
请求PDU说明了起始地址和寄存器数量。
从零开始寻址寄存器。
因此,寻址输入寄存器1-16为0-15。
将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。
对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。
请求
功能码
1个字节
0x04
起始地址
2个字节
0x0000至0xFFFF
输入寄存器数量
2个字节
0x0001至0x007D
响应
功能码
1个字节
0x04
字节数
1个字节
2×N*
输入寄存器
N*×2个字节
*N=输入寄存器的数量
错误
差错码
1个字节
0x84
异常码
1个字节
01或02或03或04
这是一个请求读输入寄存器9的实例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能
起始地址Hi
起始地址Lo
输入寄存器数量Hi
输入寄存器数量Lo
04
功能
字节数
输入寄存器9Hi
输入寄存器9Lo
04
00
02
08
00
00
0A
01
将输入寄存器9的内容表示为两个十六进制字节值000A,或十进制10。
图13:
读输入寄存器的状态图
6.505(0x05)写单个线圈
在一个远程设备上,使用该功能码写单个输出为ON或OFF。
请求数据域中的常量说明请求的ON/OFF状态。
十六进制值FF00请求输出为ON。
十六进制值0000请求输出为OFF。
其它所有值均是非法的,并且对输出不起作用。
请求PDU说明了强制的线圈地址。
从零开始寻址线圈。
因此,寻址线圈1为0。
线圈值域的常量说明请求的ON/OFF状态。
十六进制值0XFF00请求线圈为ON。
十六进制值0X0000请求线圈为OFF。
其它所有值均为非法的,并且对线圈不起作用。
正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。
请求
功能码
1个字节
0x05
输出地址
2个字节
0x0000至0xFFFF
输出值
2个字节
0x0000至0x00
响应
功能码
1个字节
0x05
输出地址
2个字节
0x0000至0xFFFF
输出值
2个字节
0x0000至0xFF00
错误
差错码
1个字节
0x85
异常码
1个字节
01或02或03或04
这是一个请求写线圈173为ON的实例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能
输出地址Hi
输出地址Lo
输出值Hi
输出值Lo
05
功能
输出地址Hi
输出地址Lo
输出值Hi
输出值Lo
05
00
00
AC
AC
FF
FF
00
00
图14:
写单个输出状态图
6.606(0x06)写单个寄存器
在一个远程设备中,使用该功能码写单个保持寄存器。
请求PDU说明了被写入寄存器的地址。
从零开始寻址寄存器。
因此,寻址寄存器1为0。
正常响应是请求的应答,在写入寄存器内容之后返回这个正常响应。
请求
功能码
1个字节
0x06
寄存器地址
2个字节
0x0000至0xFFFF
寄存器值
2个字节
0x0000至0xFFFF
响应
功能码
1个字节
0x06
寄存器地址
2个字节
0x0000至0xFFFF
寄存器值
2个字节
0x0000至0xFFFF
错误
差错码
1个字节
0x86
异常码
1个字节
01或02或03或04
这是一个请求将十六进制0003写入寄存器2的实例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能
寄存器地址Hi
寄存器地址Lo
寄存器值Hi
寄存器值Lo
06
功能
输出地址Hi
输出地址Lo
输出值Hi
输出值Lo
06
00
00
01
01
00
00
03
03
图15:
写单个寄存器状态图
6.715(0x0F)写多个线圈
在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为ON或OFF。
请求PDU说明了强制的线圈参考。
从零开始寻址线圈。
因此,寻址线圈1为0。
请求数据域的内容说明了被请求的ON/OFF状态。
域比特位置中的逻辑“1”请求相应输出为ON。
域比特位置中的逻辑“0”请求相应输出为OFF。
正常响应返回功能码、起始地址和强制的线圈数量。
请求PDU
功能码
1个字节
0x0F
起始地址
2个字节
0x0000至0xFFFF
输出数量
2个字节
0x0001至0x07B0
字节数
1个字节
N*
输出值
N*×1个字节
*N=输出数量/8,如果余数不等于0,那么N=N+1
响应PDU
功能码
1个字节
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Modbus 协议 规范 最新 修改稿