首页 > 编程知识 正文

modbus通讯协议功能码详解,MODBUS-RTU协议

时间:2023-05-06 09:08:24 阅读:125452 作者:2249

ModBus网络是一种工业通信系统,带有智能终端的可编程控制器和计算机通过公共线路或本地专用线路连接。 系统配置既包括硬件也包括软件。 可应用于各种数据采集和过程监控。

ModBus网络上只有一个主机,所有通信都由他发出。 网络可以支持247台以上的远程从站控制器,但实际支持的从站数取决于所使用的通信设备。 采用该系统,每个PC可以与中心主机交换信息,而不影响每个PC执行其控制任务。

了解Modbus通信协议的情况后,可以在现场使用各种第三方小软件进行通信测试。

Modbus协议包括ASCII、RTU、TCP等,没有规定物理层。 该协议定义了控制器可以识别和使用的消息结构。 这些消息结构是定义的,无论它们通过什么网络进行通信。 标准Modicon控制器使用RS232C实现串行Modbus。 Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和响应方式,数据通信采用Maser/Slave方式,Master端发出数据请求消息,Slave端收到正确的消息主机端也可以直接发送消息修改Slave端的数据,实现双向读写。

Modbus协议需要数据验证。 除了串行协议中的奇偶校验外,ASCII模式还使用LRC验证,RTU模式使用16位CRC验证,但在TCP模式下,TCP协议是面向连接的受信任协议,因此没有单独规定验证。 另外,Modbus采用主从方式定时收发数据,实际使用中的Slave站点断开后,例如故障或关机时,主控端可以诊断,故障修复后,网络可以自动连接。 因此,Modbus协议可靠性很高。

对于Modbus的ASCII、RTU和TCP协议,TCP和RTU协议非常相似。 只需删除RTU协议的2字节校验码,并在RTU协议的开头添加5个0和6,然后通过TCP/IP网络协议发送即可。

1

通讯传送方式:

通信传输被分成独立的报头和发送的编码数据。 以下通信传输方式的定义也与ModBusRTU通信条款兼容。

初始结构=4字节的时间

地址码=1字节

功能代码=1字节

数据区域=N字节

错误检查=16位CRC代码

结束结构=4字节的时间

地址码:地址码是通信传输的第一个字节。 此字节表示用户设置了地址码的从设备将接收主机发送的信息。 另外,每个从站都有唯一的地址码,响应回复以各自的地址码开始。 主机发送的地址代码表示发送的从站地址,从站发送的地址代码表示返回的从站地址。

功能码:通信传输的第二个字节。 ModBus通信规约定义功能编号为1~127。 本仪器只使用其中一部分功能代码。 作为主请求发送,用功能代码告诉从站执行什么样的动作。 作为从站的响应,从站发送的功能代码与主机发送的功能代码相同,表示从站响应主机进行了操作。 从站发送的功能代码的最高位为1时,例如功能代码较大同时为127时,表示从站没有响应操作或发送错误。

数据区:数据区域因功能代码而异。 数据区可以是实际值、设置点、主机到从机的目标地址,也可以是从机到主机的目标地址。

CRC码:字节的错误检测代码。

2

通讯规约:

当通信指令被发送到设备时,与该地址码匹配的设备接收通信指令,删除地址码读取信息,在无错误情况下执行其任务; 然后将执行结果返回给发送者。 返回的信息包括地址代码、执行操作的功能代码、执行操作结果的数据以及错误校验码。 发生错误时不发送任何内容。

1信息帧结构

地址码功能代码数据区域错误校验码

8位8位N 8位16位

地址码:地址代码是信息帧的第一个字节(8位),范围从0到255。 此字节表示用户设置了地址的从站将接收主机发送的信息。 每个从站必须具有唯一的地址码,并且只有与该地址码匹配的从站才能响应回复。 从站回复信息时,相当的地址码表示该信息来自哪里。

功能码:主机发送的功能代码告诉从机执行什么任务。 表1-1所示的功能代码有具体的含义和操作。

数据区:数据区包含从站需要执行什么操作,或者从站收集的返回信息。 这些信息包括数值、引用对象等。 例如,功能代码指示从站读取寄存器的值时,数据区域必须包含要读取的寄存器的起始地址和读取长度。 地址和数据信息因从站而异。

错误校验码:主机或从机通过校验码判断接收信息是否错误。 在某些情况下,由于电子噪声和其他干扰,信息在传输过程中可能会发生细微的变化,错误校验码可以保证主机或从机

传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。

注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。

2.错误校验

冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的 CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。

3

Modbus支持的功能码:

功能码

名称

作用

1

读取线圈状态

取得一组逻辑线圈的当前状态(ON/OFF)

2

读取输入状态

取得一组开关输入的当前状态(ON/OFF)

3

读取保持寄存器

在一个或多个保持寄存器中取得当前的二进制值

4

读取输入寄存器

在一个或多个输入寄存器中取得当前的二进制值

5

强置单线圈

强置一个逻辑线圈的通断状态

6

预置单寄存器

把具体二进值装入一个保持寄存器

7

读取异常状态

取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定

8

回送诊断校验

把诊断校验报文送从机,以对通信处理进行评鉴

9

编程(只用于484)

使主机模拟编程器作用,修改PC从机逻辑

10

控询(只用于484)

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

11

读取事件计数

可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时

12

读取通信事件记录

可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误

13

编程(184/384 484 584)

可使主机模拟编程器功能修改PC从机逻辑

14

探询(184/384 484 584)

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

15

强置多线圈

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

16

预置多寄存器

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

17

报告从机标识

可使主机判断编址从机的类型及该从机运行指示灯的状态

18

(884和MICRO 84)

可使主机模拟编程功能,修改PC状态逻辑

19

重置通信链路

发生非可修改错误后,是从机复位于已知状态,可重置顺序字节

20

读取通用参数(584L)

显示扩展存储器文件中的数据信息

21

写入通用参数(584L)

把通用参数写入扩展存储文件,或修改之

22~64

保留作扩展功能备用

 

65~72

保留以备用户功能所用

留作用户功能的扩展编码

73~119

非法功能

 

120~127

保留

留作内部作用

128~255

保留

用于异常应答

4

功能码命令详解:

在这些功能码中较长使用的是1、2、3、4、5、6号功能码,使用它们即可实现对下位机的数字量和模拟量的读写操作。

1、01号命令,读可读写数字量寄存器(线圈状态):

计算机发送命令:[设备地址] [命令号01] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][01][00][13][00][25][CRC低][CRC高]

意义如下:

<1>设备地址:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和17号(十进制的17是十六进制的11)通讯。

<2>命令号01:读取数字量的命令号固定为01。

<3>起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为19。

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37个开关量。

<5>CRC校验:是从开头一直校验到此之前。

设备响应:[设备地址] [命令号01] [返回的字节个数][数据1][数据2]...[数据n] [CRC校验的高8位] [CRC校验的低8位]

例:[11][01][05][CD][6B][B2][0E][1B] [CRC高] [CRC低]

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。

<3>数据1...n:由于每一个数据是一个8位的数,所以每一个数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。比如例子中,表示20号(索引号为19)开关闭合,21号断开,22闭合,23闭合,24断开,25断开,26闭合,27闭合...如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0。

<4>CRC校验同上。

2、05号命令,写数字量(线圈状态):

计算机发送命令:[设备地址] [命令号05] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][05][00][AC][FF][00][CRC高][CRC低]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写数字量的命令号固定为05。

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的开关的地址。

<4>下置的数据高8位,低8位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00]表示闭合[00][00]表示断开,其他数值非法。

<5>注意此命令一条只能下置一个开关量的状态。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

3、03号命令,读可读写模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的高8位] [CRC校验的低8位]

例:[11][03][00][6B][00][03] [CRC高][CRC低]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:读模拟量的命令号固定为03。

<3>起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为107。

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。

设备响应:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n] [CRC校验的高8位] [CRC校验的低8位]

例:[11][03][06][02][2B][00][00][00][64] [CRC高] [CRC低]

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。例子中返回了3个模拟量的数据,因为一个模拟量需要2个字节所以共6个字节。

<3>数据1...n:其中[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。例子中返回的值分别是555,0,100。

<4>CRC校验同上。

4、06号命令,写单个模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的高8位] [CRC校验的低8位]

例:[11][06][00][01][00][03] [CRC高] [CRC低]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写模拟量的命令号固定为06。

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。

<4>下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3。

<5>注意此命令一条只能下置一个模拟量的状态。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

5、16号命令,写多个模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号16] [需下置的寄存器地址高8位] [低8位] [数据数量高8位] [数据数量低8位] [下置的数据高8位] [低8位][……][……] [CRC校验的高8位] [CRC校验的低8位]

例:[11][16][00][01][00][01][00][05] [CRC高] [CRC低]

意义如下:

<1>设备地址和上面的相同。

<2>命令号:写模拟量的命令号固定为16。

<3>需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。

<4>需下置的数据数量高8位,低8位:表明了需要下置的数据数量,这里为1。

<5>下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为5。

设备响应:如果成功把计算机返回的如下命令,否则不响应。

设备响应:[设备地址] [命令号16] [需下置的寄存器地址高8位] [低8位] [数据数量高8位] [数据数量低8位] [CRC校验的高8位] [CRC校验的低8位],如上例返回:

[11][16][00][01][00][01] [CRC高] [CRC低]

BFH

BFH

BFH

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。