您的当前位置:首页正文

ModbusRTU通讯协议整理版

2021-09-23 来源:易榕旅网
 ModbusRTU通讯协议整理版

Modbus

通讯协议

(RTU传输模式)

1 / 18

ModbusRTU通讯协议整理版

目 录

1.

Modbus协议简介 ............................................................................................................................................................. 3 1.1. 传输方式 ............................................................................................................................................................... 3 1.2. 协议 ....................................................................................................................................................................... 3

1.2.1. 信息帧 ....................................................................................................................................................... 4 1.2.2. 地址(Address)域 .................................................................................................................................. 4 1.2.3. 功能(Function)域 ................................................................................................................................. 4 1.2.4. 数据域 ....................................................................................................................................................... 5 1.2.5. 错误校验域 ............................................................................................................................................... 5 1.2.6. 字符的连续传输 ....................................................................................................................................... 5 1.3. 错误检测 ............................................................................................................................................................... 5

1.3.1. 奇偶校验 ................................................................................................................................................... 5 1.3.2. CRC检测 .................................................................................................................................................. 6 Modbus数据和控制功能详解 ......................................................................................................................................... 7 2.1. 读取线圈状态(功能码01) .............................................................................................................................. 7 2.2. 读取输入状态(功能码02) .............................................................................................................................. 8 2.3. 读取保持寄存器(功能码03) .......................................................................................................................... 8 2.4. 读取输入寄存器(功能码04) .......................................................................................................................... 9 2.5. 强置单线圈(功能码05) .................................................................................................................................. 9 2.6. 预置单寄存器(功能码06) ............................................................................................................................ 10 2.7. 读取异常状态(功能码7) .............................................................................................................................. 10 2.8. 强置多线圈(功能码15) ................................................................................................................................ 11 2.9. 预置多寄存器(功能码16) ............................................................................................................................ 12 2.10. 报告从机标识(功能码17) ........................................................................................................................ 12 附录 ................................................................................................................................................................................. 13 3.1. 附录A:MODBUS全部功能码 ....................................................................................................................... 13 3.2. 附录B:不正常响应.......................................................................................................................................... 14 3.3. 附录C:CRC校验生成程序 ............................................................................................................................. 15

2.

3.

2 / 18

ModbusRTU通讯协议整理版

1. Modbus协议简介

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

协议在一根通讯线上使用应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,在相反的方向上终端设备发出的应答信号传输给主机。 协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换,这就不会在使它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。

1.1. 传输方式

传输方式是一个信息帧内一系列独立的数据结构以及用于传输数据的有限规则,以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,每个信息必须连续传输下面定义了与Modebus 协议– RTU方式相兼容的传输方式。 代码系统

8位二进制,十六进制数0...9,A...F

消息中的每个8位域都是一个两个十六进制字符组成 每个字节的位 1个起始位

8个数据位,最小的有效位先发送 1个奇偶校验位,无校验则无 1个停止位(有校验时),2个Bit(无校验时) 错误检测域

CRC(循环冗长检测)

1.2. 协议

当信息帧到达终端设备时,它通过一个简单的“口”进入寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的“信封”中,把数据帧返回给发送者。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功的响应。

3 / 18

ModbusRTU通讯协议整理版

1.2.1. 信息帧

Address 8-Bits

Function 8-Bits

Data N x 8-Bits

Check 16-Bits

图 1 – 1 . 信息帧格式

特注:Modbus信息帧所允许的最大长度为256个字节,即N的范围是大于等于零且小于等于252(N{0,252})。 即,所有的数据一共256个,数据剩下253个。

1.2.2. 地址(Address)域

信息帧地址域(信息地址)在帧的开始部分,由8位组成,有效的从机设备地址范围0-247(十进制),各从机设备的寻址范围为1-247。主机把从机地址放入信息帧的地址区,并向从机寻址。从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址。

地址0为广播地址,所有从机均能识别。当Modbus协议用于高级网络时,则不允许广播或其它方式替代。

1.2.3. 功能(Function)域

信息帧功能域代码告诉了被寻址到的终端执行何种功能。有效码范围1-225(十进制) ,有些代码是适用于所有控制器,有些适应于某种控制器,还有些保留以备后用。有关功能代替码的全部内容见附录A。

当主机向从句发送信息时,功能代码向从机说明应执行的动作。如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等。当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,从句简单返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1”。

如,主机要求从机读一组保持寄存器时,则发送信息的功能码为:

0000 0011 (十六进制03)

若从机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。发现错时,则返回一个不正常响信息: 1000 0011(十六进制83)

从机对功能代码作为了修改,此外,还把一个特殊码放入响应信息的数据区中,告诉主机出现的错误类型和不正常响应的原因,不正常响应见附录B。主机设备的应用程序负责处理不正常响应,典型处理过程是主机把对信息的测试和诊断送给从机,并通知操作者。表 1 – 1列出了所有设备常用的功能码、它们的意义及它们的初始功能。

表 1 – 1 常用功能码

代码 01 02 03 04 05 06 07 15 16 17

名称 读取线圈状态 读取输入状态 读取保持寄存器 读取输入寄存器 强置单线圈 预置单寄存器 读取异常状态 强置多线圈 预置多寄存器 报告从机标识

作用

取得一组逻辑线圈的当前状态(ON/OFF) 取得一组开关输入的当前状态(ON/OFF) 在一个或多个保持寄存器中取得当前的二进制值 在一个或多个输入寄存器中取得当前的二进制值 强置一个逻辑线圈的通断状态

放置一个特定的二进制值到一个单寄存器中 取得8个内部线圈的通断状态 强置一串连续逻辑线圈的通断

放置一系列特定的二进制值到一系列多寄存器中 可使主机判断编址从机的类型及该从机运行指示灯的状态

4 / 18

ModbusRTU通讯协议整理版

1.2.4. 数据域

数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者极限值。他由数据区有2个16进制的数据位(2的8次方256),数据范围为00-FF(16进制)。例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有一个不正常代码,使主机能判断并作出下一步的动作。数据区的长度可为“零”以表示某类信息。

1.2.5. 错误校验域

该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,出错校验使用了16位循环冗余的方法,即CRC校验。

错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。

1.2.6. 字符的连续传输

当消息在标准的Modbus系列网络传输时,每个字符或字节按由左到右的次序方式发送:

最低有效位(LSB)...最高有效位(MSB)。 位的序列是:

有奇偶校验

启始位

无奇偶校验

启始位

1

2

3

4

5

6

7

8

停止位

停止位

1

2

3

4

5

6

7

8

奇偶位

停止位

图 1 –2 . 位顺序(RTU)

1.3. 错误检测

1.3.1. 奇偶校验

用户可以配置控制器是奇或偶校验,或无校验。这将决定了每个字符中的奇偶校验位是如何设置的。 如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:1 1 0 0 0 1 0 1

整个“1”的数目是4个。如果便用了偶校验,帧的奇偶校验位将是0,便得整个“1”的个数仍是4个。如果便用了奇校验,帧的奇偶校验位将是1,便得整个“1”的个数是5个。

如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字

5 / 18

ModbusRTU通讯协议整理版

符帧中。

1.3.2. CRC检测

RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。它忽略信息中单个字符数据的奇偶校验方法。

循环冗余校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。 在生成CRC时,每个8位字节与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值进行一次异或运算,如果最低位为0,不作任何处理。 上述处理重复进行,知道执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器材的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。

生成一个CRC的流程为:

1、 预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2、 把数据帧中的第一个8位字节与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。 3、 将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。 4、 如果最低位为0:重复第3步(下一次移位)。

如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。 5、 重复第3步和第4步直到8次移位。这样处理完了一个完整的八位。 6、 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。 7、 最终CRC寄存器得值就是CRC的值。

CRC值附加到信息时,低位在先,高位在后。查阅附录C中的一个实例,它详细说明了CRC的校验。

6 / 18

ModbusRTU通讯协议整理版

2. Modbus数据和控制功能详解

Modbus 信息中的所有数据地址以零作为基准,各项数据的第一个数据地址的编号为0。若无特殊说明在此节文中用+进制值表示,图中的数据区则用十六进制表示。

图2--1为一个例子,说明了Modbus的查询信息,图2--2为正常响应的例子,这两例子中的数据均是16进制的,也表示了以RTU方式构成数据帧的方法。

主机查询是读保持寄存器,被请求的从机地址是06,读取的数据来自地址40108保持寄有器。注意,该信息规定了寄存器的起始地址为0107 (006BH)。

从机响应返回该功能代码,说明是正常响应,字节数“Byle count”中说明有多少个8位字节被返回。它表明了附在数据区中8位字节的数量,当在缓冲区组织响应信息时,“字节数”区域中的值应与该信息中数据区的字节数相等。如RTU方式时,63H 用一个字节(01100011)发送。8个位为一个单位计算“字节数”,它忽略了信息帧用组成的方法。

Addr 06H

Addr 06H

Fun 03H

Fun 03H

Data start Data start reg hi reg lo 00H

Byte count 06H

Data1 hi 02H

Data #of

regs hi 00H

Data #of regs lo 01H

Data3 hi 00H

CRC16 hi XXH

CRC16 lo XXH

6BH

Data1 Lo 2BH

图 2 – 1 Modbus的查询信息

Data 2 hi 00H

Data2 lo 00H

Data3 CRC16CRC16lo 63H

hi XXH

lo XXH

图 2 – 2 Modbus的响应信息

2.1. 读取线圈状态(功能码01)

读取从机离散量输出口(DO,0X类型)的 ON/OFF 状态,不支持广播。

查询

查询信息规定了要读的起始线圈和线圈量,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H –0015H(DO1=0000H,DO2=0001H,依此类推)。 图 2 – 3 的例子是从地址为17的从机读取DO1至DO6的状态。 Addr 11H 响应

Fun 01H

DO start

reg hi 00H

DO start reg lo 00H

DO #of regs hi 00H

DO #of regs lo 06H

CRC16 hi XXH

CRC16 lo XXH

图 2 – 3 读取线圈状态----查询

响应信息中的各线圈的状态与数据区的每一位的值相对应,即每个DO占用一位(1 = ON, 0 = OFF),第一个数据字节的LSB为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排列,直至8个为止,下一个字节也是从低位向高位排例。若返回的线圈数不是8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填0,字节数区说明全部数据的字节数。

图2 – 4所示为线圈的输出状态响应的实例。

Addr 11H

Fun 01H

Byte count 01H

Data 2AH

CRC16 hi XXH

7 / 18

CRC16 lo XXH

ModbusRTU通讯协议整理版

数据

0 MSB

0 7

0 6

0 5

0 4

0 3

DO2 2

DO1 LSB

图 2 – 4读取线圈状态----响应

2.2. 读取输入状态(功能码02)

读取从机离散量输入信号(DI,0X类型)的ON/OFF状态,不支持广播。

查询

查询信息规定了要读的输入起始地址,以及输入信号的数量。输入的起始地址为0000H,1-16个输入口的地址分别为0-15(DO1=0000H,DO2=0001H,依此类推)。

图 2 – 5 的例子是从地址为17的从机读取DI1到DI16的状态。

Addr 11H

Fun 02H

DI start addr hi 00H

DI start addr lo 00H

DI num hi 00H

DI num CRC16 CRC16 lo hi lo 10H

XXH

XXH

图 2 – 5读取输入状态----查询

响应

响应信息中的各输入口的状态,分别对应于数据区中的每一位值,1 = ON; 0 = OFF,第一个数据字节的LSB为

查询中的寻址地址,其他输入口按顺序在该字节中由低位向高位排列,直至8个位为止。下一个字节中的8个输入位也是从低位到高位排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位直至字节的最高位全部填零。字节数区说明了全部数据的字节数。

图2 – 6 所示为读数字输出状态响应的实例。

Addr 11H

Fun 02H

Byte count02H DI5

Data1 33H

Data2 CCH

CRC16 hi XXH DI1

CRC16 lo XXH

数据 1

DI8 DI7 DI6

DI4 DI3 DI2

MSB LSB

数据 2

DI16 DI15 DI14 DI13 DI12 DI11 DI10 DI9 MSB LSB

图 2 – 6读取输入状态----响应

2.3. 读取保持寄存器(功能码03)

读取从机保持寄存器(4X类型)的二进制数据,不支持广播。

查询

查询信息规定了要读的保持寄存器起始地址及保持寄存器的数量,保持寄存器寻址起始地址为0000H,寄存器1-16所对应的地址分别为0000H –0015H。

图2 – 7 的例子是从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H, U2的地址为0001H,U3的地址为0002H。

Addr11H

Fun 03H

Data start Data startaddr hi 00H

addr lo 00H

Data #of Data #of CRC16CRC16regs hi 00H

regs lo 03H

8 / 18

hi XXH

lo XXH

ModbusRTU通讯协议整理版

图 2 – 7读取保持寄存器----查询

响应

响应信息中的寄存器数据为二进制数据,每个寄存器分别对应2个字节,第一个字节为高位值数据,第二个字节为低位数据。

图 2 – 8的例子是读取U1,U2,U3(U1=03E8H,U2=03E7H,U3=03E9H)的响应。

Addr 11H

Fun 03H

Byte count 06H

Data1 hi 03H

Data1 Lo E8H

Data 2 hi 03H

Data2 lo E7H

Data3 hi 03H

Data3 CRC16CRC16lo E9H

hi XXH

lo XXH

图 2 – 8读取保持寄存器----响应

2.4. 读取输入寄存器(功能码04)

读取从机输入寄存器(3X类型)中的二进制数据,不支持广播。

查询

查询信息规定了要读的寄存器的起始地址及寄存器的数量,寻止起始地址为0,寄存器1-16所对应的地址分别为0000H –0015H。

图 2 – 9的例子是请求17号从机的0009寄存器。 Addr 11H

Fun 04H

DO addr DO addr Data #of Data #of CRC16

regs hi regs lo hi lo hi 00H

08H

00H

01H

XXH

CRC16

lo XXH

图 2 – 9读取输入寄存器----查询

响应

响应信息中的寄存器数据为每个寄存器分别对应2个字节,第一个字节为高位数据,第二个字节为低位数据。 图 2 – 10的例子寄存器30009中的数据用000AH 2个字节表示。

Addr 11H

Fun 04H

Byte count

Data hi

Data Lo

CRC16 hi XXH

CRC16 lo XXH

02H 00H 0AH

图 2 – 10读取输入寄存器----响应

2.5. 强置单线圈(功能码05)

强制单个线圈(DO,0X类型)为ON或OFF状态,广播时,该功能可强制所有从机中同一类型的线圈均为ON或OFF状态。

该功能可越过控制器内存的保护状态和线圈的禁止状态。线圈强制状态一直保持有效直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时,则线圈处于强制状态。

查询

查询信息规定了需要强制一个单独线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H –0015H(DO1=0000H,DO2=0001H,依此类推)。

由查询数据区中的一个常量,规定被请求线圈的ON/OFF状态, FF00H值请求线圈处于ON状态,0000H值请求线圈处于OFF状态,其它值对线圈无效,不起作用。

图示 2-11的例子是请求17号从机开DO1的On状态。

Addr

Fun DO addr DO addr Value Value

9 / 18

CRC16 CRC16

ModbusRTU通讯协议整理版

hi

11H

05H

00H

lo 00H

hi FFH

lo 00H

hi XXH

lo XXH

图示 2-11强制单线圈----查询

响应

图2 – 12所示为对这个命令请求的正常响应是在DO状态改变以后传送接收到的数据。 Addr 11H

Fun 05H

DO addr DO addr hi lo 00H

00H

Value

hi FFH

Value lo 00H

CRC16 hi XXH

CRC16 lo XXH

图示 2-12强制单线圈----响应

2.6. 预置单寄存器(功能码06)

把一个值预置到一个保持寄存器(4X类型)中,广播时,该功能把值预置到所有从机的相同类型的寄存器中。

该功能可越过控制器的内存保护。使寄存器中的预置值保持有效。只能由控制器的下一个逻辑信号来处理该预置值。若控制逻辑中无寄存器程序时,则寄存器中的值保持不变。

查询

查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。 图示 2-13的例子是请求17号从机0040H.的值为2717。

Addr Fun Data start Data start Value Value CRC CRC

reg hi

reg lo hi lo hi lo

11H 06H 00H 40H 0AH 9DH XXH XXH 图示 2-13预设单寄存器----查询

响应

图2 – 14所示对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。

CRC Addr Fun Data start Data start Value Value CRC

reg hi

reg lo hi lo hi lo

11H 06H 00H 40H 0AH 9DH XXH XXH 图示 2-14预设单寄存器----响应

2.7. 读取异常状态(功能码7)

8个不正常状态线圈的数据,某些线圈号已在不同型号的控制器中预定义,而其它的线圈由用户

编程,作为有关控制器的状态信息,如“machine ON/OFF”,“heads retraced”,(缩回标题),“safeties satisfied”(安全性满意),“error conditions”(存在错误条件)或其它用户定义的标志等。该功能码不支持广播。 该功能代码为存取该类信息提供了一种简单的方法,不正常线圈的类型是已知的(在功能代码中不需要线圈类型) 预定义的不正常线圈号如下: 控制器型号 M84,184/384,584,984

484 884

读从中机中

线圈

1-8 257 258-264 761 设定 用户定义 电池状态 用户定义 电池状态

10 / 18

ModbusRTU通讯协议整理版

762 内存保护状态 763 R10工况状态 764-768 用户预定义

查询

图示 2-15的例子是请求读从机设备17中的不正常状态。

Addr 11H

Fun 07H

CRC16 hi XXH

CRC16 lo XXH

图示 2-15读取异常状态----查询

响应

正常响应包含 8 个不正常的线圈状态,为一个数据字节,每个线圈一位。LSB对应为最低线圈类型的状态。 图2 – 16所示按查询要求返回响应:

Addr 11H

Fun 07H

DO Data 6DH

CRC16 hi XXH

CRC16 lo XXH

图示 2-16读取异常状态----响应

该例子中,线圈数据为 6DH (二进制0110 ,1101),从左到右 (最高位至最低位) 的线圈状态分别为: OFF – ON – ON – OFF – ON – ON – OFF – ON。若控制器型号为 984,这些位表示线圈 8 至 1 的状态;若控制器型号为 484 则表示线圈 264 至 257 的状态。

2.8. 强置多线圈(功能码15)

按线圈的顺序把各线圈 (DO,0X 类型) 强制成 ON 或 OFF。广播时,该功能代码可对各从机中相同类型的线圈起强制作用。

该功能代码可越过内存保护和线圈的禁止状态线圈。保持强制状态有效,并只能由控制器的下一个逻辑来处理。若无线圈控制逻辑程序时,线圈将保持强制状态。

查询

查询信息规定了被强制线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H –0015H(DO1=0000H,DO2=0001H,依此类推)。 查询数据区规定了被请求线圈的 ON/OFF 状态,如数据区的某位值为“1”表示请求的相应线圈状态为ON,位值为“0”,则为OFF状态。

图示 2-17例子为请求从机设备 17 中一组 10 个线圈为强制状态,起始线圈为 20 (则寻址地址为 19 或 13H),查询的数据为 2 个字节,CD01H (二进制 11001101 0000 0001) 相应线圈的二进制位排列如下:

Bit: Coll:

1 27

1 26

0 25

0 24

1 23

1 22

0 21

1 20

0 -

0 -

0 -

0 -

0 -

0 -

0 29

1 28

传送的第一个字节 CDH 对应线圈为 27-20, LSB 对应线圈 20,传送的第二个字节为 01H,对应的线圈为 29-28, LSB 为继圈 28,其余未使用的位均填“0”。

Addr 11H

Fun 0FH

DO addr

hi

00H

DO addr lo

13H

Data #of reg hi 00H

Data #of reg lo 0AH

Byte Value count hi 02H

CDH

Value lo 01H

CRC hi

CRC lo

XXH XXH

图示 2-17强置多线圈----查询

响应

正常响应返回从机地址,功能代码,起始地址以及强制线圈数。 图2 – 18对上述查询返回的响应。

11 / 18

ModbusRTU通讯协议整理版

Addr 11H

Fun 0FH

DO addr hi

00H

DO addr lo

13H

Data #of reg hi 00H

Data #of reg lo 0AH

CRC16 hi XXH

CRC16 lo XXH

图示 2-18强置多线圈----响应

2.9. 预置多寄存器(功能码16)

把数据按顺序预置到各 (4X类型) 寄存器中,广播时该功能代码可把数据预置到全部从机中的相同类型的寄存器中。

该功能代码可越过控制器的内存保护,在寄存器中的预置值一直保持有效,只能由控制器的下一个逻辑来处理寄存器的内容,控制逻辑中无该寄存器程序时,则寄存器中的值保持不变。

查询

查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。 图示 2-19的例子是请求17号从机0040H.的值为178077833。

Fun 10H

Data start Data start reg hi

11H

00H

reg lo 40H

Data #of Data #of reg hi 00H

reg lo 02H

Byte Value count hi 04H 40H

Value lo 89H

Value Value CRC hi

lo

hi

CRC lo

Addr

0AH 9DH XXH XXH

图示 2-19预设多寄存器----查询

响应

图2 – 20所示对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。

Addr 11H

Fun 10H

Data start reg hi 00H

Data start reg lo 40H

Data #of reg hi 00H

Data #of reg lo 02H

CRC16 hi XXH

CRC16 lo XXH

图示 2-20预设多寄存器----响应

2.10. 报告从机标识(功能码17)

返回一个从机地址控制器的类型,从机的当前状态,以及有关从机的其他说明,不支持广播。 查询

图示 2-21的例子是请求报告从机设备 17 的 标识ID 和状态。

Addr 11H

Fun 11H

CRC16 hi XXH

CRC16 lo XXH

图示 2-21报告从机标识----查询

响应

图2 – 22所示正常响应格式,数据内容对应每台控制器的类型。

Addr 11H

Fun 11H

Byte Count

Slave ID

Run Indicator Status

Additfional Data

CRC16 hi XXH

CRC16 lo XXH

XXH XXH XXH XXH

图示 2-22报告从机标识----响应

从机 ID 总结

数据区第一个字节为 Modicon 控制器返回的从机 ID

12 / 18

ModbusRTU通讯协议整理版

Slave ID Controller 0 Micro 84 1 484 2 184/384 3 584 8 884 9 984

特注:详细信息见Modbus协议英文版或中文版。

3. 附录

3.1. 附录A:MODBUS全部功能码

ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。下表3--1是ModBus的功能码定义。

表3--1 ModBus功能码

功能码 01 02 03 04 05 06 07 08 09 10 11 12 13 14

名称

读取线圈状态 读取输入状态 读取保持寄存器 读取输入寄存器 强置单线圈 预置单寄存器 读取异常状态 回送诊断校验 编程(只用于484) 控询(只用于484) 读取事件计数 读取通信事件记录 编程(184/384 484 584) 探询(184/384 484 584)

作用

取得一组逻辑线圈的当前状态(ON/OFF) 取得一组开关输入的当前状态(ON/OFF) 在一个或多个保持寄存器中取得当前的二进制值 在一个或多个输入寄存器中取得当前的二进制值 强置一个逻辑线圈的通断状态 把具体二进值装入一个保持寄存器

取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态

把诊断校验报文送从机,以对通信处理进行评鉴 使主机模拟编程器作用,修改PC从机逻辑

可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送 可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时

可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误 可使主机模拟编程器功能修改PC从机逻辑

可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送

13 / 18

ModbusRTU通讯协议整理版

15 16 17 18 19 20 21

强置多线圈 预置多寄存器 报告从机标识 (884和MICRO 84) 重置通信链路

读取通用参数(584L) 写入通用参数(584L)

强置一串连续逻辑线圈的通断

把具体的二进制值装入一串连续的保持寄存器

可使主机判断编址从机的类型及该从机运行指示灯的状态 可使主机模拟编程功能,修改PC状态逻辑

发生非可修改错误后,是从机复位于已知状态,可重置顺序字节 显示扩展存储器文件中的数据信息 把通用参数写入扩展存储文件,或修改之

留作用户功能的扩展编码

留作内部作用 用于异常应答

22~64 保留作扩展功能备用 65~72 保留以备用户功能所用 73~119 非法功能 120~127 保留 128~255 保留

ModBus网络只是一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。表3--2是ModBus各功能码对应的数据类型。

表3--2 ModBus功能码与数据类型对应表

代码 01 02 03 04 05 06 08 15 16 17

功能 读 读 读 读 写 写 N/A 写 写 读

数据类型 位 位

整型、字符型、状态字、浮点型

整型、状态字、浮点型

整型、字符型、状态字、浮点型

重复“回路反馈”信息

整型、字符型、状态字、浮点型

字符型

3.2. 附录B:不正常响应

不正常响应:

除广播外,主机向从机设备发送查询并希望有一个正常响应,主机查询中有可能产生4种事件:

¨ ¨ ¨

从机接收查询,通讯错误正常处理信息,则返回一个正常响应事件。

由于通讯出错,从机不能接收查询数据,因而不返回响应。此时,主机依靠处理程序给出查询超时事件。 若从机接收查询,发现有 (LRC或CRC) 通讯错误,并返回响应,此时,依靠主机处理程序给出查询超时事件。

14 / 18

¨

ModbusRTU通讯协议整理版

从机接收查询,无通讯错误,但无法处理(如读不存在的线圈和寄存器)时,向主机报告错误的性质。

不正常响应信息有2个与正常响应不相同的区域:

功能代码区:正常响应时,从机的响应功能代码区,带原查询的功能代码。所有功能代码的MSB为0(其值低于80H)。不正常响应时,从机把功能代码的MSB置为1,使功能代码值大于80H,高于正常响应的值。这样,主机应用程序能识别不正常响应事件,能检查不正常代码的数据区。

数据区:正常响应中,数据区含有(按查询要求给出的) 数据或统计值,在不正常响应中,数据区为一个不正常代码,它说明从机产生不正常响应的条件和原因。

例:主机发出查询,从机不正常响应。(为十六进制数据)。 查询: Addr 0AH

Fun 01H

Addr 0AH

DO start reg hi 04H

Fun 81H

DO start reg lo A1H

Exception Code

DO #of regs hi 00H

DO #of regs lo 01H

CRC16 Hi XXH

CRC16 Lo XXH

响应(不正常或例外):

CRC16 Hi XXH

CRC16 Lo XXH

02H

图 3 – 1 . 不正常信息帧格式

上例中,从机设备地址10(0AH),读线圈状态的功能代码(01),主机请求线圈状态的地址为1245(04A1H)。注意:只读一个指定线圈,地址为(0001).

若从机中不存在此线圈地址时,即以不正常代码(02),向主机返回一个不正常响应。说明为不合法地址。

表3--3 ModBus的不正常代码:

代码 01 02 03 04 05

名称 不合法功能代码 不合法数据地址 不合法数据 从机设备故障 确认

含义

从机接收的是一种不能执行功能代码。发出查询命令后,该代码指示无程序功能。

接收的数据地址,是从机不允许的地址。 查询数据区的值是从机不允许的值。

从机执行主机请求的动作时出现不可恢复的错误。

从机已接收请求处理数据,但需要较长的处理时间,为避免主机出现超时错误而发送该确认响应。主机以此再发送一个“查询程序完成”未决定从机是否已完成处理。

从机正忙于处理一个长时程序命令,请求主机在从机空闲时发送信息。

从机不能执行查询要求的程序功能时,该代码使用十进制13或14代码,向主机返回一个“不成功的编程请求”信息。主机应请求诊断从机的错误信息。

从机读扩展内存中的数据时,发现有奇偶校验错误,主机按从机的要求重新发送数据请求。

06 07

从机设备忙碌 否定

08

内存奇偶校验错误

3.3. 附录C:CRC校验生成程序

CRC简单函数如下:

unsigned short CRC16(puchMsg, usDataLen)

unsigned char *puchMsg ; /* 要进行CRC校验的消息 */ unsigned short usDataLen ; /* 消息中字节数 */

15 / 18

ModbusRTU通讯协议整理版

{

unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ unsigned uIndex ; /* CRC循环中的索引 */ while (usDataLen--) /* 传输消息缓冲区 */ {

uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ; uchCRCLo = auchCRCLo[uIndex] ; }

return (uchCRCHi << 8 | uchCRCLo) ; }

/* CRC 高位字节值表 */

static unsigned char auchCRCHi[] = {

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ;

/* CRC低位字节值表*/ static char auchCRCLo[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

16 / 18

ModbusRTU通讯协议整理版

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 } ;

/////////////////////////////////////////////////////////////////////////////// 功能码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

描述

读线圈状态DO 读输入位状态DI 读保持寄存器 读输入寄存器 强制单个线圈DO 预置单个保持寄存器 读不正常状态 诊断(见第3章) 程序 484 查询 484 通讯事件控制 通讯事件记录 程序控制器 查询控制器 强制多个线圈DO 预置多个保持寄存器 报告从机 ID 程序 884/M84 通讯链路复位 读通用参考值 写通用参考值

掩码写入4X类型寄存器 读/写4X类型寄存器

是否支持广播 不支持 不支持 不支持 不支持 支持 支持 不支持 不支持 不 不 不支持 不支持 不 不 支持 支持 不支持 不 不 不支持 不支持 不支持 不支持

起始地址 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H 0000H

备注

读离散量输出口(0X类型)状态 读离散量输入信号(0X类型)状态 读保持寄存器数据

读输入寄存器(3X类型)数据 强制单个线圈(0X类型)状态 置保持寄存器(4X类型)中 没查到 没查到 没查到 没查到

强制各线圈 (0X 类型)状态 置保持寄存器(4X类型)中 没查到 没查到

扩展寄存器(6X类型) 扩展寄存器(6X类型) 保持寄存器(4X类型) 保持寄存器(4X类型)

17 / 18

ModbusRTU通讯协议整理版

24

读FIFO查询数据 不支持 0000H 保持寄存器(4X类型)

18 / 18

因篇幅问题不能全部显示,请点此查看更多更全内容