文档详情

Modbus协议分析

cn****1
实名认证
店铺
PPT
799.50KB
约46页
文档ID:570059409
Modbus协议分析_第1页
1/46

ModbusModbus协议分析分析 主要内容•概述•Modbus应用协议规范￿•Modbus协议在串行链路上的实现 概￿￿￿￿￿述q1979年Modicon公司(现Schneider 的一部分)提出的ModbusqModbus最初作为工业串行链路的事实标准q1997年Schneider电气在TCP/IP上实现Modbus协议 q2004年Modbus作为我国国家标准 Modbus技术规范组成•ModbusModbus应用协议规范应用协议规范•ModbusModbus协议在串行链路上的实现指南协议在串行链路上的实现指南•ModbusModbus协议在协议在TCP/IPTCP/IP上的实现指南上的实现指南 •ModbusModbus标准技术规范由以上三部分组成,本次我们学习前标准技术规范由以上三部分组成,本次我们学习前面两个部分面两个部分 Modbus技术规范的关系 Modbus应用协议规范•协议简介•数据帧格式•事务处理•数据模型•功能码 Modbus通信栈 Modbus应用协议ModbusModbus是一种简单客户机是一种简单客户机/ /服务器应用协议服务器应用协议q客户机能够向服务器发送请求客户机能够向服务器发送请求q服务器分析请求,处理请求,向客户机发送应答服务器分析请求,处理请求,向客户机发送应答 通用Modbus帧结构--协议数据单元 (PDU) Modbus事务处理(无差错)•当服务器对客户机响应时,它使用功能码域来指示正常当服务器对客户机响应时,它使用功能码域来指示正常(无差错)(无差错)响应或者出现某种差错(称为异常响应)响应或者出现某种差错(称为异常响应)•对于一个正常响应来说,服务器仅复制原始功能码对于一个正常响应来说,服务器仅复制原始功能码 Modbus事务处理(异常响应)q对于异常响应,服务器将原始功能码的最高有效位设置逻辑1后返回 q异常码指示差错类型 异常码 Modbus事务处理 Modbus PDU长度•Modbus最初在串行链路上的实现(最大最初在串行链路上的实现(最大RS485ADU=256RS485ADU=256字字节)限制了节)限制了Modbus PDU PDU的长度。

的长度 •因此,对串行链路通信来说,因此,对串行链路通信来说,Modbus PDU=256- PDU=256-服务器服务器地址(地址(1 1字节)字节)- -CRCCRC((2 2字节)=字节)=253253字节 •从而:从而: RS232 / RS485 ADU = 253 RS232 / RS485 ADU = 253字节字节+ +服务器地址服务器地址(1(1字节字节) + ) + CRC (2CRC (2字节字节)= 256)= 256字节 TCP Modbus ADU = 249 TCP Modbus ADU = 249字节字节+ + MBAP (7MBAP (7字节字节) = 2) = 25656字节 Modbus PDU结构qModbus请求PDU mb_req_pdu = { function_code, request_data} , mb_req_pdu = { function_code, request_data} , function_code - [1 function_code - [1字节字节] ] ModbusModbus功能码功能码 request_data - [nrequest_data - [n字节字节] ]qModbus响应PDU mb_rsp_pdu = { function_code, response_ data }, mb_rsp_pdu = { function_code, response_ data }, function_code - [1 function_code - [1字节字节] Modbus] Modbus功能码功能码 response_data - [nresponse_data - [n字节字节] ]qModbus异常响应PDU mb_excep_rsp_pdu = { function_code, exception_code }, mb_excep_rsp_pdu = { function_code, exception_code }, function_code - [1 function_code - [1字节字节] Modbus] Modbus功能码功能码 + 0x80 exception_code + 0x80 exception_code – [1 [1字节字节] ] Modbus￿数据模型ModbusModbus的数据模型是以一组具有不同特征的类型为基础建立的数据模型是以一组具有不同特征的类型为基础建立的四个基本类型为:的四个基本类型为:基本类型基本类型对象类型对象类型访问类型访问类型注释注释离散量输入离散量输入单个位只读I/O系统可提供这种类型数据线圈线圈单个位读写通过应用程序可改变这种类型数据输入寄存器输入寄存器16位字只读I/O系统可提供这种类型数据保持寄存器保持寄存器16位字读写通过应用程序可改变这种类型数据 Modbus功能码•有三类MODBUS￿功能码。

它们是:•公共功能码•是较好地被定义的功能码,•保证是唯一的,•MODBUS组织可改变的,•￿公开证明的,•具有可用的一致性测试,•MB￿IETF￿RFC中证明的•￿￿￿￿￿￿其中RFC￿为Request￿for￿Comments首字母的缩写,它是IETF(互联网工程任务推进组织)的一个无限制分发文档RFC被编号并且用编号来标识•包含已被定义的公共指配功能码和未来使用的未指配保留供功能码•用户定义功能码•有两个用户定义功能码的定义范围,即65￿至72￿和十进制100￿至110•用户没有MODBUS￿组织的任何批准就可以选择和实现一个功能码•不能保证被选功能码的使用是唯一的•如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码•保留功能码•一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码 功能码分类其中128-255为异常响应保留 Modbus公共功能码的定义常用功能码为0x01,0x02、0x03、0x04、0x05、0x06、0x0F、0x10 Modbus功能码应用实例(1)• 读线圈读线圈 (0x01)(0x01)功能码1字节0x01起始地址2字节0x0000 至0xFFFF线圈数量2字节1至2000(0x7D0)功能码1字节0x01字节计数1字节N*线圈状态n字节n=N或N+1响应* *N N=寄存器的数量/8,如果余数不等于0,那么 N = N+1 错误功能码1字节功能码+0x80异常码1字节01或02或03或04 读线圈实例•这是一个请求离散量输出20-38的实例。

•将输出27-20￿的状态表示为十六进制字节值CD,或二进制1100￿1101输出27￿是这个字节的•MSB,输出20￿是LSB•通常,将一个字节内的比特表示为MSB￿位于左侧,LSB￿位于右侧第一字节的输出从左至右•为27至20下一个字节的输出从左到右为35至28当串行发射比特时,从LSB向MSB传输:20￿.￿.￿.•27、28￿.￿.￿.￿35￿等等•在最后的数据字节中,将输出状态38-36表示为十六进制字节值05,或二进制0000￿0101输出•38￿是左侧第六个比特位置,输出36￿是这个字节的LSB用零填充五个剩余高位比特 Modbus功能码应用实例(2)•读离散量输入(0x02) 读离散量输入实例•这是一个请求读取离散量输入197-128的实例•将离散量输入状态204-197表示为十六进制字节值AC,或二进制1010￿1100输入204是这个•字节的MSB,输入197￿是这个字节的LSB•将离散量输入状态218-213表示为十六进制字节值35,或二进制0011￿0101输入218位于左侧•第3￿比特,输入213￿是LSB•这与读线圈功能是相似的,只是读取的数据类型不同 Modbus功能码应用实例(3)•读保存寄存器(0x03) 读保持寄存器实例 Modbus功能码应用实例(4)•读输入寄存器(0x04) 读输入寄存器实例•这与读保存寄存器功能相似,只是数据类型不同。

Modbus功能码应用实例(5)写多个线圈(0x0F)•其中1￿代表逻辑ON,0代表逻辑OFF 写多个线圈实例 Modbus功能码应用实例(6)写多个寄存器写多个寄存器(0x10)(0x10)功能码1字节0x10起始地址2字节0x0000至0xFFFF寄存器数量2字节0x0001至0x0078字节计数1字节2×N*寄存器值N*×2字节值*N N=寄存器数量响应错误功能码1字节0x10起始地址2字节0x0000至0xFFFF寄存器数量2字节1至123(0x7B)差错码1字节0x90异常码1字节01或02或03或04 写多个保持寄存器实例  •其他功能码与以上类似,如有需要详细了解,可阅读MODBUS协议 Modbus协议在串行链路上的实现•主站/从站协议原理•Modbus串行传输模式￿–￿RTU模式•Modbus串行传输模式￿–￿ASCII模式 Modbus协议在串行链路上的实现模型￿q Modbus 串行链路协议是一个主/从协议 该协议位于 OSI 模型的第二层层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帧结构q地址域只含有子节点地址,该地址必须在 Modbus 串行总线上唯一qModbus 主节点没有地址 q功能码指明服务器要执行的动作,遵从Modbus协议规范q错误检验域是对报文内容执行 "冗余校验" 的计算结果根据不同的传输模式 (RTU or ASCII)使用两种不同的计算方法,CRC或者LRC 串行传输模式-RTU模式•当设备使用￿RTU￿￿(Remote￿￿T￿erminal￿￿Unit)￿￿模式在￿￿Modbus￿￿串行链路通信,￿￿报文中每个￿8￿位字节含有两个￿4￿位十六进制字符这种模式的主要优点是较高的数据密度,在相同的波特率下比￿ASCII￿￿模式有更高的吞吐率每个报文必须以连续的字符流传送•RTU￿￿模式每个字节￿￿(￿11￿￿位)￿￿的格式为:n编码系统:￿￿￿￿8–位二进制n报文中每个￿8￿位字节含有两个￿4￿位十六进制字符(0–9,A–F)nBits￿perByte:￿￿￿￿1￿￿起始位n8￿￿数据位,￿￿首先发送最低有效位n1￿￿位作为奇偶校验n1￿￿停止位奇偶校验中,偶校验是默认的,￿￿其它模式￿￿(￿￿奇校验,￿￿无校验￿￿)￿￿也可以使用,在无校验的模式下,有两个停止位 串行传输模式-RTU模式•在￿￿RTU￿￿模式,报文帧由时长至少为￿3.5￿￿个字符时间的空闲间隔区分•整个报文帧必须以连续的字符流发送。

•如果两个字符之间的空闲间隔大于￿1.5￿￿个字符时间,则报文帧被认为不完整应该被接收节点丢弃 串行传输模式-RTU模式•R￿TU￿￿接收驱动程序的实现,由于￿t1.5￿￿和t3.5￿￿的定时,隐含着大量的对中断的管理在高通信速率下,这导致￿￿CPU￿￿负担加重因此,在通信速率等于或低于￿￿19200￿Bps￿￿时,这两个定时必须严格遵守;对于波特率大于￿19200￿￿Bps￿￿的情形,应使用￿2￿￿个定时的固定值:建议的字符间超时时间(t1.5)为￿750µs,帧间的超时时间￿￿(t1.5)￿￿为￿￿1.750ms 串行传输模式-RTU模式•在￿RTU￿￿模式包含一个对全部报文内容执行的,基于循环冗余校验(CRC￿-￿Cyclical￿Redundancy￿Checking)￿￿算法的错误检验域•CRC￿￿域检验整个报文的内容不管报文有无奇偶校验,均执行此检验•CRC￿￿包含由两个￿8￿位字节组成的一个￿16￿位值￿•CRC为常用的￿CRC-16校验方式,计算后,首先附加低字节,然后是高字节 串行传输模式-ASCII模式•在ASCII模式中,报文中的每个8￿￿位子节以两个￿￿ASCII￿￿字符发送•例￿￿:￿￿子节￿￿0X5B￿￿会被编码为两个字符￿￿:0x35￿￿和￿￿0x42(￿￿ASCII￿￿编码￿0x35￿="5",￿￿0x42￿="B"￿￿)•￿￿由于一个子节需要两个字符,此模式比￿RTU￿￿效率低•ASCII￿￿模式每个字节￿￿(￿10￿￿位)￿￿的格式为:n编码系统:￿￿￿￿十六进制,ASCII￿￿字符0-9,￿￿A-F。

n报文中每个￿ASCII￿￿字符含有￿1￿个十六进制字符nBits￿perByte:￿￿￿￿1￿￿起始位n7￿￿数据位,￿￿首先发送最低有效位n1￿￿位作为奇偶校验n1￿￿停止位奇偶校验中,偶校验是默认的,￿￿其它模式￿￿(￿￿奇校验,￿￿无校验￿￿)￿￿也可以使用,在无校验的模式下,有两个停止位 串行传输模式-ASCII模式•ASCII模式下的报文帧格式如下:•报文必须以报文必须以“: :”开始开始•报文必须以报文必须以“LFLF((0x0D0x0D))--CRCR(0x0A)(0x0A)”结束结束•数据用十六进制数据用十六进制ASCIIASCII码值表示码值表示•使用使用LRCLRC进行差错校验进行差错校验•每个字符子节需要用两个字符编码因此,为了确保每个字符子节需要用两个字符编码因此,为了确保 ASCII ASCII 模式模式 和和 RTU RTU 模式在模式在 Modbus Modbus 应用级兼容,应用级兼容,ASCII ASCII •数据域最大数据长度为数据域最大数据长度为 (2x252) (2x252) 是是 RTU RTU 数据域数据域 (252) (252) 的两倍。

的两倍•Modbus ASCII Modbus ASCII 帧的最大尺寸为帧的最大尺寸为 513 513 个字符个字符 串行传输模式-ASCII模式•在￿￿ASCII￿￿模式,包含一个对全部报文内容执行的,基于纵向冗余校验(LRC￿￿-LongitudinalRedundancyChecking)￿￿算法的错误检验域•￿•LRC￿￿域检验不包括起始￿“冒号”和结尾￿￿CRLF￿对的整个报文的内容不管报文有无奇偶校验,均执行此检验•LRC￿￿域为一个子节,包含一个￿8￿位二进制值•LRC￿￿的计算,￿￿对报文中的所有的连续￿8￿位字节相加,忽略任何进位,然后求出其二进制补码 谢谢! 结束结束   。

下载提示
相似文档
正为您匹配相似的精品文档
相关文档