Modbus协议规范V101.docx

上传人:b****4 文档编号:3779601 上传时间:2022-11-25 格式:DOCX 页数:43 大小:685.49KB
下载 相关 举报
Modbus协议规范V101.docx_第1页
第1页 / 共43页
Modbus协议规范V101.docx_第2页
第2页 / 共43页
Modbus协议规范V101.docx_第3页
第3页 / 共43页
Modbus协议规范V101.docx_第4页
第4页 / 共43页
Modbus协议规范V101.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

Modbus协议规范V101.docx

《Modbus协议规范V101.docx》由会员分享,可在线阅读,更多相关《Modbus协议规范V101.docx(43页珍藏版)》请在冰豆网上搜索。

Modbus协议规范V101.docx

Modbus协议规范V101

目录

Modbus协议介绍1

主从机状态图及编程2

存储的数据结构及地址分配12

具体帧格式描述13

具体功能代码描述14

后续待完善问题30

参考文献30

附录30

Modbus协议介绍

Modbus串行链路协议是一个主-从协议。

在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247)连接于同一个串行总线。

Modbus通信总是由主节点发起。

子节点在没有收到来自主节点的请求时,不会发送数据。

子节点之间也不会互相通信。

如果从机之间要求通信,只能通过主机进行转送传输。

本协议不支持该模式,即不容许从机间通信(以后可以进行改进)。

主节点在同一时刻只会发起一个Modbus事务处理。

Modbus协议有两只两种串行传输模式:

RTU模式和ASCII模式。

RTU模式在相同的波特率下比ASCII模式有更高的吞吐率。

本协议采用RTU模式。

主机向从机请求有两种请求模式:

广播模式和单播模式。

广播模式下从机不返回响应。

单播模式下主机发送请求,被寻址从机在处理该请求后返回响应。

占用的硬件资源

从机:

串行通信口1个、8位或16位定时器1个、RTC或秒定时器1个。

主机:

串行通信口1个、8位或16位定时器2个、RTC或秒定时器1个。

帧的简单描述

Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。

在特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域。

本协议无附加域。

图1通用Modbus协议帧

地址域包含要寻址的从机地址,也可为广播地址。

功能代码表示从机要执行何种操作,数据段为操作提供数据。

差错校验码可以提高通信的可靠性。

一般为CRC校验。

通信模式:

查询—回应周期Modbus没有握手机制,主机直接发送操作代码,从机立刻回应。

(1)查询

查询消息中的功能代码告之被选中的从机要执行何种功能。

数据段包含了从机要执行功能的任何附加信息。

例如功能代码03是要求从机读保持寄存器并返回它们的内容。

数据段必须包含要告之从机的信息:

从何寄存器开始读及要读的寄存器数量。

错误检测域为从机提供了一种验证消息内容是否正确的方法。

(2)回应

如果从机产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

数据段包括了从机收集的数据:

像寄存器值或状态。

如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。

错误检测域允许主机确认消息内容是否可用。

正常的通信如图2所示。

图2无差错事务处理

如果从机收到异常信息,则返回从机地址、差错码(设置该原始功能码的最高有效位为逻辑1)及异常码,具体见图3

图3异常事务处理

在主机中应有定时控制,如果主机在1秒内没有收到相应从机的响应,则主机再重复发送两次相同请求代码,三次都没有相应响应则报告通信异常(三次收到数据但CRC校验错误也报告通信异常)。

对于主机而言,事先应约定好地址范围,将并地址放到地址池中。

如果不知道从机地址范围,则地址池中地址的从1到247都有。

对于报告通信异常的地址可以将其从地址池中剔除,以后不再寻址该从机。

(需要考虑的一点为在主机在寻址某个从机时刚好该从机故障或断电,无法应答,之后从机恢复,但主机会无法跟该从机通信,因地址池中无该从机地址)。

主从机状态图及编程

主机状态图

图4主节点状态图

对上面的状态图的一些解释:

◆状态“空闲”=无等待的请求。

这是电源上电后的初始状态。

只有在“空闲”状态请求才能被发送。

发送一个请求后,主节点离开“空闲”状态,没有回到“空闲”时不能发送第二个请求。

◆当单播请求发送到一个子节点,主节点将进入"等待应答"状态,同时一个临界超时定时启动。

这个超时称为“响应超时”。

它避免主节点永远处于“等待应答”状态。

如果出现响应超时,则再次发送上一次信息。

连续三次出现响应超时,则报告通信异常。

响应超时为1s。

◆当收到一个应答时,主节点在处理数据之前检验应答。

在某些情况下,检验的结果可能为错误。

如收到来自非期望的子节点的应答,或接收的帧错误。

在收到来自非期望子节点的应答时,响应超时继续计时;当检测到帧错时,可以执行一个重试。

◆帧错误包括1)对每个字符的奇偶校验;2)对整个帧的CRC校验。

◆在单播方式,响应超时必须设置到足够的长度以使任何子节点都能处理完请求并返回响应。

而广播转换延迟必须有足够的长度以使任何子节点都能只处理完请求而可以接收新的请求。

因此,转换延迟应该比响应超时要短。

◆当广播请求发送到串行总线上,没有响应从子节点返回。

主节点需要进行延迟以便使子节点在接收新的请求处理前完成当前请求。

该延迟被称作“转换延迟”。

因此,主节点在返回“空闲”状态之前,应先到“等待转换延迟”状态。

转换延迟为200ms。

◆两次发送请求的时间间隔必须大于T3.5。

◆连续出现三次通信异常则提示与某从机通信错误,并将该从机从地址池中删除。

一次通信成功则将通信异常计数器清零。

通信异常包括:

响应超时,帧检测错误。

◆如果收到异常功能代码,在上位机应显示相应提示。

但该次通信被认为是成功的。

从机状态图

图5从机状态图

对上面的状态图的一些解释:

◆状态“空闲”=没有等待的请求。

这是电源上电后的初始状态。

在响应完应答后也回到“空闲”状态。

◆如果子节点在接收到的帧中检测到错误(奇偶校验错误,CRC校验错误,图中表示为请求数据有错),则没有响应返回到主节点。

◆当收到一个请求时,子节点在处理请求中要求的动作前检验报文包。

当检测到错误时(注意跟上面的错误相区别,图中表示为处理时出错),必须向主节点发送应答。

不同的错误可以发生于:

请求的格式错,非法动作,……具体的可能错误见功能代码异常类型介绍。

◆当要求的动作完成后,单播报文要求必须格式化一个应答并发往主节点。

如果要求的动作完成时间超过响应超时,则应发送确认异常码。

确认异常码介绍见。

◆如果在广播模式下,要求在收到请求后完成处理的时间在转换延迟时间内。

◆为防止非寻址从机在接收中断中停留过长时间,从机每次进入接收中断先判断是否寻址本机,不是则快速退出中断。

具体流程图见接收中断流程图。

◆更为具体的程序流程图见附录。

从机事务处理流程图

图6从机事务处理流程图

对上面的状态图的一些解释:

◆只有从机在奇偶校验、CRC校验通过了才进行该处理请求处理,为确保操作的正确进行,对该处理进行了一些判断,出现异常则响应相应的异常代码。

◆根据处理结果,可以建立两种类型响应:

●正常响应:

响应功能码=请求功能码

●异常响应(参见第6.14节):

用来为客户机提供处理过程中与被发现的差错相关的信息;

响应功能码=请求功能码+0x80;

提供一个异常码来指示差错原因。

◆在实际的从机事务处理中,确认操作码是在接收完一帧后马上判断的,从确认信息以后都是在相应功能代码处理中进行判断的。

传输模式及定时控制

图7传输模式状态图

上面状态图的一些解释:

◆“空闲”是没有发送和接收报文要处理的正常状态。

◆当总线没有活动的传输的时间间隔达3.5个字符长时,通信链路被认为在“空闲”态。

◆当总线空闲时,在总线上检测到的任何传输的字符被识别为帧起始。

总线变为“活动”状态。

然后,当总线上没有字符传输的时间间个达到t3.5后,被识别为帧结束。

◆检测到帧结束后,完成CRC计算和检验。

然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。

为了减少接收处理时间,地址域在一接收到就分析,而不需要等到整个帧结束。

这样,CRC计算只需要在帧寻址到该节点(包括广播帧)时进行。

◆开始到“空闲”的t3.5的定时控制不使用定时器来实现,因单片机上电初始化占用时间大于t3.5。

◆在发送时,其t3.5定时由接收程序来保证,因为只有在大于t3.5时才判断为帧结束,即使马上发送也可以保证两帧之间的t3.5定时要求。

◆对于从机,为减少在接收中断的停留时间,地址域可以在帧开始就分析,如果不是寻找本机,将地址匹配标志位清零,以后每次进入接收中断都马上退出。

当检测到帧结束时才将地址匹配标志位置位。

这样,CRC计算只需要在帧寻址到该节点(包括广播帧)时进行。

具体流程图

接收中断程序流程图

图8接收中断流程图

上面程序流程图的一些说明:

◆主程序初始化时,地址匹配标志位、帧启动标志位都是置位的。

T3.5超时表示帧结束,此时关闭T1.5和T3.5定时,地址匹配标志位、帧启动标志位置位,以便下次进入接收中断对帧地址是否匹配和是否开启定时器判断。

接收计数器也应在帧结束时清零。

◆为减少在接收中断的停留时间,开始就对帧的地址进行判断,如果不是寻找本机,将地址匹配标志位清零,以后每次进入接收中断都马上退出。

当检测到帧结束时才将地址匹配标志位置位,准备对下一帧的地址进行判断。

这样,只有被寻址的从机才在接收中断中停留较长时间。

◆为节约定时器,可以将T1.5和T3.5的定时采用同一个定时器,其基本定时时间为1.75个字节时间。

◆定时器在帧启动时开启,T3.5超时中断中将其关闭。

◆当广播时,只是将广播标志位置位,等待T3.5超时中断将帧完成标志位置位,在帧处理中处理广播。

T3.5、T1.5定时中断程序流程图

图9定时器中断流程图

上面程序流程图的一些说明:

◆定时器只采用一个。

一次基本定时为1.75个字节时间,根据接收到的字节计数器的值区别T1.5和T3.5,正常帧的在T1.5和T3.5时接收计数器的值应该是相同的。

如果帧内两个字节的时间间隔超过T1.5,则在T1.5和T3.5时接收计数器的值肯定是不一样的,此时将丢弃帧标志位置位。

◆T3.5超时时,应将定时器关闭,否则处理完该帧在没有接受新的帧也会进入定时中断修改一些全局变量。

帧长度就是此时的接收字节计数器的值。

地址匹配标志位、帧启动标志位、接收字节计数器清零,为开始下一帧的接收做准备。

主机帧处理

中断及T3.5、T1.5定时主机与从机相同,见图8、图9。

在主机中还有响应超时控制,需要共用实时时钟(RTC)或定时器来实现。

图10主机帧处理流程图

上面状态图的一些解释:

◆本程序流程图为主机的全部流程图,在具体实现是可以将帧动作前的相应检查作为一个函数来实现。

发送部分为一个函数。

◆执行帧的动作前应检查是否满足:

1)帧内字节间时间小于T1.5,2)CRC校验是否正确,3)功能代码是否超限。

◆功能代码范围应包括表2所示的正常代码及相应高位置1的异常代码。

◆上述检查正确后,根据要求从机响应数据的要求来处理接收数据。

具体实现要根据需要来编写。

需要注意的一点是从机可能会返回异常代码,故每个功能代码处理时要求有异常代码的判断。

◆如果上述检查错误,则推出处理程序,等待超时中断处理。

◆在发送时,需要判断是广播模式还是单播模式,广播模式下要求开转换延时计数器并关闭接收中断,而单播模式不需要。

◆接收处理时,广播模式从机没有数据响应,故没有广播模式的处理。

超时定时中断及延迟超时中断处理

图11超时中断处理图12延迟超时中断处理

从机帧处理流程图:

中断及T3.5、T1.5定时主机与从机相同,见图8、图9。

图13从机帧处理流程图

上面状态图的一些解释:

◆执行帧的动作前应检查是否满足:

1)帧内字节间时间小于T1.5,2)CRC校验是否正确,3)功能代码是否超限。

◆上述检查正确后,在根据功能代码执行各个操作前还应检查操作的寄存器地址范围是否超限。

如果超限则返回地址异常代码。

◆所有检查正确并在相应操作成功执行完成后发送响应。

如果完成操作时间大于响应超时,则响应确认异常代码。

◆在广播模式下,从机不响应,且执行广播的动作要求在转换延迟(200ms)内完成。

存储的数据结构及地址分配

采用独立的存储地址,即每个块的数据与其他数据块的地址是分离的。

数据分为四个块,分别为:

开关量输入、开关量输出、保存寄存器、输入寄存器,见图14。

图14数据结构及存储地址分配

其中,开关量的输入只是输入量,即它是只读的。

开关量输出为可读可写,读表示现在当前开关量输出的状态,写为开关量的输出。

输入寄存器为模拟量的输入,保持寄存器读为各配置变量的寄存器的值,写则对各变量进行配置。

表1数据类型及说明

类型

操作数据类型

访问类型

备注

开关量输入

单字节

只读

开关量的输入

开关量输出

单字节

读写

读为当前开关量的的状态(线圈状态),写为开关量的输出

保持寄存器

2字节

读写

模拟量、单片机内部寄存器的、单片机内部变量的配置

输入寄存器

2字节

只读

模拟量的输入、各种不可配置的输入量

对于模拟采集板卡,其地址作以下约定:

◆输入寄存器的地址0x0180--0x01A0为16路模拟量的原始的采集值。

每个地址对应两个字节数据,每路模拟量的占用两个地址,其采样值为32位(高位不足用0填充),高16位占用第一个地址,低16位占用第二个地址,每个地址的数据也是高位在前。

例如,某路模拟量的采集值为0x123456,则发送为0x00,0x12,0x34,0x56。

在软件中保证每次模拟量的地址是偶数,如果出现奇数(不管是起始地址还是地址个数),则响应数据地址异常代码。

◆保持寄存器地址分配为:

0x0100—0x010F为16路模拟量通道配置,每路模拟量对应一个地址,可以对该地址写表示配置该通道,读则返回该通道现有配置值。

其余应用可以根据具体需要自定义地址。

具体帧格式描述

单个字符传输:

1个起始位(0),8个数据位,1个奇偶校验位(用停止位填充),1个停止位

(1)。

图15单字节比特流

帧格式:

图16帧格式

地址、功能代码、数据的发送都采取大端模式,当一个数据大余两个字节时,都是高位在前,低位在后。

CRC校验码是低位在前,高位在后。

地址:

地址0保留为广播地址。

主机没有地址。

每个从机分配一个地址(范围1--247),该地址必须在Modbus串行总线上唯一。

在该串行总线上最多可以挂载247个从机。

功能代码:

Modbus包括三类功能代码:

公共的,用户自定义的及保留的。

在本协议中只采用部分公共功能代码。

具体的见P14的具体功能代码描述。

CRC(循环冗余校验)校验:

为保证帧的可靠传输,采用CRC校验。

CRC域检验整个帧的内容。

不管报文有无奇偶校验,均执行此检验。

(奇偶校验为一个字节的内部的校验,一般为单片机内部硬件完成)。

每次发送节点在发送前将将该帧的所有字节进行CRC计算,将16位结果放到该帧的结尾(低位在前),接收节点在接收到该帧后对除CRC校验码的所有字节进行CRC计算,再将该结果与接收帧中的CRC码进行比较,如果一致则传输无误,进行接收处理。

如果不一致则什么也不做,等待接收下一帧数据。

具体的CRC校验原理及算法见附录。

帧间定时控制:

每一帧之间的时间间隔应大于T3.5(3.5个字符时间)。

如果小于T3.5,则认为还是上一帧的数据。

只有在总线空闲时间大于T3.5时,才判定该帧结束,可以对该帧进行处理。

帧内的两个字符之间的间隔应小于T1.5(1.5个字符时间)。

如果大于T1.5,则该帧被认为不完整帧,应该被接收节点丢弃,但此时接收节点还是继续接收该帧的数据,直到出现T3.5超时才将该帧丢弃,并准备接收下一帧数据。

图17帧间定时控制

具体功能代码描述

表2功能代码表

功能

功能码

(十六进制)

访

单字节访问

物理离散量输入

读输入离散量

02

02

16

内部比特

读线圈

01

01

14

写单个线圈

05

05

21

物理线圈

写多个线圈

15

0F

24

双字节访问

输入存储器

读输入寄存器

04

04

20

内部存储器或物理输出存储器

读多个寄存器

03

03

18

写单个寄存器

06

06

23

写多个寄存器

16

10

26

异常代码

单字节访问

包含异常错误信息

具体见表3

具体见表3

具体见表3

28

 

●01(0x01)读线圈

在一个远程设备中,使用该功能码读取线圈的1至2000连续状态。

请求PDU详细说明了起始地址,即指定的第一个线圈地址和线圈编号。

从零开始寻址线圈。

因此寻址线圈1-16为0-15。

根据数据域的每个比特将响应报文中的线圈分成为一个线圈。

指示状态为1=ON和0=OFF。

第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。

其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。

字节数量域说明了数据的完整字节数。

请求PDU

功能码

1个字节

0x01

起始地址

2个字节

0x0000至0x007F

线圈数量

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的实例:

请求

响应

域名

(十六进制)

域名

(十六进制)

功能

01

功能

01

起始地址Hi

00

字节数

03

起始地址Lo

13

输出状态27-20

CD

输出数量Hi

00

输出状态35-28

6B

输出数量Lo

13

输出状态38-36

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。

用零填充五个剩余高位比特。

注:

用零填充五个剩余比特(一直到高位端)。

图18读线圈状态图

●02(0x02)读离散量输入

在一个远程设备中,使用该功能码读取离散量输入的1至2000连续状态。

请求PDU详细说明了起始地址,即指定的第一个输入地址和输入编号。

从零开始寻址输入。

因此寻址输入1-16为0-15。

根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。

指示状态为1=ON和0=OFF。

第一个数据字节的LSB(最低有效位)包括在询问中寻址的输入。

其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。

字节数量域说明了数据的完整字节数。

请求PDU

功能码

1个字节

0x02

起始地址

2个字节

0x0080至0x00FF

输入数量

2个字节

1至2000(0x7D0)

响应PDU

功能码

1个字节

0x02

字节数

1个字节

N*

输入状态

N*×1个字节

*N=输出数量/8,如果余数不等于0,那么N=N+1

错误

差错码

1字节

0x82

异常码

1字节

01或02或03或04

这是一个请求读取离散量输入197-218的实例:

请求

响应

域名

(十六进制)

域名

(十六进制)

功能

02

功能

02

起始地址Hi

00

字节数

03

起始地址Lo

C4

输入状态204-197

AC

输出数量Hi

00

输入状态212-205

DB

输出数量Lo

16

输入状态218-213

35

将离散量输入状态204-197表示为十六进制字节值AC,或二进制10101100。

输入204是这个字节的MSB,输入197是这个字节的LSB。

将离散量输入状态218-213表示为十六进制字节值35,或二进制00110101。

输入218位于左侧第3比特,输入213是LSB。

注:

用零填充2个剩余比特(一直到高位端)。

图19:

读离散量输入的状态图

●03(0x03)读保持寄存器

在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。

请求PDU说明了起始寄存器地址和寄存器数量。

起始寻址寄存器是从0x0100开始。

将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。

对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。

请求

功能码

1个字节

0x03

起始地址

2个字节

0x0100至0x017F

寄存器数量

2个字节

1至125(0x7D)

响应

功能码

1个字节

0x03

字节数

1个字节

2×N*

寄存器值

N*×2个字节

*N=寄存器的数量

错误

差错码

1个字节

0x83

异常码

1个字节

01或02或03或04

这是一个请求读寄存器0x0108-0x010A的实例:

请求

响应

域名

(十六进制)

域名

(十六进制)

功能

03

功能

03

高起始地址

01

字节数

06

低起始地址

08

寄存器值Hi(108)

02

高寄存器编号

00

寄存器值Lo(108)

2B

低寄存器编号

03

寄存器值Hi(109)

00

寄存器值Lo(109)

00

寄存器值Hi(110)

00

寄存器值Lo(110)

64

将寄存器0x108的内容表示为两个十六进制字节值022B,或十进制555。

将寄存器0x109-0x10A的内容分别表示为十六进制0000和0064,或十进制0和100。

图20:

读保持寄存器的状态图

●04(0x04)读输入寄存器

在一个远程设备中,使用该功能码读取1至大约125的连续输入寄存器。

请求PDU说明了起始地址和寄存器数量。

从零开始寻址寄存器。

因此,寻址输入寄存器1-16为0-15。

将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。

对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。

请求

功能码

1个字节

0x04

起始地址

2个字节

0x0180至0x01FF

输入寄存器数量

2个字节

0x0001至0x007D

响应

功能码

1个字节

0x04

字节数

1个字节

2×N*

输入寄存器

N*×2个字节

*N=输入寄存器的数量

错误

差错码

1个字节

0x84

异常码

1个字节

01或02或03或0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1