收藏 分销(赏)

Modbus协议样本.doc

上传人:快乐****生活 文档编号:3359034 上传时间:2024-07-03 格式:DOC 页数:48 大小:516.04KB 下载积分:12 金币
下载 相关 举报
Modbus协议样本.doc_第1页
第1页 / 共48页
Modbus协议样本.doc_第2页
第2页 / 共48页


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

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 合同范本

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服