第5部分Modbus通信协议简介5.1Modbus协议概述5.2Modbus协议规范5.3Modbus协议在串行链路的主站/从站通信原理5.4Modbus协议在串行链路寻址原则5.5Modbus帧结构5.6串行链路上Modbus帧的两种传输模式5.7Modbus协议数据模型5.8Modbus通信应用实例5.1Modbus协议概述1.Modbus协议的发展历史(1)Modicon公司提出的通信规约。(2)Modicon公司被施耐德电气公司收购。(3)施耐德将Modbus协议的所有权移交给IDA,成立了Modbus-IDA组织。(4)Modbus-RTPS成为实时以太网标准(IEC61784-2)。(5)Modbus协议已经成为国家标准(GB/T19582-2008)。2.Modbus协议的特点(1)标准、开放用户可以免费、放心地使用Modbus协议。(2)灵活支持多种物理层标准,如RS-232、RS-485、以太网等。(3)简单Modbus的帧格式简单、紧凑,通俗易懂。(4)使用广泛它是一种在工业领域被广为应用的真正开放、标准的网络通讯协议,已经成为一种电子控制器的通用语言,通过此协议控制器之间可以通讯,已成为一种工业标准。不同厂商生产的控制设备通过Modbus协议可以连成通讯网络,在PLC、变频器、电器设备及自动化仪表等领域都广泛应用Modbus协议。5.2Modbus协议规范1.Modbus技术规范的关系Modbus是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。Modbus是一个请求/应答协议,并且提供功能码规定的服务。Modbus功能码是Modbus请求/应答PDU的元素。Modbus应用层在TCP/IP上的Modbus映射TCP/IPIETFRFC793IPIETFRFC791EthernetII/802.3IEEE802.2以太网物理层TIA/EIA-232-F串行链路主站/从站TIA/EIA-485-AModbus协议在TCP/IP上的实现指南Modbus应用协议规范Modbus协议在串行链路上的实现指南5.2Modbus协议规范2.Modbus通信栈Modbus是一种简单客户机/服务器应用协议:客户机能够向服务器发送请求,服务器分析请求,处理请求,向客户机发送应答。TCP基于TCP的ModbusModbus应用层IP以太网物理层EthernetII/802.3EIA/TIA-232或EIA/TIA-485主站/从站物理层MODBUS+/HDLC其它其它5.3Modbus协议在串行链路的主站/从站通信原理Modbus串行链路协议是一个主/从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247)连接于同一个串行总线。Modbus通信总是由主节点发起,子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信,主节点在同一时刻只会发起一个Modbus事务处理。主站用两种模式向从站发出Modbus请求,分别为单播模式和广播模式。单播模式工作方式:由主站寻址单个从站,从站接收并处理完请求之后,向主站返回一个报文(一个应答)。在这种模式下,一个Modbus事务处理包含2个报文,一个是主站的请求,另一个是从站的应答。每个从站必须有唯一的地址(1~247),这样才能区别于其它站而被独立地寻址。广播模式工作方式:主站可以向所有的从站发送请求,对于主站广播的请求没有应答的返回,广播请求必须是写命令,所有设备必须接收写功能的广播,地址0被保留用来识别广播通信。单播模式广播模式1.客户机向服务器发请求,服务器分析并处理客户机的请求后返回响应。2.1个主站(客户机),最多247个从站(服务器)。3.可以采用单播模式和广播模式(0地址)。4.产生错误,服务器返回通信异常码。5.3Modbus协议在串行链路的主站/从站通信原理5.4Modbus协议在串行链路寻址原则Modbus寻址空间由256个不同地址组成。地址0为广播地址,所有从站必须识别广播地址。Modbus主节点没有地址,只有子节点必须有一个地址。该地址必须在Modbus串行总线上唯一的。1.请求-响应周期(1)请求主设备查询消息中的功能代码告之被选中的从设备要执行何种功能,数据段包含了从设备要执行功能的任何附加信息。例如:功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。(2)响应如果从设备产生一个正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应,数据段包括了从设备收集的数据(例如寄存器值或状态)。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。011-247248-255广播地址从站某个地址保留地址5.5Modbus帧结构串行链路上的Modbus帧结构见下图:(1)地址域在Modbus串行链路,地址域只含有子节点地址,合法的子节点地址为十进制0–247。每个子设备被赋予1–247范围中的地址。主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时,它将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答。(2)功能码Modbus由公共功能码和用户定义的功能码组成,功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域。(3)错误检验域错误检验域是对报文内容执行冗余校验的计算结果。根据不同的传输模式(RTUorASCII)使用两种不同的计算方法。附加地址功能码数据差错校验ADUPDU1.Modbus事务处理(无差错)当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅复制原始功能码。功能码数据请求客户机服务器启动请求执行操作启动响应接收响应功能码数据响应5.5Modbus帧结构2.Modbus事务处理(异常响应)对于异常响应,服务器将原始功能码的最高有效位设置逻辑1后返回,异常码指示差错类型。3.ModbusPDU(数据单元)长度Modbus最初在串行链路上的实现(最大RS485ADU=256字节),限制了ModbusPDU的长度。因此,对串行链路通信来说,ModbusPDU=256-服务器地址(1字节)-CRC(2字节)=253字节。因此:RS232/RS485ADU=253字节+服务器地址(1字节)+CRC(2字节)=256字节。TCP/IPModbusADU=253字节+MBAP(7字节)=260字节。客户机服务器启动请求在操作中检测差错启动差错异常功能码接收响应异常码功能码数据请求5.5Modbus帧结构4.ModbusPDU(数据单元)结构(1)Modbus请求PDUmb_req_pdu={function_code,request_data},function_code-[1字节]Modbus功能码,request_data-[n字节]。(2)Modbus响应PDUmb_rsp_pdu={function_code,response_data},function_code-[1字节]Modbus功能码,response_data-[n字节]。(3)Modbus异常响应PDUmb_excep_rsp_pdu={function_code,exception_code},function_code-[1字节]Modbus功能码+0x80exception_code–[1字节]。5.5Modbus帧结构5.6串行链路上Modbus帧的两种传输模式Modbus帧的两种串行传输模式有RTU模式和ASCII模式。它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码Modbus串行链路上所有设备的传输模式和串行通信接口的参数必须相同。尽管在特定的领域ASCII模式是要求的,但达到Modbus备之间的互操作性只有每个设备都有相同的模式。所有设备必须必须实现RTU模式,ASCII传输模式是选项。5.6串行链路上Modbus帧的两种传输模式1.RTU传输模式当设备使用RTU模式在Modbus串行链路通信,报文中每个8位字节含有两个4位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率。每个报文必须以连续的字符流传送。(1)RTU模式每个字节(11位)的格式编码系统:8位二进制;报文中每个8位字节含有两个4位十六进制字符(0–9,A–F)。BitsperByte:1个起始位;8数据位,首先发送最低有效位;1位作为奇偶校验;1位停止位。注意:一般使用偶校验,其它模式(奇校验,无校验)也可以使用。默认校验模式必须为偶校验。如果无奇偶校验,将传送一个附加的停止位以填充字符帧。见下图:有奇偶校验的RTU模式位序列无奇偶校验的RTU模式位序列5.6串行链路上Modbus帧的两种传输模式(2)Modbus报文RTU帧结构由发送设备将Modbus报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。在RTU模式,报文帧由时长至少为3.5个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作t3.5。消息发送至少要以3.5个字符时间的停顿间隔开始。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。5.6串行链路上Modbus帧的两种传输模式整个报文帧必须以连续的字符流发送。如果两个字符之间的空闲间隔大于1.5个字符时间,则报文帧被认为不完整应该被接收节点丢弃。见下图:注意:RTU接收驱动程序的实现,由于t1.5和t3.5的定时,隐含着大量的对中断的管理。在高通信速率下,这导致CPU负担加重。因此在通信速率等于或低于19200bps时,这两个定时必须严格遵守。对于波特率大于19200bps的情形,应该使用2个定时的固定值:建议的字符间超时时间(t1.5)为750µs,帧间的超时时间(t1.5))为1.750ms。5.6串行链路上Modbus帧的两种传输模式(3)Modbus报文RTU传输模式状态图注:主节点和子节点的不同角度均在相同的图中表示。5.6串行链路上Modbus帧的两种传输模式(4)Modbus报文RTU帧的CRC校验在RTU模式包含一个对全部报文内容执行的基于循环冗余校验(CRC)算法的错误检验域。CRC域检验整个报文的内容。不管报文有无奇偶校验,均执行此检验。CRC包含由两个8位字节组成的一个16位值。CRC域作为报文的最后的域附加在报文之后。计算后,首先附加低字节,然后是高字节,CRC高字节为报文发送的最后一个子节。附加在报文后面的CRC的值由发送设备计算。接收设备在接收报文时重新计算CRC的值,并将计算结果于实际接收到的CRC值相比较。如果两个值不相等,则为错误。CRC的计算,开始对一个16位寄存器预装全,然后将报文中的连续的8位子节对其进行后续的计算。只有字符中的8个数据位参与生成CRC的运算,起始位,停止位和校验位不参与CRC计算。CRC的生成过程中,每个8位字符与寄存器中的值异或。然后结果向最低有效位(LSB)方向移动(Shift)1位,而最高有效位(MSB)位置充零。然后提取并检查LSB:如果LSB为,1则寄存器中的值与一个固定的预置值异或;如果LSB为0,则不进行异或操作。这个过程将重复直到执行完8次移位。完成最后一次(第8次)移位及相关操作后,下一个8位字节与寄存器的当前值异或,然后又同上面描述过的一样重