1、大庆石油学院应用技术学院毕业论文 摘要 工业控制已从单机控制走向集中监控、集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便。Modbus就是工业控制器的网络协议中的一种.Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信.它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域
2、格局和内容的公共格式。 当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动.如果需要回应,控制器将生成反馈信息并用Modbus协议发出.在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构.这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法. Modbus通信协议作为所有Mdicon 可编程控制器普遍采用的工业通信协议,具有标准开放、价格低廉的优点.目前,该协议已经作为现场总线 的一种,成为智能仪表、总线控制等领域事实上的行业标准之一. 关键词:Modbus协议;串行通信;LRC校验;
3、CRC校验 目录 摘要1 第1章概论3 第2章 Modbus协议的两种传输模式7 2.1.1 ASCII 模式7 2。2。1 ASCII帧8 2.2。2 RTU帧8 第3章 ModBus协议的消息帧14 3.1 ASCII模式的帧14 3。2 RTU模式的消息帧14 3。3 地址域15 3。5 数据域16 3.6 错误检测域17 3.7 字符的连续传输17 第4章错误检测方法18 4.1 奇偶校验19 4.2 LRC检测19 5。1 LRC纵向冗余校验21 5。1.1把LRC
4、放入信息中22 5.2 CRC 循环冗余校验23 5。2。1 把CRC值放入信息中23 5.2。2 CRC生成24 5.2.4 字节表24 参考文献32 致谢32 第1章 概论 Modbus 协议是应用于电子控制器上的一种通用语言。它是Modicon公司于1978年发明的一种用于电子控制器进行控制和通讯的通讯协议。通过此协议,控制器之间、控制器经由网络(例如以太网)和其它设备之间可以通信。在进入网络时代的今天,工业控制器连网也为网络管理提供了方便.它的开放性、可扩充性和标准化使它成为一个通用工业标准.有了它,不同厂商生产的控制设备可以简单可靠地连成工业网络,
5、进行系统的集中监控,从而使它成为最流行的协议之一。 ModBus可以应用在支持ModBus协议的PLC和PLC之间、PLC和个人计算机之间、计算机和计算机之间、Modbus可编程控制器之间可相互通讯,也可与不同网络上的其他设备进行通讯,支撑网络有Modicon的Modbus和Modbus+工业网络。网络信息存取可由控制器内置的端口,网络适配器以及Modicon提供的模块选件和网关等设备实现,对OEM(机械设备制造商)来说,Modicon可为合作伙伴提供现有的程序,可使Modbus+网络紧密地集成到他们的产品设计中去。 Modicon的各种控制器使用的公共语言被称为 Modbus协议,该
6、协议定义了控制器能识别和使用的信息结构。当在Modbus网络上进行通讯时,协议能使每一台控制器知道它本身的设备地址,并识别对它寻址的数据,决定应起作用的类型,取出包含在信息中的数据和资料等,控制器也可组织回答信息,并使用Modbus协议将此信息传送出去。 在其他网络上使用时,数据包和数据帧中也包含着Modbus协议。如,Modbus+或MAP网络控制器中有相应的应用程序库和驱动程序,实现嵌入式Modbus协议信息与此网络中用子节点设备间通讯的特殊信息帧的数据转换。 该转换也可扩展,处理节点地址,路由,和每一个特殊网络的错误检查方法。如包含在Modbus协议中的设备地址,在信息发送前就转换成
7、节点地址,错误检查区也用于数据包,与每个网络的协议一致,最后一点是需用Modbus协议,写入嵌入的信息,定义应处理的动作。 图1说明了采用不同通讯技术的多层网络中设备的互连方法。在信息交换中,嵌入到每个网络数据包中的Modbus协议,提供了设备间能够交换数据的公共的语言. 4个Modus设备或网络 编程器 编程器 图1:Modbus协议应用示意图 Modbus上的数据传输 Modicon控制器上的标准Modbus端口是使用一个RS-232兼容的串行接口,定义了连接器,接线电缆,信号等级,传输波特率,和奇偶校验,控制器可直接或通过调制解调器(以后简称Modems)接入总线(网
8、络).控制器通讯使用主从技术,即主机能起动数据传输,称查询。而其它设备(从机)应返回对查询作出的响应,或处理查询所要求的动作。典应的主机设备应包括主处理器和编程器。典应的从机包括可编程控制器。主机可对各从机寻址,发出广播信息,从机返回信息作为对查询的响应。从机对于主机的广播查询,无响应返回Modbus协议报据设备地址,请求功能代码,发送数据,错误校验码,建立了主机查询格式,从机的响应信息也用Modbus协议组织,它包括确认动作的代码,返回数据和错误校验码。若在接收信息时出现一个错误或从机不能执行要求的动作时,从机会组织一个错误信息。并向主机发送作为响应。在其它总线上传输数据。除标准的Modbu
9、s功能外,有些Modcon控制器内置端口或总线适配器,在Modbus+总线上实现通讯或使用网络适配器,在MAP网络上通讯。在这些总线上,控制器间采用对等的技术进行通讯,即任意一个控制器可向其它控制器启动数据传送.因此,一台控制器既可作为从机,也可作为主机,常提供多重的内部通道,允许并列处理主机和从机传输数据,在信息级,尽管网络通讯方法是对等的,但Modbus协议仍采用主从方式,若一台控制器作为主机设备发送一个信息,则可从一台从机设备返回一个响应,类似,当一台控制器接受信息时,它就组织一个从机设备的响应信息,并返回至原发送信息的控制器. 8 位 数据字节 8 位 数据字节 错误校验
10、功能代码 设备地址 功能代码 设备地址 主机查询信息 查询响应周期: 错误校验 从机响应信息 图2:主从查询响应周期 查询中的功能代码为被寻址的从机设备应执行的动作类型。数据字节中包含从机须执行功能的各附加信息,如功能代码03将查询从机,并读保持寄存器.并用寄存器的内容作响应。该数据区必须含有告之从机读取寄存器的起始地址及数量,错误校验区的一些信息,为从机提供一种校验方法,以保证信息内容的完整性。 从机正常响应时,响应功能码是查询功能码的应答,数据字节包含从机采集的数据,如寄存器值或状态。如出现错误,则修改功能码,指明为错误响应。并在数据字节中含有一个代码,来说明错误,错误
11、检查区允许主机确认有效的信息内容。 第2章 Modbus协议的两种传输模式 2。1ASCII与RTU模式 控制器可使用ASCII或RTU通讯模式,在标准Modbus上通讯.在配置每台控制器时,用户须选择通讯模式以及串行口的通讯参数。(波特率,奇偶校验等),在Modbus总线上的所有设备应具有相同的通讯模式和串行通讯参数. 选择ASCII或RTU模式用于标准的Modbus总线。它定义了总线上串行传输信息区的“位”的含义,决定信息打包及解码方法。 如在MAP和Modbus+总线上时,Modbus信息以帧的方式出现,并与串行传输无关,如请求读保持寄存器可以在Modbus+上的两个控制器之
12、间处理,而与使用的控制器的Modbus端口无关. 2。1.1 ASCII 模式 当控制器以ASCII模式在Modbus总线上进行通讯时,一个信息中的每8位字节作为2个ASCII字符传输的,这种模式的主要优点是允许字符之间的时间间隔长达IS,也不会出现错误。 ASCII码每一个字节的格式: 编码系统:16进制,ASCII字符0—9,A—F 数据位: 1起始位7位数据,低位先送 奇/偶校验时1位;无奇偶校验时0位 (LRC)1位带校验1停止位;无校验2止位 错误校验区: 纵向冗余校验 2。1.2 ASCII RTU模式 控制器
13、以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,该模式的主要优点是在相同波特率下其传输的字符的密度高于ASCII模式,每个信息必须连续传输. RTU模式中每个字节的格式: 编码系统:8位二进制,十六进制0—9,A-F 数据位: 1起始位8位数据,低位先送 奇/偶校验时1位;无奇偶校验时0位 停止位1位(带校验);停止位2位(无校验) 带校验时1位停止位;无校验时2位停止位 错误校验区:循环冗余校验(CRC) 2.2 Modbus信息帧 何论是ASCII模式还是RTU模式,Modbus信息以帧的方式传输,每帧有确定的起始点和结束点,使
14、接收设备在信息的起点开始读地址,并确定要寻址的设备 (广播时对全部设备),以及信息传输的结束时间。可检测部分信息,错误可作为一种结果设定. 对MAP或Modbus+协议可对信息帧的起始和结束点标记进行处理,也可管理发送至目的地的信息,此时,信息传输中Modbus数据帧内的目的地址已无关紧要,因为Modbus+地址已由发送者或它的网络适配器把它转换成网络节点地址和路由。 2.2.1 ASCII帧 在ASCII模式中,以(:)号(ASCII3AH)表示信息开始,以回撤一换行键(CRLF) (ASCII OD和OAH)表示信息结束。 对其它的区,允许发送的字符为16进制字符0—9,A—F。网
15、络中设备连续检测并接收一个冒号(:)时,每台设备对地址区解码,找出要寻址的设备。 字符之间的最大间隔为1S,若大于1S,则接收设备认为出现了一个错误。 典型的信息帧见下表 开始 地址 功能 数据 纵向冗余检查 结束 1字符 : 2字符 2字符 n字符 2字符 2字符 图3ASCII信息帧 例外:对于584和984A/B/X控制器,一个ASCII信息可在LRC区后正常终止,而不需发送CRLF字符,此时出现>IS的时间间隔,控制器也将认为是正常中断。 2。2.2RTU帧 RTU模式中,信息开始至少需要有3。5个字符的静止时间,依据使用的波特率,很容易计算这个静止的
16、时间(如下图中的T1-T2—T3-T4).接着,第一个区的数据为设备地址。 各个区允许发送的字符均为16进制的0-9,A—F. 网络上的设备连续监测网络上的信息,包括静止时间.当接收第一个地址数据时,每台设备立即对它解码,以决定是否是自己的地址。发送完最后一个字符号后,也有一个3。5个字符的静止时间,然后才能发送一个新的信息. 整个信息必须连续发送.如果在发送帧信息期间,出现大于1.5个字符的静止时间时,则接收设备刷新不完整的信息,并假设下一个地址数据。 同样一个信息后,立即发送的一个新信息,(若无3.5个字符的静止时间)这将会产生一个错误。是因为合并信息的CRC校验码无效而产生的错误
17、 开始 地址 功能 数据 校验 终止 T1—T2-T3-T4 8 B位S 8 B位S N×8 B位S 16B位 S T1-T2-T3T-4 图4RTU信息帧 2。3 Modbus信息帧设置 2.3。1地址设置 信息地址包括2个字符(ASCII)或8位(RTU),有效的从机设备地址范围0-247,(十进制),各从机设备的寻址范围为1—247。主机把从机地址放入信息帧的地址区,并向从机寻址.从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址. 地址0为于广播地址,所有从机均能识别。当Modbus协议用于高级网络时,则不允许广播或其它方式
18、替代。如Modbus+使用令牌循环,自动更新共享的数据库。2。3.2功能码设置 信息帧功能代码包括字符(ASCII)或8位(RTU).有效码范围1-225(十进制),其中有些代码适用全部型号的Modicon控制器,而有些代码仅适用于某些型号的控制器.还有一些代码留作将来使用,有关功能代替码的设置将在第2章说明。 当主机向从句发送信息时,功能代码向从机说明应执行的动作。如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等.当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,
19、从句简单返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1"。 如,主机要求从机读一组保持寄存器时,则发送信息的功能码为: 0000 0011 (十六进制03) 若从机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。发现错时,则返回一个不正常响信息: 1000 0011(十六进制83) 从机对功能代码作为了修改,此外,还把一个特殊码放入响应信息的数据区中,告诉主机出现的错误类型和不正常响应的原因.主机设备的应用程序负责处理不正常响应,典型处理过程是主机把对信息的测试和诊断送给从机,并通知操作者。 数据区的内容 数据区有2个16进制的
20、数据位,数据范围为00-FF(16进制),根据网络串行传输的方式,数据区可由一对ASCII字符组成或由一个RTU 字符组成. 主机向从机设备发送的信息数据中包含了从机执行主机功能代码中规定的请求动作,如离散量寄存器地址,处理对象的数目,以及实际的数据字节数等。 举例说明,若主机请求从机读一组寄存器(功能代码03),该数据规定了寄存器的起始地址,以及寄存器的数量.又如,主机要在一从机中写一组寄存器,(则功能代码为10H)。该数据区规定了要写入寄存区的起始地址,寄存器的数量,数据的字节数,以及要写入到寄存器的数据。 若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有
21、一个不正常代码,使主机能判断并作出下一步的动作。 数据区的长度可为“零”以表示某类信息,如,主机要求—从机响应它的通讯事件记录(功能代码OBH).此时,从机不需要其他附加的信息,功能代码只规定了该动作。2.3。3串行传送信息 在标准的Modbus上传送的信息中,每个字符或字节,按由左向右的次序传送: 最低有效位:(LSB)最高有效位:(MSB) ASCII数据帧位序: 带奇偶校验 无奇偶校验 图5ASCII位序2.3。4错误校验方法 标准的Modbus串行通讯网络采用两种错误校验方法,奇偶校验(奇或偶)可用于校验每一个字符,信息帧校验(LRC或CRC)适用
22、整个信息的校验,字符校验和信息帧校验均由主机设备产生,并在传送前加到信息中去。从机设备在接收信息过程中校验每个字符和整个信息。 主机可由用户设置的一个预定时间间隔,确定是否放弃传送信息。该间隔应有足够的时间来满足从机的正常响应。若主机检测到传输错误时,则传输的信息无效。从机不再向主机返回响应信息.此时,主机会产生一个超时信息,并允许主机程序处理该错误信号。注意:主机向实际并未存在的从机发送信息时也会引起超时出错信号。 在MAP或Modbus+等其它网骆上使用时,采用比Modbus更高一级的数据帧校验方法。在这些网络中,不再运用Modbus中的LRC或CRC校验方法。当出现发送错误时,网络中
23、的通讯协议通知发送设备有错误出现,并允许根据设置的情况,重试或放弃信息发送。若信息已发送,但从机设备未作响应,则主机通过程序检查后发出一个超时错误. a. 奇偶校验 用户可设置奇偶校验或无校验,以此决定每个字符发送时的奇偶校验位的状态。何论是奇或偶校验,它均会计算每个字符数据中值为“1"的位数,ASCII方式为位数据;RTU方式为8位数据。并根据“1”的位数值(奇数或偶数)来设定为“0”或“1” 如一个RTU数据帧中8位数据位为: 1100 0101 在该帧中,值为“1”的总位数为4,即偶数。如采用奇校验方式时,则 “1”的总位数为奇数,即5。 发送信息时,计算奇偶位,并加到数据帧中
24、接收设备统计位值为“1"的数量,若与该设备要求的不一致时产生一个错误。在Modbus总线上的所有设备必须采用相同的奇偶校验方式。 注意:奇偶校验只能检测到数据帧在传输过程中丢失奇数“位”时才产生的错误。如采用奇数校验方式时,一个包含3个“1”位的数据丢失2个“1"位时,其结果仍然是奇数。若无奇偶校验方式时,传输中不作实际的校验,应附加一个停止位。 b。 LRC校验 ASCII方式时,数据中包含错误校验码,采用LRC校验方法时,LRC校验信息以冒号“:”开始,以CRLF字符作为结束。它忽略了单个字符数据的奇偶校验的方法。 LRC校验码为1个字节,8位二进制值,由发送设备计算LRC值。接
25、收设备在接收信息时计算LRC校验码。并与收到的LRC的实际值进行比较,若二者不一致,亦产生一个错误。 在梯形图中,CKSM函数可计算数据信息中LRC的校验.用于主计算机时请查阅附录C中的一个实例,它详细说明LRC的校验的过程。 错误校验方法 c。 CRC校验 RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。它忽略信息中单个字符数据的奇偶校验方法. CRC码为2个字节,16位的二进制值。由发送设备计算CRC值,并把它附到信息中去。接收设备在接收信息过程中再次计算CRC值并与CRC的实际值进行比较,若二者不一致,亦产生一个错误,校验开始时,把16位寄存器的各位都置为“1
26、然后把信息中的相邻2个8位字节数据放到当前寄存器中处理,只有每个字符的8位数据用于CRC处理.起始位,停止位和校验位不参与CRC计算。 CRC校验时,每个8位数据与该寄存器的内容进行异或运算,然后向最低有效位(LSB)方向移位,用零填入最高有效位(MSB)后,再对LSB检查,若LSB=1,则寄存器与预置的固定值异或,若LSB=0,不作异或运算。 重复上述处理过程,直至移位8次,最后一次(第8次)移位后,下一个8位字节数据与寄存器的当前值异或,再重复上述过程。全部处理完信息中的数据字节后,最终得到的寄存器值为CRC值。 CRC值附加到信息时,低位在先,高位在后。在梯形图中,CKSM函数
27、计算信息中的CRC值。用于主计算机时,可查阅附录C中的一个实例,它详细说明了CRC的校验。 第3章 ModBus协议的消息帧 两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成.部分的消息也能侦测到并且错误能设置为返回结果. 3.1ASCII模式的帧 当控制器设为在ModBus网络上以ASCII模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送
28、这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。 表3—1 信息帧结构: 地址 功能代码 数据数量 数据1 。。. 数据n LRC高字节 LRC低字节 回车 换行。如表3—1所示,使用ASCII模式,消息以冒号(:)字符(ASCII码3AH)作为起始位,以回车换行符(ASCII码0DH, 0AH)作为结束符。传输过程中,网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备就解码下个位的地址域,来判断是否发给自己的。与地址域一致的设备继续接受其它域,直至接受到回车换行符。除起始位和结束符外,其它地址域可以使用的传输字符是十六进制的0…9,A…F,当然也要用
29、ASCII码表示字符. 3。2RTU模式的消息帧 当控制器设为RTU模式时,消息帧中的每个8Bit字节包含两个4Bit的十六进制字符.这种模式与ASCII模式相比在同样的波特率下,可比ASCII模式传送更多的数据。 表3-2 RTU模式的消息帧 地址 功能代码 数据数量 数据1 。。. 数据n CRC高字节 CRC低字节 表3-2 RTU模式的消息帧 该模式下消息发送至少要以3。5个字符时间的停顿间隔开始。传输过程中,网络设备不断侦测网络总线,包括停顿间隔时间内.当第一个域(地址域)接收到,相应的设备就对接下来的传输字符进行解码,一旦有至少3. 5个字符时间的停顿就表示该消
30、息的结束。 在RTU模式中整个消息帧必须作为一连续的流转输,如果在帧完成之前有超过1。5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3。 5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。如果在传输过程中有以上两种情况发生的话,必然会导致CRC校验产生一个错误消息,反馈给发送方设备。 在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。 3。3地址域 消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0.。.247 (十进制)。单个设
31、备的地址范围是1。。。247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应. 地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。 消息帧中的功能代码域包含了两个字符(ASCII)或8Bits(RTU)。可能的代码范围是十进制的1。。.255.当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。 当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如去读取输入的开关状态
32、读一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。 当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码.对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1. 例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码: 0 0 0 0 0 0 1 1 (十六进制03H) 对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回: 1 0 0 0 0 0 1 1 (十六进制83H) 除功能代码因异议错误作了修改外,从设备将一独特的代码放
33、到回应消息的数据域中,这能告诉主设备发生了什么错误。 主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。 3.5数据域 数据域是由两个十六进制数集合构成的,范围00。。.FF。根据网络传输模式,这可以是由一对ASCII字符组成或由一RTU字符组成。 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。 例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一组从设备的寄
34、存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。 如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。 在某种消息中数据域可以是不存在的(0长度).例如,主设备要求从设备回应通信事件记录(功能代码0B十六进制),从设备不需任何附加的信息。 3.6错误检测域 标准的Modbus网络有两种错误检测方法。错误检测域的内容视所选的检测方法而定。 ASCII检测方法: 当选用ASCII模式作字符帧,错误检测域包含两个ASCII字符。这是使用
35、LRC(纵向冗长检测)方法对消息内容计算得出的,不包括开始的冒号符及回车换行符。LRC字符附加在回车换行符前面。 RTU检测方法: 当选用RTU模式作字符帧,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的.CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。 3.7字符的连续传输 当消息在标准的Modbus系列网络传输时,每个字符或字节以如下方式发送(从左到右): 最低有效位。.。最高有效位 使用ASCII字符帧时,位的序列是: 有奇偶校验 启始位 1 2 3
36、4 5 6 7 奇偶位 停止位 无奇偶校验 启始位 1 2 3 4 5 6 7 停止位 停止位 使用RTU字符帧时,位的序列是: 有奇偶校验 启始位 1 2 3 4 5 6 7 8 奇偶位 停止位 无奇偶校验 启始位 1 2 3 4 5 6 7 8 停止位 停止位 第4章 错误检测方法 标准的Modbus串行网络采用两种错误检测方法.奇偶校验对每个字符都可用,帧检测(LRC或CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。 用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作
37、为正常反应。如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应.这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时. 4.1 奇偶校验 用户可以配置控制器是奇或偶校验,或无校验.这将决定了每个字符中的奇偶校验位是如何设置的。 如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位: 1 1 0 0 0 1 0 1 整个“1”的数目是4个。如果便用了偶校验,帧的奇偶校验位将是0,便得整个“1”的个数仍是4个。如果便用了奇校验,帧的奇偶校验位将是1,便得整个
38、1”的个数是5个。 如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。 4.2 LRC检测 LRC错误校验用于ASCII模式。这个错误校验是一个8位二进制数,可作为2个ASCII十六进制字节传送。把十六进制字符转换成二进制,加上无循环进位的二进制字符和二进制补码结果生成LRC错误校验(参见图)。这个LRC在接收设备进行核验,并与被传送的LRC进行比较,冒号(:)、回车符号(CR)、换行字符(LF)和置入他任何非ASCII十六进制字符在运算时忽略不计. 使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了L
39、RC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。 LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。 4。3 CRC检测 使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。 CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中.接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。 CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消
40、息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。 生成CRC-16校验字节的步骤如下: ①装如一个16位寄存器,所有数位均为1。 ②该16位寄存器的高位字节与开始8位字节进行“异或"运算。运算结果放入这个16位寄存器。 ③把这个16寄存器向右移一位。 ④若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算;若向右移出的数位是0,则返回③。 ⑤重复③和④,直至移出8位。 ⑥另外8位与该十六位寄存器进行“异或"运算。 ⑦重复③~⑥,直至该报文
41、所有字节均与16位寄存器进行“异或”运算,并移位8次. ⑧这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。 另外,在某些非ModBus通信协议中也经常使用CRC16作为校验手段,而且产生了一些CRC16的变种,他们是使用CRC16多项式X↑16+X↑15+X↑2+1,单首次装入的16位寄存器为0000;使用CRC16的反序X↑16+X↑14+X↑1+1,首次装入寄存器值为0000或FFFFH。 CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一
42、下,如果LSB为0,则不进行.整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。 CRC添加到消息中时,低字节先加入,然后高字节。 ASCII可打印字符便于故障检测,而且对于用高级语言(如Fortan)编程的主计算机及主PC很适宜.RTU则适用于机器语言编程的计算机和PC主机。 用RTU模式传输的数据是8位二进制字符.如欲转换为ASCII模式,则每个RTU字符首先应分为高位和低位两部分,这两部分各含4位,然后转换成十六进制等量值。用以构成报文的ASCII字符都是十六进制字符。ASCI
43、I模式使用的字符虽是RTU模式的两倍,但ASCII数据的译玛和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器. 第5章 modbus协议校验码生成 5。1 LRC纵向冗余校验 纵向冗余校验区为1个字节,8位二进制数据,由发送设备计算LRC值,并把计算值附到信息中。接收设备在接收信息时,重新计算LRC值,并把计算值与LRC区中接收的实际值进行比较,若两者不相同,则产生一个错误。信息中的相邻2个8位字节相加,丢弃进位,然后进行二进制补码,运算计
44、算出LRC值.LRC是一个8位数据区,因此每加一个新字符,会产生大于十进制255的数值而谥出,因为没有第9位,自动放弃进位。 产生LRC的过程:相加信息中的全部字节,包括起始“:”号和结束符CRLF.并把结果送入8位数据区,放弃进位。由FFH减去最终的数据值,产生的补码。加“1”产生二进制补码。 5。1.1把LRC放入信息中 发送8位LRC(2个ASCII字符)时,先送高位字符,后送低位字符,如:LRC值为61H(0110 0001): Colon Addr Func Data Count Data Data Data Data LRC Hi LRC Lo CR
45、 6 1 表 6.1 LRC字符顺序 例:用一个C语言功能码产生LRC值。该功能码用2个自变量: unsigned char *auchMsg ;生成LRC值,把指针指向含有二进制数据的缓冲器 unsigned short usDataLen ; 缓冲器中的字节数。 该功能返回LRC作为一种类型“unsigned char”. 5.1。2LRC产生的功能static unsigned char LRC(auchMsg, usDataLen) unsigned char *auchMsg ; /*按信息的字节计算LRC*/ unsigned shor
46、t usDataLen ; /*按信息的字节计算LRC*/ { unsigned char uchLRC = 0 ; /*初始化LRC字符 */ while (usDataLen––) /*通过数据缓冲器*/ uchLRC += *auchMsg++ ; /*加缓冲器字节无进位*/ return ((unsigned char)(–((char)uchLRC))) ; /*返回二进制补码*/ } 5.2CRC 循环冗余校验 循环冗余校验CRC区为2字节,含一个16位二进制数据.由发送设备计算CRC值,并把计算值附在信息中,接收设备在接收信息时,重新计算CRC值,并把计算值与接收
47、的在CRC区中实际值进行比较,若两者不相同,则产生一个错误。 CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。 产生CRC期间,每8位数据与寄存器中值进行异或运算,其结果向右移一位(向LSB方向),并用“0”填入MSB,检测LSB,若LSB为“1”则与预置的固定值异或,若LSB为“0”则不作异或运算。 重复上述处过程,直至移位8次,完成第8次移位后,下一个8位数据,与该寄存器的当前值异或,在所有信息处理完后,寄存器中的最终值为CRC值。 产生CRC的过程: 1.
48、把16位CRC寄存器置成FFFFH. 2. 第一个8位数据与CRC寄存器低8位进行异或运算,把结果放入CRC寄存器。 3. CRC寄存器向右移一位,MSB填零,检查LSB。 4. (若LSB为0):重复3,再右移一位。 (若LSB为1):CRC寄存器与Aool H 进行异或运算 5. 重复3和4直至完成8次移位,完成8位字节的处理. 6. 重复2至5步,处理下一个8位数据,直至全部字节处理完毕。 7. CRC寄存器的最终值为CRC值。 8. 把CRC值放入信息时,高8位和低8位应分开放置。 5。2。1把CRC值放入信息中 发送信息中的16 位CRC值时,先送低8位,后送
49、高8位。 若CRC值为1241(0001 0010 0100 0001): Addr Func Data Count Data Data Data Data CRCLo CRCHi 41 12 表6。2 CRC字节顺序 各种可能的CRC值,按两列装入,一列在16 位CRC的高8位区,为(0—256的)CRC值另一类为低8位区,为CRC的低位值。用这种方法得到的CRC其执行速度快于计算缓冲器中每个新字符得到一个新CRC值的方法. 注意:该功能内部交换CRC中的高/低字节,返回的CRC值中,其字节已交换.因此,由功能码返回的CRC值,能直接
50、放在信息中传送. 5。2.2CRC生成 例:功能取2个自变量: unsigned char *puchMsg ; 为生成CRC值,把指针指向含有二进制 的数据的缓冲器 unsigned short usDataLen ; 缓冲器中的字节数. 该功能返回CRC作为一种类型“unsigned short". 5。2.3CRC产生的功能unsigned short CRC16(puchMsg, usDataLen) unsigned char *puchMsg ; /*按信息的字节数计算CRC */ unsigned short usDataLen ; /* quantity of b






