Modbus协议-03

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Modbus 协议
本手册介绍了Modbus 串行通讯协议。

希望能对Modbus 主机编程的用户提供一定的帮助。

本章的版权属于Modicon,已经过Schneider Automation(modicon)同意。

Modicon 出版的《Modicon Modbus 通讯协议参考手册(PI-MBUS-300Rev.e )》包含本章的内容。

Modebus 协议概述
Modebus 协议是一种串行的主从通讯协议。

本手册的内容仅限于ACS140和ACS400传动控制所涉及到的Modebus 通讯协议部分。

Modebus 协议定义了串行通讯中传输哪些信号。

ACS140/ACS400 的物理接口是半双工的。

ACS140必须使用RS485/232适配器,信号等级由RS485/232适配器设定。

在ACS400有标准的RS485串行口,RS485/232适配器只在使用RS232总线时才需要。

Modebus 网络的执行过程
Modicon 控制器使用的是与RS232C 兼容的标准通讯接口。

它定义了插头外型、接线管脚、信号等级、传输波特率和奇偶校验等。

控制器可以直接与网络联接,也可以通过调制解调器联接。

控制器的通讯采用的是一种主从通讯技术,网络中只有一个设备(称为主设备)能够建立协议(称为“查询”)。

其他的设备(称为从机)只能通过提供数据响应主机的查询,或根据查询作出相应的动作。

主机一般包括主从处理器和可编程的控制盘。

从机一般包括可编程控制器等。

主机既能对某个从机单独访问,又能对所有的从机发布广播信息。

对于单独访问的主机查询,从机都要返回一个信息(称为响应);对于主机发出的广播信息,不需要从机的响应。

Modebus 协议定义了主机查询的格式,包括:从机的编址方法(或广播)、要求动作的功能代码、传输数据和错误校验等。

从机的响应也是采用Modebus 协议结构,包括:动作却认、返回数据和错误校验等。

如果从机在接受信息时发生错误,或不能完成主机要求的动作,它将组织一个故障信息作为响应。

查询:查询中的功能代码告诉指定的从机完成什么样的动作。

数据字节中包含了从机执
主机的查询信
从机的响应信息 图1 主机-从机与查询-响应
内容。

数据区必须告诉从机应该从哪个寄存器开始读,需要读多少个寄存器。

错误校验区为从机指定了信息完整性校验的方法。

响应:正常情况下,从机响应的功能代码与查询的功能代码相对应,数据区包含从机根据查询要求收集到的数据,如寄存器的值或状态等。

当发生通讯错误时,功能代码就转而指示该响应为故障响应,数据字节则包含故障描述代码。

错误校验域允许主机确认信息内容是否有效。

两种串行传输格式
在标准Modbus网络中,控制器可以配置为ASCII或RTU中的任意一种通讯模式。

在配置处理器时,用户选择一种自己需要的一种模式,设置串行通讯接口的通讯参数(波特率、奇偶校验模式等)。

在同一Modbus网络中,所有设备的传输模式和通讯参数必须相同。

ASCII或RTU模式的选择仅适用于标准Modbus网络,它定义了传输信息中的每一位含义,决定了信息的组织发送和解码方式。

注意!ACS140/ACS400变频器只支持 RTU模式。

本手册也只对RTU模式进行介绍。

●RTU模式
当控制器在Modbus网络上被设定为采用RTU(远程终端单元)模式进行通讯时,信息中的每一个8位字节包括两个4位的十六进制字符。

这种方式的最大好处就是字符的密度可以更高,相同波特率的数据流量比ASCII模式更大。

每个信息必须在一个连续的数据流中进行传输。

RTU模式中每个字节的格式是:
编码系统:8位二进制,十六进制0-9,A-F
每个8位的信息域中包含2个十六进制字符
字节的位:1个开始位
8个数据位,首先发送最低位
1个位用于奇偶校验;无校验时没有这一位
1个停止位(有校验时);2个停止位(无校验时)错误校验区:循环冗余校验(CRC)
Modbus信息的帧结构
无论在哪种串行传输模式中(ASCII或RTU),发送设备都将Modbus信息放入一个起点和终点已知的框架中。

这样接收设备就知道从信息的起始点开始,取出其中的地址信息,确定用于哪个设备(广播信息针对所有设备),并判断信息是否结束。

不完整的信息会被发现并当做故障处理。

●RTU的帧结构
在RTU模式中,新的信息总是以至少3.5 个字符的静默时间开始。

在以波特率计算传输速率的网络上,以字符为单位计算时间显得很容易(如下面图所示的T1-T2-T3-T4).紧接着传送第一个域:设备地址。

每个域的允许传输字符都是0-9,A-F的十六进制数。

网络设备始终监视着通讯总线的活动,即使在静默间隔时间内。

当接收到第一信息域后(地址信息),每个网络设备都对此进行译码,以确定自己是不是所寻址的设备。

随着最后一个字符传输结束,又有一段类似的3.5个字符的间隔时间,用来标志本次的信息传输已经结束。

在此之后,又将开始一个新的信息。

整帧的信息必须以一个连续的数据流进行传输。

如果信息结束前存在超过1.5个字符以上的间隔时间,接收设备将清除这些不完整的信息,并错误的认为随后一个字符是新一
同样地,如果一帧新信息的开始与前一信息的间隔小于3.5个字符时间,接收设备将认为它是前一信息的继续。

由于信息的错乱,最终的CRC域不正确,将导致产生一个故
图2 信息的帧结构
●地址域
信息的地址域包括8位(RTU)。

从机的有效地址范围为0-247(十进制)。

单个从机的地址范围为1-247。

主机寻址从机的方法就是将从机的地址信息放在地址域中。

从机返回响应信息时,也将自己的地址放在地址域,以便让主机知道是从哪台从机返回的。

地址0表示广播方式,所有的从机都认可。

在更高一级网络中应用Modbus协议时,广播方式其他方式取代有可能不允许或被。

例如,Modbus Plus使用全局共享的数据库,通过令牌的循环进行数据更新。

●功能域
信息的功能包括8位(RTU)。

有效码为1-255(十进制)。

其中,有些适用于所有Modicon 控制器,有些仅适用于某些特定的模式,还有一些为将来保留它用。

ACS140/ACS400变频器支持3、6和16形式的编码(十六进制为0*03、0*06和0*10)。

当一帧数据由主机传送到从机时,功能域的编码会告诉从机去干什么。

示例是读一组输出数据。

?????响应,也使用功能编码的方式进行,或表示响应正常(无错误),或表示???(称为例外情况响应)。

正常响应时,从机将原来功能编码的最高位置1后返回。

例如主机发送到从机的从机的一条信息是要读一组保持寄存器,功能编码可能如下:
0000 0011 (十六进制03)
如果从机准确无误的执行了所要求的动作,返回主机的功能编码相同,如果例外情况发生,从机返回的功能编码是:
1000 0011 (十六进制83)
除此之外,从机还在返回的数据域设置了一个特殊代码,告诉从机发生了什么样的错误,或者发生例外情况的原因是什么。

主机的应用程序负责处理响应。

一般的处理方法是:发出重复信息,实验从机对诊断信息的反应,或者提示操作人员。

●数据域
数据域由多组这样的数据构成的:两个十六进制数为一组,范围在00-FF之间,按照串行的网络结构,这些数据产生于RTU字符。

主机发给从机的数据域中包括了从机完成功能域的动作时必需的附加信息,可能包括这样一些项目,如:数字寄存器和保持寄存器地址、将要处理的项目数量和实际的数据字节数。

例如,主机要求从机读一组保持寄存器(功能码03),数据域就指定了起始寄存器、需要读多少个寄存器;如果主机要向从机中的一组寄存器写入数值(功能编码为10,十六进制),数据域就规定了起始寄存器、要向多少个寄存器写入数据、数据字节数、以及写入寄存器什么样的数据。

如果没有发生什么错误,从机在响应的数据域中包括了要求的数据,如果错误发生,数据区中将包括例外情况编码,主机能够根据这一编码决定下一步的行动。

在有些信息中,允许数据域不包含任何数据(长度为0)。

例如,对于主机的查询,从机以通讯事件的记录(功能编码为0B,十六进制)作响应从机不需要任何附加信息,
作要求。

●错误校验域
在标准的Modbus网络中,有两种错误校验方法可以采用。

错误校验域的内容与使用的校验方法有关
●ASCII。

使用ASCII方式定义字符的帧结构时,校验区包括了两个ASCII字符。

校验字符是采用纵向冗余校验(LRC)计算的结果。

它总是以“colon”开头,以“CRLF”字符终止。

LRC校验字符附加于信息的最后一段,位于CRLF之前。

●RTU
使用RTU方式定义字符的帧结构时,错误校验域包含一个16位数当作两个8位字节执行,错误校验值是根据传送信息的内容,利用循环冗余校验CRC计算的结果。

CRC域位于信息的最后,当CRC生成之后,低字节在前,高字节在后,在发送信息时,最后传输CRC的高字节。

关于错误校验的附加信息,参见随后的附录内容。

●字符的串行传输
在标准的Modbus网络上串行传输信息时字符或字节都按一定的顺序发送(从左到右):最低标志位(LSB)-最高标志位(MSB)
●RTU方式字符的位顺序是:
●错误校验方法
标准的Modbus串行网络中使用了两种错误校验方法:奇偶校验和CRC校验。

奇偶校验(奇或偶)是可选择的字符校验方式,CRC校验应用于正条信息。

字符校验和帧校验都由主机发出,信息传输之前就已被首先校验,从机在接收期间对每个字符和整条信息进行再次检查。

主机退出协议之前,将按照用户预先设定的时间进行延时等待,这个时间间隔,要保证每台从机都能够做出正确的响应。

如果从机发现传输错误,信息将不被执行,从机也不对主机做出响应。

这样设定的时间就会超出,主机程序会加以处理。

请注意,如果向并不存在的从机发出信息时也会产生超时,对于ACS140/ACS400适当的超时设定值应大于100ms。

●奇偶校验
用户可以根据自己的需要将控制器设定为起;奇校验或偶校验,或无奇偶校验。

这将影响每个字符的奇偶位设置。

奇偶校验时将对字符中逻辑1位的个数进行累加(RTU,8位)。

根据累加值的奇偶性,设置校验位为1或0。

例如,在RTU字符中包括以下8个数据位:
1100 0101
其中逻辑1的个数为4。

如果采用偶校验,逻辑1的数量累加的最后仍是偶数(4个)。

如果采用奇校验,累加的最后仍是一个奇数(5个)。

数据传输时奇偶位经过计算放在每个字符框架中。

接收设备也要计算逻辑1的数量,如
用相同的奇偶性校验。

●请注意,只有当字符增加或减少的位数是奇数时,错误才可能被奇偶校验发现。

例如,采用奇校验时,某个字符中原来的三个逻辑1多了2个(偶数),累加的结果仍为奇数(无法发现错误)。

如果不使用奇偶校验,就无奇偶位传输,也不进行奇偶检查。

字符框架中空出的位置由停止位填充。

●Modbus功能格式
本章详细说明了ACS140/ACS400变频器支持的所有Modbus信息的数据内容。

如何表达数字值
除非另有说明,正文的数字(诸如地址、编码或者数据)都以十进制的形式表达,信息域中则以十六进制表达。

●Modbus信息的数据地址
Modbus信息的数据地址都以0为参考。

第一个发出的数据项从0开始,例如:可编程控制器中已知为1的“线圈”,在Modbus信息中被编址为“线圈”0000。

“线圈”127(十进制)的地址为007E(十六进制,十进制是126)
保持寄存器40001在信息中被编址为寄存器0000。

功能区的编码已经确定
这是一个针对“保持寄存器”的操作,所以“4××××”的参考点也是固
定的。

保持寄存器40108的地址是006B(十六进制,十进制是107)。

●Modbus信息的域内容
图3是一个Modbus主机查询的例子,以RTU方式传输。

图4是一个从机正常响应的例子,也以 RTU方式传输。

两个例子都以十六进制显示信息域的内容,同时也可以看到RTU模式信息的帧结构。

主机查查询地址为06的从机保持寄存器,寄存地址为40108至40110。

请注意,信息中规定起始寄存器的地址为0107(十进制,十六进制为006B)。

从机以功能编码响应,表明这是一种正常的响应。

“字节计数”域表示将返回多少个8位数据项。

在RTU模式中表示有多少个8位字节。

例如,十六进制数63(01100011),在RTU模式中作为一个8位字节发送。

不论采用哪种字符方式(ASCII或RTU),“字节计数”域都把它计数为1个8位字节。

如何使用字节计数域:当你在缓冲区中生成响应时,可以使用“字节计数”,它等于信息中的8位字节数据数。

该值只包括字节计数域的内容,而不包括所有其它域的内容。

图4示意了在RTU模式中,如何在响应中使用字节计数域。

图3 RTU主机查询
图4 RTU从机响应
●功能编码
ACS140/ACS400变频器支持三种Modbus功能编码,这些编码允许主机对传动进行16位整数的读写操作。

03 读保持寄存器
读从机中保持寄存器(4××××)的内容,不支持广播信息。

●查询
查询信息规定了起始寄存器地址和将要读多少寄存器。

寄存器的地址从0开始;寄存器1-16的地址为0-15。

下面一个例子中,读11号从机的40108-40110寄存器:
图5 读保持寄存器-查询
●响应
信息响应时的寄存器数据包含在两个字节中,第一个字节包含高位地;第二个字节包含低位。

对于984-×8×控制器(984-685等),从机以每次125个寄存器的速率进行数据扫描,其它控制器以每次32个的速率扫描。

数据采集完成后,响应返回。

以下是对前一查询进行响应的例子:
图6读保持寄存器-响应
寄存器80108按两个字节显示的数值为02 0B(十六进制),或555(十进制)。

寄存器40109-40110的内容是00 00和00 64(十六进制),或0和100(十进制)。

06预置单个寄存器
预置单个保持寄存器(4××××)为某个值。

广播时,所有从机的响应寄存器都将被设置成相同值。

●查询
查询确定预置哪个寄存器。

寄存器的地址从0开始:寄存器1的地址为0。

预置值在查询的数据域中给出。

ACS140/ACS400变频器使用16位值。

图7 预置单寄存器-查询
响应
正常的响应是在寄存器的内容预置之后,是对查询的回应。

图8 预置单寄存器-响应
16(10 Hex)预置多个寄存器
预置一组连续的寄存器(4××××)为某个值。

当广播信息时,所有从机的相应寄存器都将被设置成相同值。

利用这种功能,ACS140/ACS400的一个或多个寄存器可以被同时预置。

只有当寄存器处于同一组时,才允许同时写入。

如果其中的一个寄存器写入失败,ACS140/ACS400变频器会继续向其它寄存器进行,但在响应中包含一条有关的例外情况代码。

●查询
查询信息确定了预置哪些寄存器。

寄存器地址从0开始:寄存器1的地址为0。

预置值由查询的数据域给出。

ACS140/ACS400的预置值是16位,每个寄存器存放两个字节的数据。

下面的一个例子中将11号从机由40002开始的寄存器设为00 0A:
●响应
正常的响应将包括从机的地址、功能编码、起始地址和预置寄存器的数量。

●例外情况响应
除了广播信息,主机对于自己发给从机的每个查询都期望得到正常的响应。

对于主机的查询,可能发生下面四种情况中的一种:
1 如果从机正常接收查询,无通讯错误出现,处理查询顺利,它将返回一个正常的响应。

2 如果因为通讯错误没有接收到查询,从机将不返回任何响应,主机程序将最终对查询作超时处理。

3如果从机接收到了查询,但发现有通讯错误(奇偶校验,LRC 或CRC ),它也不返回任何响应,主机程序将最终对查询作超时处理。

4 如果从机接收了查询,没有通讯错误,但是无法执行(例如,去读一个不存在的线圈或寄存器),从机返回例外情况响应,告知主机错误的性质。

例外情况响应另有两个域,以区别于正常的响应。

功能编码域:正常响应时,从机以原来查询的功能编码应答。

功能编码的最高标志位(MSB )一般都为0(它们的值都低于十六进制的80)。

在例外情况时,从机将功能编码的MSB 设为1。

这使得在例外情况响应时高出80(十六进制)。

随着功能编码MSB 的设定,主机的应用程序就能识别例外情况响应,并将同时检查例外情况的数据域内容。

图9 预置多个寄存器-查询 图10 预置多个寄存器-响应
信息)。

例外情况响应时,从机在数据域中返回一个例外情况代码。

它说明了从机是如何产生例外情况的。

图11是从机以例外情况响应主机查询的一个例子。

图11 主机查询和从机例外情况响应
在本例中,主机想10(0A)号从机提出查询。

功能代码(01)的意思是阅读线圈的状态。

线圈地址为1245(04A1)。

请注意,示例中只要求读这一个线圈的状态,所以线圈数的设定值为0001。

如果线圈地址在从机中不存在,从机将返回例外情况响应,例外情况代码为02,说明这个地址是不合法的。

例如,如果从机只有512个线圈的984-385,将返回这个代码。

Modicon例外情况代码列于表1。

●CRC生成
CRC域包括一个16位的二进制数,占两个字节。

CRC值由发送设备首先计算,附在传送信息中。

接收设备在接收时将从新计算CRC,并且把计算值与接收的CRC实际值作比较。

如果两个值不相等,就说明有错误发生。

CRC开始时,将一个16位寄存器的所有位都置1,然后将信息的其中一个8位字节赋给寄存器的8位。

每个字符中只有8位数据用于CRC生成。

开始位、停止位以及奇偶校验位不参与CRC计算。

CRC生成时,每个8位字符都与CRC寄存器进行异或计算,将计算结果向最低位(LSB)方向移动,空出的最高位(MSB)由0补齐。

提取和检查LSB,如果LSB是1,寄存器就与一个预置的固定值进行异或计算;如果是0,就不进行任何计算。

异或计算以同样的方式重复8个移位。

完成所有字节的计算和移位之后的寄存器内容,就是该信息的CRC值。

●产生CRC的过程是:
1. 将一个16位寄存器的值置为FFFF(十六进制),所有位都置为1,称之为CRC寄存器。

2. 将信息的第一个8位与CRC寄存器进行异或计算,结果放入CRC寄存器。

3. 如果CRC寄存器的最低位(LSB)是1:
把CRC寄存器右移一位,再与0×XA001进行异或操作。

如果CRC寄存器的最低位(LSB)是0:
把CRC寄存器右移一位。

4. 重复步骤3,直至完成8个移位。

此过程完成后,第一个完整的8位字节就
处理完成。

5.重复步骤2至4,处理信息的下一个8位字节。

连续地重复以上过程,直到所有的
字节都处理完毕。

6.CRC寄存器中的最后内容就是信息的CRC值。

将CRC防置在信息中
16位CRC值(两个8位字节)在信息中传送时,首先传送低位字节,然后是高位字节。

例如CRC的值为1241(0001 0010 0100 0001)
图12 CRC字节顺序
例子
下面是用C语言生成CRC的例子。

所有可能的CRC值都预先存入两个数组中,在数据缓冲区以增量的方式进行简单索引。

一个数组包括CRC高位字节的256个所有可能值,另一个包括低位字节的可能值。

与通过计算信息字符获得CRC值的方法相比较,CRC 查表索引法的执行速度更快。

函数使用两个变量:
Unsigned char *puchmsg
生成CRC使用的,二进制数据信息缓冲区的指针。

Unsigned short usDatalen
在信息缓冲区内的字节数量。

函数返回的CRC为Unsigned short 型数据。

11。

相关文档
最新文档