Modbus通讯协议论文.doc_第1页
Modbus通讯协议论文.doc_第2页
Modbus通讯协议论文.doc_第3页
Modbus通讯协议论文.doc_第4页
Modbus通讯协议论文.doc_第5页
免费预览已结束,剩余25页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

东北石油大学秦皇岛分校专科生毕业设计(论文)摘要Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。Modbus协议如今是应用于电子控制器上的一种通用语言,当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。本文将系统阐述Modbus通讯协议的原理及其在工业系统中的应用,并详细的分解阐述Modbus在个别工业系统上的实例。关键词 Modbus通讯协议;控制器;工业应用27目录摘要I第一章 Modbus协议系统介绍11.1 引言11.2 Modbus的发展历史11.2.1 Modbus的发展历史11.2.2 Modbus的今后发展21.3 关于Modbus协议31.3.1 在Modbus网络上传输31.3.2 在其它类型网络上传输41.3.3 查询回应周期41.4 接口方式41.4.1 RS-232串行接口标准51.4.2 RS-422与RS-485串行接口标准6第二章 Modbus通讯协议的格式102.1 ASCII模式与RTU模式102.1.1 ASCII模式102.1.2 RTU模式102.2 Modbus消息帧102.2.1 ASCII帧102.2.2 RTU帧112.3ASCII协议和RTU协议的比较132.4 错误检测方法142.4.1 奇偶校验142.4.2 LRC检测142.4.3 CRC检测142.5 Modbus RTU支持的功能码17第三章Modbus协议与工业控制系统213.1 基于Modbus协议的电火花控制系统213.1.1 应用背景213.1.2控制系统结构223.2 Modbus协议233.2.1 协议内容233.2.2 通信过程233.2.3 软件实现23第四章 结论26参考文献27致谢28第一章 Modbus协议系统介绍1.1 引言在现代化工业控制中,由于被控对象、测控装置等物理设备的地域分散性,以及控制与监控等任务对实时性的要求,不同设备之间现场交互信息的传递越来越多。但传统的工业系统控制软件存在着一些问题。不具备开放性,各个部分的联系过于紧密,使系统过于复杂。这使系统的更新、扩展和升级变的困难,并且不易修改。由于传统工业带来的不便,造成了大量的“信息孤岛”。但是,对于工控而言,各个站点是不能孤立的,它们必须相互配合、协调才能保证生产的连续正常进行,这就需要个站点能互相通信。然而,子站是采用不同开发平台、不同通讯协议组成的异构系统,可能由不同的厂家和个人开发。要为每种协议写一个转换接口或驱动是比较繁琐的,特别是在站点和协议比较多的时候。因此,怎样有效的集成数据,避免信息孤岛的出现,是工控领域中常遇到的难点问题之一。比较好的方法就是个站点都采用标准协议进行数据通讯,而不必为每一种协议都开发一个通讯接口。目前这方面协议比较多,Modbus就是其中一种。Modbus是一种全开放、免费提供、非常容易理解和实施的协议,从70年代诞生以来,在制造业、电力、水电、冶金、矿业、交通、基础设施等工业领域的数据采集和过程控制得到了广泛应用,形成了一种事实上的工业标准。 1.2 Modbus的发展历史1.2.1 Modbus的发展历史Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分。Modbus是全球第一个真正用于产业现场的总线协议,据不完全统计:截至到2004中,Modbus的节点安装数目已经超过了800万个,而且75%的产品为非施耐德产品,安装的地区遍及世界各地,可见其普及的程度,已经成为了事实上的协议标准。固然已经走过了27个年头,Modbus今天仍然活跃在产业、建筑、基础设施等领域中。Modbus的巨大成功,可以回结到以下3个方面:1标准、开放:用户可以免费、放心地使用Modbus协议,不用交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种,而且在国内也有很多的用户支持和使用Modbus的产品。2Modbus是面向消息的协议,可以支持多种电气接口,如:RS232、RS422、RS485等,还可以在多种介质上传送,如:双绞线、光缆、无线射频等。要说明的是:和很多的现场总线不同,它不用专用的芯片与硬件,完全采用市售的标准部件! 这就保证了采用Modbus的产品造价最为低廉。3Modbus协议的帧格式是最简单、最紧凑的协议,可以说:简单高效,通俗易懂。所以用户使用轻易,厂商开发简单。用户和厂商可以通过wwModbusIDAorg网站和其他网站,下载各种语言的样例程序、控件、以及各种Modbus工具软件,更好地使用Modbus。多年的现场证实:Modbus具有安全可靠的通讯能力。1989年Modicon公司又开发推出了新一代的Modbus网络,以满足用户和市场的需求。Modbus也以Modbus为基础,它采用了令牌传递、对等方式、即插即用的网络结构,为用户提供了更快的产业网络。多年的实践表明:Modbus仍然是最好的产业实时网络之一。1998年施耐德公司又推出了新一代基于TCP/IP以太网的ModbusTCP,目的是满足用户和市场的进一步要求。ModbusTCP是第一家采用TCP/IP以太网用于产业自动化领域的标准协议,是至今唯一获得IANA赋予TCP端口的自动化通讯协议。我们知道:因特网上前1000个端口都分配给著名的、公然的通讯协议,如:80号口分配给了著名的HTTP(超文本传输协议),供因特网浏览器使用。这说明:ModbusTCP是标准的、开放的、免费的通讯协议,这也秉承了施耐德公司的一贯做法,为用户提供了新的选择。ModbusTCP的应用层还是采用Modbus协议,简单高效;传输层使用TCP协议,并使用TCP502号口,用户使用方便,连接可靠;网络层采用IP协议,由于因特网就使用这个协议寻址,故ModbusTCP不但可以在局域网使用,还可以在广域网和因特网上使用。要夸大的一点的是:ModbusTCP全部采用标准的以太网硬件!由于目前一些厂商对标准以太网进行了改进,所以不能使用市售的产品,势必增加了用户本钱,而施耐德向用户承诺:决不使用特殊硬件,确保用户选择的自由度。目前的ModbusTCP以太网的速度为10M/100M位/秒,大大进步了数据传输能力。除此之外,施耐德的以太网解决方案TCP/IP以太网还为用户提供了更多的服务,如:I/O扫描、全局数据、故障设备替换、网络治理、电子邮件报警、时钟同步等功能,为用户带来更多的附加值。 1.2.2 Modbus的今后发展为了更好的普及和推动Modbus在基于以太网上的分布式应用,自前拖耐德公司已将Modbus协议的所有权移交给IDA(Interface for Distributed Automation分布式自动化接口)组织,并成立了ModbusIDA组织,为Modbus今后的发展奠定了基础。 ModbusIDA组织是一个非盈利、独立的、基于web的社团,网址为:www.ModbusIDA.org。ModbusIDA组织的任务是:鼓励自动化设备的独立使用者和制造商,采用Modbus通讯协议,使用分布式自动化架构,为多个市场提供相应的产品。ModbusIDA将提供基础平台,使用户能得到和共享协议、应用和认证信息,终极降低使用的本钱。施耐德公司在Modbus-IDA组织中的角色为:创建M网站作为市场上共享信息的web平台,帮助建立Modbus组织,成为分离的、非盈利的组织,并在开放市场上治理Modbus协议。施耐德公司是ModbusIDA创建成员,极力把两个组织二合为一,目前还是Modbus-IDA组织中的执行成员和积极参与者。ModbusIDA被IEC授予世界领先的电气和服务标准组织“种别D”的联络员身份。ModbusIDA正参与制造和过程自动化环境的数字化通讯方面的定义,目前己提交了基于TCP/IP的Modbus和RTPS(Realtime Publish/Subscribe:实时数据的发布与订阅)协议,作为IEC的PAS(Publicly Available Specification:公共可用规范)。耐德电气(中国)投资有限公司总裁杜华君表示:作为Modbus的发明者和市场的积极推广者,施耐德将不遗余力的推动Modbus在能源、电力、建筑、基础设施和工厂中的应用,并把Modbus内置于全系列产品中。施耐德公司现在已经实现的产品有Web内置的功率设备;产业用计算机;软启动器和变频调速器;可编程控制器;功率表和电路监视器; 断路开关和中压继电器;为用户和开发者使用的产业以太网工具;基于以太网的分布式IO;产业以太网连接设备;产业以太网网关和设备服务器。专家普遍以为:通过施耐德公司、ModbusIDA及其各成员和广大用户的努力,Modbus今后将有更大、更快的发展,为工控和自动化行业做出应有的贡献。1.3 关于Modbus协议Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其他设备之间可以通信。它已经成为工业通用标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其它设备的过程,如何回应来自其他设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。 当在Modbus网络上通信时,此协议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。1.3.1 在Modbus网络上传输 标准的Modbus口是使用RS232C兼容串行接口,它定义了连接口的针脚、电缆、信位号、传输波特率、奇偶校验。控制器能直接或经由Modem组网。控制器通信使用主从技术,即仅设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据做出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、错误检测域。从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据和错误检测域。如果在消息接收过程中发生错误,或从设备不能执行其命令,从设备将建立错误消息并把它作为回应发送出去。1.3.2 在其它类型网络上传输在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。在消息位,Modbus协议仍提供了主从原则,尽管网络通信方法是“对等”。如果以控制器发送消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到消息,它将建立一从设备回应格式并返回给发送的控制器。1.3.3 查询回应周期 图1.1 主从查询回应周期表1 查询查询消息中的功能代码告之被选中的从设备要执行何种功能,数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告知从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息的内容是否正确的方法。2 回应如果从设备产生一种正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。1.4 接口方式RS485、422或RS232接口:异步,半双工。默认数据格式:8位数据位、偶校验、一位停止位,19200bps,RTU。可设置为38400波特率、19200bps、9600bps、4800bps、1200bps;最高可设置波特率位38400bps。数据域:支持2255个字节(ASCII模式)、252字节(RTU模式)GCM系列PLC有两个通信口,其通信口0(也作为编程口)支持Modbus从站,通信口1支持Modbus主站和从站(可有后台软件设置)。1.4.1 RS-232串行接口标准 目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯 图1.2 DB25连接器引脚收、发端的数据信号是相对于信号地,如从DTE设备发出的数据在使用DB25连接器时是2脚相对7脚(信号地)的电平,DB25各引脚定义参见图1.2。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5+15V,负电平在-5-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3+12V与-3-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为37k。所以RS-232适合本地设备之间的通信。其有关电气参数参见表1-1。表1-1 RS-232电气参数 规定RS232RS422R485工作方式单端差分差分节点数1收、1发1发10收1发32收最大传输电缆长度50英尺400英尺400英尺最大传输速率20Kb/S10Mb/s10Mb/s最大驱动输出电压+/-25V-0.25V+6V-7V+12V驱动器输出信号电平(负载最小值)负载+/-5V+/-15V+/-2.0V+/-1.5V驱动器输出信号电平(空载最大值)空载+/-25V+/-6V+/-6V驱动器负载阻抗()3K7K10054摆率(最大值)30V/sN/AN/A接收器输入电压范围+/-15V-10V+10V-7V+12V接收器输入门限+/-3V+/-200mV+/-200mV接收器输入电阻()3K7K4K(最小)12K驱动器共模电压-3V+3V-1V+3V接收器共模电压-7V+7V-7V+12V1.4.2 RS-422与RS-485串行接口标准 1平衡传输 RS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B,如图1.3。 图1.3 RS-422/485信号传输通常情况下,发送驱动器A、B之间的正电平在+2+6V,是一个逻辑状态,负电平在-26V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。 接收器也作与发送端相对的规定,收、发端通过平衡双绞线将AA与BB对应相连,当在收端AB之间有大于+200mV的电平时,输出正逻辑电平,小于-200mV时,输出负逻辑电平。接收器接收平衡线上的电平范围通常在200mV至6V之间。参见图1.4。 图1.4 传输电压范围 2RS-422电气规定 RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。图1.6是典型的RS-422四线接口。实际上还有一根信号地线,共5根线。图1.5是其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS-232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是104k+100(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。图1.5 DB9连接器引脚图图1.6 RS-422四线接口图RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。 RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。 RS-422有关电气参数见表1-1。 3RS-485电气规定 由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,参见图1.7。 而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进, 无论四线还是二线连接方式总线上可多接到32个设备。参见图1.8。 图1.7 RS-485二线制传输图1.8 RS-485四线制传输RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12k剑鳵S-422是4k健;旧峡梢运礡RS-485满足所有RS-422的规范,所以RS-485的驱动器可以用在RS-422网络中。第二章 Modbus通讯协议的格式 控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。2.1 ASCII模式与RTU模式2.1.1 ASCII模式ASCII 模式地址 功能代码 数据数量 数据1 . 数据n LRC高字节 LRC低字节 回车 换行2.1.2 RTU模式 RTU 模式地址 功能代码 数据数量 数据1 . 数据n CRC高字节 CRC低字节 所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。2.2 Modbus消息帧在两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。 2.2.1 ASCII帧ASCII帧使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。其它域可以使用的传输字符是十六进制的0.9,A.F。网络上的设备不断侦测:字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:表2-1 ASCII典型帧 起始位设备地址功能代码数据LRC校验结束符1个字符2个字符2个字符n个字符2个字符2个字符2.2.2 RTU帧RTU帧使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0.9,A.F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。典型的消息帧如下所示:表2-2 RTU典型帧起始位设备地址功能代码数据CRC校验结束符T1-T2-T3-T48Bit8BitN个8Bit16BitT1-T2-T3-T42.2.3 地址域消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0.247 (十进制)。单个设备的地址范围是1.247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。2.2.4 如何处理功能域消息帧中的功能代码域包含了两个字符(ASCII)或8Bits(RTU)。可能的代码范围是十进制的1.255。当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如去读取输入的开关状态,读一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1。例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:0 0 0 0 0 0 1 1 (十六进制03H) 对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回: 1 0 0 0 0 0 1 1 (十六进制83H)除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设备发生了什么错误。主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。2.2.5 数据域数据域是由两个十六进制数集合构成的,范围00.FF。根据网络传输模式,这可以是由一对ASCII字符组成或由一RTU字符组成。 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。 如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。 在某种消息中数据域可以是不存在的(0长度)。例如,主设备要求从设备回应通信事件记录(功能代码0B十六进制),从设备不需任何附加的信息。2.2.6 错误检测域标准的Modbus网络有两种错误检测方法。错误检测域的内容视所选的检测方法而定。 ASCII 当选用ASCII模式作字符帧,错误检测域包含两个ASCII字符。这是使用LRC(纵向冗长检测)方法对消息内容计算得出的,不包括开始的冒号符及回车换行符。LRC字符附加在回车换行符前面。 RTU 当选用RTU模式作字符帧,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。2.2.7 字符的连续传输当消息在标准的Modbus系列网络传输时,每个字符或字节以如下方式发送(从左到右):最低有效位.最高有效位。使用ASCII字符帧时,位的序列是:表2-3 位顺序(ASCII)有奇偶校验 启始位1234567奇偶位停止位无奇偶校验 启始位1234567停止位停止位使用RTU字符帧时,位的序列是:表2-4 位顺序(RTU)有奇偶校验 启始位12345678奇偶位停止位无奇偶校验 启始位12345678停止位停止位2.3 ASCII协议和RTU协议的比较表2-5 SCII协议和RTU协议比较协议开始标记结束标记校验传输效率程序处理ASCII:(冒号)CR,LFLRC低直观,简单,易调试RTU无无CRC高不直观,稍复杂通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII就需要传输“F”“9”的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好使用RTU协议。2.4 错误检测方法 标准的Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC或CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。 用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。2.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个。 如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。2.4.2 LRC检测使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了消息域中除开始的冒号及结束的回车换行号外的内容。LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。 LRC简单函数如下:static unsigned char LRC(auchMsg,usDataLen) unsigned char *auchMsg ; /* 要进行计算的消息 */ unsigned short usDataLen ; /* LRC 要处理的字节的数量*/ unsigned char uchLRC = 0 ; /* LRC 字节初始化 */ while (usDataLen-) /* 传送消息 */ uchLRC += *auchMsg+ ; /* 累加*/ return (unsigned char)(-(char_uchLRC) ; 2.4.3 CRC检测使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全1的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。CRC简单函数如下:unsigned short CRC16(puchMsg, usDataLen) unsigned char *puchMsg ; /* 要进行CRC校验的消息 */ unsigned short usDataLen ; /* 消息中字节数 */ unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ unsigned uIndex ; /* CRC循环中的索引 */ while (usDataLen-) /* 传输消息缓冲区 */ uIndex = uchCRCHi *puchMsgg+ ; /* 计算CRC */ uchCRCHi = uchCRCLo auchCRCHiuIndex ; uchCRCLo = auchCRCLouIndex ; return (uchCRCHi 8 | uchCRCLo) ; /* CRC 高位字节值表 */ static unsigned char auchCRCHi = 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; /* CRC低位字节值表*/ static char auchCRCLo = 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 ; 对于一条RTU协议的命令可以简单的通过以下的步骤转化为ASCII协议的命令:1、 把命令的CRC校验去掉,并且计算出LRC校验取代。2、 把生成的命令串的每一个字节转化成对应的两个字节的ASCII码,比如0x03转化成0x30,0x33(0的ASCII码和3的ASCII码)。3、 在命令的开头加上起始标记“:”,它的ASCII码为0x3A。4、 在命令的尾部加上结束标记CR,LF(0xD,0xA),此处的CR,LF表示回车和换行的ASCII码。2.5 Modbus RTU支持的功能码Modbus网络是一个工业通讯系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。下面是Mo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论