您好,欢迎访问三七文档
MODBUS协议主要内容•概述•Modbus应用协议规范•Modbus协议在串行链路上的实现概述1979年Modicon公司(现Schneider的一部分)提出的ModbusModbus最初作为工业串行链路的事实标准1997年Schneider电气在TCP/IP上实现Modbus协议2004年Modbus作为我国国家标准Modbus技术规范组成•Modbus应用协议规范•Modbus协议在串行链路上的实现指南•Modbus协议在TCP/IP上的实现指南•Modbus标准技术规范由以上三部分组成,本次我们学习前面两个部分。Modbus技术规范的关系Modbus应用层在TCP/IP上的Modbus映射TCP/IPIETFRFC793IPIETFRFC791EthernetII/802.3IEEE802.2以太网物理层TIA/EIA-232-F串行链路主站/从站TIA/EIA-485-AModbus协议在TCP/IP上的实现指南Modbus应用协议规范Modbus协议在串行链路上的实现指南Modbus应用协议规范•协议简介•数据帧格式•事务处理•数据模型•功能码Modbus通信栈TCP基于TCP的ModbusModbus应用层IP以太网物理层EthernetII/802.3EIA/TIA-232或EIA/TIA-485主站/从站物理层MODBUS+/HDLC其它其它Modbus应用协议Modbus是一种简单客户机/服务器应用协议客户机能够向服务器发送请求服务器分析请求,处理请求,向客户机发送应答通用Modbus帧结构--协议数据单元(PDU)附加地址功能码数据差错校验ADUPDUModbus事务处理(无差错)•当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)•对于一个正常响应来说,服务器仅复制原始功能码功能码数据请求客户机服务器启动请求执行操作启动响应接收响应功能码数据响应Modbus事务处理(异常响应)对于异常响应,服务器将原始功能码的最高有效位设置逻辑1后返回异常码指示差错类型客户机服务器启动请求在操作中检测差错启动差错异常功能码接收响应异常码功能码数据请求异常码Modbus事务处理ModbusPDU长度•Modbus最初在串行链路上的实现(最大RS485ADU=256字节)限制了ModbusPDU的长度。•因此,对串行链路通信来说,ModbusPDU=256-服务器地址(1字节)-CRC(2字节)=253字节。•从而:RS232/RS485ADU=253字节+服务器地址(1字节)+CRC(2字节)=256字节。TCPModbusADU=249字节+MBAP(7字节)=256字节。ModbusPDU结构Modbus请求PDUmb_req_pdu={function_code,request_data},function_code-[1字节]Modbus功能码request_data-[n字节]Modbus响应PDUmb_rsp_pdu={function_code,response_data},function_code-[1字节]Modbus功能码response_data-[n字节]Modbus异常响应PDUmb_excep_rsp_pdu={function_code,exception_code},function_code-[1字节]Modbus功能码+0x80exception_code–[1字节]Modbus数据模型Modbus的数据模型是以一组具有不同特征的类型为基础建立的四个基本类型为:基本类型对象类型访问类型注释离散量输入单个位只读I/O系统可提供这种类型数据线圈单个位读写通过应用程序可改变这种类型数据输入寄存器16位字只读I/O系统可提供这种类型数据保持寄存器16位字读写通过应用程序可改变这种类型数据Modbus功能码•有三类MODBUS功能码。它们是:•公共功能码•是较好地被定义的功能码,•保证是唯一的,•MODBUS组织可改变的,•公开证明的,•具有可用的一致性测试,•MBIETFRFC中证明的•其中RFC为RequestforComments首字母的缩写,它是IETF(互联网工程任务推进组织)的一个无限制分发文档。RFC被编号并且用编号来标识。•包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。•用户定义功能码•有两个用户定义功能码的定义范围,即65至72和十进制100至110。•用户没有MODBUS组织的任何批准就可以选择和实现一个功能码•不能保证被选功能码的使用是唯一的。•如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。•保留功能码•一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。功能码分类其中128-255为异常响应保留。Modbus公共功能码的定义常用功能码为0x01,0x02、0x03、0x04、0x05、0x06、0x0F、0x10Modbus功能码应用实例(1)•读线圈(0x01)功能码1字节0x01起始地址2字节0x0000至0xFFFF线圈数量2字节1至2000(0x7D0)功能码1字节0x01字节计数1字节N*线圈状态n字节n=N或N+1响应*N=寄存器的数量/8,如果余数不等于0,那么N=N+1错误功能码1字节功能码+0x80异常码1字节01或02或03或04读线圈实例•这是一个请求离散量输出20-38的实例。•将输出27-20的状态表示为十六进制字节值CD,或二进制11001101。输出27是这个字节的•MSB,输出20是LSB。•通常,将一个字节内的比特表示为MSB位于左侧,LSB位于右侧。第一字节的输出从左至右•为27至20。下一个字节的输出从左到右为35至28。当串行发射比特时,从LSB向MSB传输:20...•27、28...35等等。•在最后的数据字节中,将输出状态38-36表示为十六进制字节值05,或二进制00000101。输出•38是左侧第六个比特位置,输出36是这个字节的LSB。用零填充五个剩余高位比特。Modbus功能码应用实例(2)•读离散量输入(0x02)读离散量输入实例•这是一个请求读取离散量输入197-128的实例。•将离散量输入状态204-197表示为十六进制字节值AC,或二进制10101100。输入204是这个•字节的MSB,输入197是这个字节的LSB。•将离散量输入状态218-213表示为十六进制字节值35,或二进制00110101。输入218位于左侧•第3比特,输入213是LSB•这与读线圈功能是相似的,只是读取的数据类型不同。Modbus功能码应用实例(3)•读保存寄存器(0x03)读保持寄存器实例Modbus功能码应用实例(4)•读输入寄存器(0x04)读输入寄存器实例•这与读保存寄存器功能相似,只是数据类型不同。Modbus功能码应用实例(5)写多个线圈(0x0F)•其中1代表逻辑ON,0代表逻辑OFF写多个线圈实例Modbus功能码应用实例(6)写多个寄存器(0x10)功能码1字节0x10起始地址2字节0x0000至0xFFFF寄存器数量2字节0x0001至0x0078字节计数1字节2×N*寄存器值N*×2字节值*N=寄存器数量响应错误功能码1字节0x10起始地址2字节0x0000至0xFFFF寄存器数量2字节1至123(0x7B)差错码1字节0x90异常码1字节01或02或03或04写多个保持寄存器实例•其他功能码与以上类似,如有需要详细了解,可阅读MODBUS协议。Modbus协议在串行链路上的实现•主站/从站协议原理•Modbus串行传输模式–RTU模式•Modbus串行传输模式–ASCII模式Modbus协议在串行链路上的实现模型Modbus串行链路协议是一个主/从协议。该协议位于OSI模型的第二层。EIA/TIA-485(或EIA/TIA-232)Modbus主站/从站Modbus应用协议层客户机/服务器层ISO/OSI模型7应用层Modbus应用协议6表示层空5会话层空4传输层空3网络层空2数据链路层Modbus串行链路协议1物理层EIA/TIA-485(或EIA/TIA232)位于OSI模型第7层的Modbus应用层报文传输协议,供了连接于总线或网络的设备之间的客户机/服务器通信。在Modbus串行链路上客户机的功能由主节点提供而服务器功能由子节点实现。Modbus主站/从站协议原理•Modbus串行链路协议是一个主-从协议。•在同一时刻,只有一个主节点连接于总线,一个或多个•子节点(最大编号为247)连接于同一个串行总线。Modbus通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。•子节点之间从不会互相通信。•主节点在同一时刻只会发起一个Modbus事务处理。Modbus通信模式•主节点以两种模式对子节点发出Modbus请求:•在单播模式,主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个'应答')。•在这种模式,一个Modbus事务处理包含2个报文:一个来自主节点的请求,一个来自子节点的应答。•每个子节点必须有唯一的地址(1到247),这样才能区别于其它节点被独立的寻址。•在广播模式,主节点向所有的子节点发送请求。•对于主节点广播的请求没有应答返回。广播请求一般用于写命令。所有设备必须接受广播模式的写功能。地址0是专门用于表示广播数据的。串行链路上的Modbus帧结构地址域只含有子节点地址,该地址必须在Modbus串行总线上唯一Modbus主节点没有地址功能码指明服务器要执行的动作,遵从Modbus协议规范错误检验域是对报文内容执行冗余校验的计算结果。根据不同的传输模式(RTUorASCII)使用两种不同的计算方法,CRC或者LRC地址域功能码数据CRC(或LRC)Modbus串行链路ADUModbusPDU串行传输模式-RTU模式•当设备使用RTU(RemoteTerminalUnit)模式在Modbus串行链路通信,报文中每个8位字节含有两个4位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率。每个报文必须以连续的字符流传送。•RTU模式每个字节(11位)的格式为:编码系统:8–位二进制报文中每个8位字节含有两个4位十六进制字符(0–9,A–F)BitsperByte:1起始位8数据位,首先发送最低有效位1位作为奇偶校验1停止位奇偶校验中,偶校验是默认的,其它模式(奇校验,无校验)也可以使用,在无校验的模式下,有两个停止位串行传输模式-RTU模式•在RTU模式,报文帧由时长至少为3.5个字符时间的空闲间隔区分•整个报文帧必须以连续的字符流发送。•如果两个字符之间的空闲间隔大于1.5个字符时间,则报文帧被认为不完整应该被接收节点丢弃t0至少3.5个字符帧1帧2至少3.5个字符帧34.5个字符3.5个字符t01.5个字符帧1正常帧2不正常1.5个字符串行传输模式-RTU模式•RTU接收驱动程序的实现,由于t1.5和t3.5的定时,隐含着大量的对中断的管理。在高通信速率下,这导致CPU负担加重。因此,在通信速率等于或低于19200Bps时,这两个定时必须严格遵守;对于波特率大于19200Bps的情形,应使用2个定时的固定值:建议的字符间超时时间(t1.5)为750µs,帧间的超时时间(t1.5)为1.750ms。串行传输模式-RTU模式•在RTU模式包含一个对全部报文内容执行的,基于循环冗余校验(CRC-CyclicalRedundancyChecking)算法的错误检验域。•CRC域检验整个报文的内容。不管报文有无奇偶校验,均执行此检验。•CRC包含由两个8位字节组成的一个16位值。•CRC为常用的CRC-16校验方式,计算后,首先附加低字节,然后是高字节串行传输模式-ASCII模式•在ASCII
本文标题:Modbus协议
链接地址:https://www.777doc.com/doc-3379926 .html