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组织可改变的,•公开证明的,•具有可用的一致性测试,•MBIETFRFC中证明的•其中RFC为RequestforComments首字母的缩写,它是IETF(互联网工程任务推进组织)的一个无限制分发文档RFC被编号并且用编号来标识•包含已被定义的公共指配功能码和未来使用的未指配保留供功能码•用户定义功能码•有两个用户定义功能码的定义范围,即65至72和十进制100至110•用户没有MODBUS组织的任何批准就可以选择和实现一个功能码•不能保证被选功能码的使用是唯一的•如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码•保留功能码•一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码功能码分类其中128-255为异常响应保留Modbus公共功能码的定义常用功能码为0x01,0x02、0x03、0x04、0x05、0x06、0x0F、0x10Modbus功能码应用实例(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,或二进制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)(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(RemoteTerminalUnit)模式在Modbus串行链路通信,报文中每个8位字节含有两个4位十六进制字符这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率每个报文必须以连续的字符流传送•RTU模式每个字节(11位)的格式为:n编码系统:8–位二进制n报文中每个8位字节含有两个4位十六进制字符(0–9,A–F)nBitsperByte:1起始位n8数据位,首先发送最低有效位n1位作为奇偶校验n1停止位奇偶校验中,偶校验是默认的,其它模式(奇校验,无校验)也可以使用,在无校验的模式下,有两个停止位串行传输模式-RTU模式•在RTU模式,报文帧由时长至少为3.5个字符时间的空闲间隔区分•整个报文帧必须以连续的字符流发送。
•如果两个字符之间的空闲间隔大于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模式中,报文中的每个8位子节以两个ASCII字符发送•例:子节0X5B会被编码为两个字符:0x35和0x42(ASCII编码0x35="5",0x42="B")•由于一个子节需要两个字符,此模式比RTU效率低•ASCII模式每个字节(10位)的格式为:n编码系统:十六进制,ASCII字符0-9,A-F。
n报文中每个ASCII字符含有1个十六进制字符nBitsperByte: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位字节相加,忽略任何进位,然后求出其二进制补码谢谢! 结束结束 。