




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
21.1范围MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。自从1979年出现工业串行链路的事实标准以来,MODBUS使成千上万的自动化设备能够通信。目前,继续增加对简单而雅观的MODBUS结构支持。互联网组织能够使TCP/IP栈上的保留系统端口502访问MODBUS。MODBUS是一个请求/应答协议,并且提供功能码规定的服务。MODBUS功能码是MODBUS请求/应答PDU的元素。本文件的作用是描述MODBUS事务处理框架内使用的功能码。1.2规范性引用文件1.RFC791,互联网协议,Sep81DARPA2.MODBUS协议参考指南RevJ,MODICON,1996年6月,doc#PI_MBUS_300MODBUS是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。以太网上的TCP/IP。各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行传输。MODBUSPLUS,一种高速令牌传递网络。MODBUS应用层基于TCP的ModbusTCPIP其它MODBUS+/HDL主站/从站以太网II/802.3其它物理层EIA/TIA-232或EIA/TIA-485以太网物理层图1:MODBUS通信栈2缩略语ADU应用数据单元3MODBUSONRS232MODBUSONRS485PLCHMII/OI/OPLCI/OPLCPLCI/OI/OI/O驱动器HDLC高级数据链路控制MODBUSONRS232MODBUSONRS485PLCHMII/OI/OPLCI/OPLCPLCI/OI/OI/O驱动器HMI人机界面IETF因特网工程工作组I/O输入/输出设备IP互连网协议MAC介质访问控制MBMODBUS协议MBAPMODBUS协议PDU协议数据单元PLC可编程逻辑控制器TCP传输控制协议3背景概要MODBUS协议允许在各种网络体系结构内进行简单通信。MODBUS通信驱动器MODBUSMODBUSONTCP/IPHMII/OMODBUSHMII/OONMB+驱动器驱动器图2:MODBUS网络体系结构的实例每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用MODBUS协议来启动远程操作。在基于串行链路和以太TCP/IP网络的MODBUS上可以进行相同通信。一些网关允许在几种使用MODBUS协议的总线或网络之间进行通信。4总体描述4.1协议描述MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。4功能码数据响应数据请求功能码数据响应数据请求图3:通用MODBUS帧启动MODBUS事务处理的客户机创建MODBUS应用数据单元。功能码向服务器指示将执行哪种操作。MODBUS协议建立了客户机启动的请求格式。用一个字节编码MODBUS数据单元的功能码域。有效的码字范围是十进制1-255(128-255为异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。向一些功能码加入子功能码来定义多项操作。从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。在某种请求中,数据域可以是不存在的(0长度在此情况下服务器不需要任何附加信息。功能码仅说明操作。如果在一个正确接收的MODBUSADU中,不出现与请求MODBUS功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求MODBUS功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。服务器客户机服务器启动请求执行操作启动响应接收响应操作码操作码图4:MODBUS事务处理(无差错)对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻5客户机功能码数据请求差错码服务器客户机功能码数据请求差错码启动请求在操作中检测的差错启动差错接收响应异常码图5MODBUS事务处理(异常响应)F注释:需要管理超时,以便明确地等待可能不会出现的应答。因此,对串行链路通信来说,MODBUSPDU=256-服务器地址(1字节)-CRC(2字节)=253字节。串行链路上第一个因此,对串行链路通信来说,MODBUSPDU=256-服务器地址(1字节)-CRC(2字节)=253字节。从而:RS232/RS485ADU=253字节+服务器地址(1byte)+CRC(2字节)=256字节。TCPMODBUSADU=249字节+MBAP(7字节)=256字节。MODBUS协议定义了三种PDU。它们是:lMODBUS请求PDU,mb_req_pdulMODBUS响应PDU,mb_rsp_pdulMODBUS异常响应PDU,mb_excep_rsp_pdu定义mb_req_pdu为:mb_req_pdu={function_code,request_data},其中function_code-[1个字节]MODBUS功能码request_data-[n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。定义mb_rsp_pdu为:mb_rsp_pdu={function_code,response_data},其中function_code-[1个字节]MODBUS功能码response_data-[n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。定义mb_excep_rsp_pdu为:mb_excep_rsp_pdu={function_code,request_data},其中function_code-[1个字节]MODBUS功能码+0x80exception_code-[1个字节],在下表中定义了MODBUS异常码。4.2数据编码lMODBUS使用一个‘big-Endian’表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如:寄存器大小值616-比特0x1234F注释:更详细的信息参见[1]。4.3MODBUS数据模型发送的第一字节为0x12然后0x34MODBUS以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:基本表格对象类型访问类型离散量输入单个比特只读I/O系统提供这种类型数据线圈单个比特读写通过应用程序改变这种类型数据输入寄存器只读I/O系统提供这种类型数据保持寄存器读写通过应用程序改变这种类型数据输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四个表格全部覆盖了另外一个表格。对于基本表格中任何一项,协议都允许单个地选择65536个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。很显然,必须将通过MODBUS处理的所有数据放置在设备应用存储器中。但是,存储器的物理地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。MODBUS功能码中使用的MODBUS逻辑参考数字是以0开始的无符号整数索引。lMODBUS模型实现的实例下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述出来。每个设备根据其应用都有它自己的数据结构。实例1:有4个独立块的设备下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、输入量和输出量。由于不同块中的数据不相关,每个块是相互独立。按不同MODBUS功能码访问每个块。7设备应用存储器MODBUS访问输入离散量线圈输入寄存器保存寄存器MODBUS服务器设备图6:带有独立块的MODBUS数据模型实例2:仅有1个块的设备在这个实例中,设备仅有1个数据块。通过几个MODBUS功能码可能得到一个相同数据,或者通过16比特访问或1个访问比特。设备应用存储器设备应用存储器WMODBUS服务器设备保存寄存器MODBUS访问输入离散量输入寄存器线圈W RR图7:仅带有1个块的MODBUS数据模型4.4MODBUS事务处理的定义下列状态图描述了在服务器侧MODBUS事务处理的一般处理过程。8发送Modbus异常响应确认操作码发送Modbus异常响应确认操作码异常码_1异常码_2异常码_3 [接收MB指示][无效的]等待MB [接收MB指示][无效的]等待MB指示[无效的][有效的]确认数据地址[无效的][有效的]确认数据值确认数据值[有效的]执行执行MB操作[无效的][有效的]发送Modbus图8:MODBUS事务处理的状态图一旦服务器处理请求,使用合适的MODBUS服务器事务建立MODBUS响应。根据处理结果,可以建立两种类型响应:l一个正MODBUS响应:●响应功能码=请求功能码l一个MODBUS异常响应(参见第6.14节):l用来为客户机提供处理过程中与被发现的差错相关的信息;l响应功能码=请求功能码+0x80;l提供一个异常码来指示差错原因。5功能码分类有三类MODBUS功能码。它们是:公共功能码l是较好地被定义的功能码,l保证是唯一的,lMODBUS组织可改变的,l公开证明的,l具有可用的一致性测试,lMBIETFRFC中证明的,91l1用户定义功能码l有两个用户定义功能码的定义范围,即65至72和十进制100至110。l用户没有MODBUS组织的任何批准就可以选择和实现一个功能码l不能保证被选功能码的使用是唯一的。l如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。保留功能码l一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。公共功能码用户定义功能码公共功能码用户定义功能码公共功能码图9:MODBUS功能码分类234706文件记录访问线圈数量起始地址234706文件记录访问线圈数量起始地址5.1公共功能码定义功能码码子码(十六进制)页数据访问物理离散量输入读输入离散量读输入离散量02020202内部比特读线圈读线圈01010101比特访问比特访问或或写单个线圈写单个线圈05050505物理线圈写多个线圈写多个线圈0F0F3737输入存储输入存储器读输入寄存器读输入寄存器04040404读多个寄存器读多个寄存器03030303问内部存储内部存储器写单个寄存器写单个寄存器0606或或写多个寄存器写多个寄存器3939物理输出存储器读/写多个寄存器屏蔽写寄存器屏蔽写寄存器22224646读文件记录读文件记录2020664242写文件记录写文件记录2121664444封装接口读设备识别码432B6功能码描述6.101(0x01)读线圈在一个远程设备中,使用该功能码读取线圈的1至2000连续状态。请求PDU详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈1-16为0-15。根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为1=ON和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。请求PDU功能码功能码1个字节0x012个字节0x0000至0xFFFF2个字节1至2000(0x7D0)响应PDU功能码功能码1个字节0x01字节数字节数1个字节N*线圈状态线圈状态N个字节n=N或N+1*N=输出数量/8,如果余数不等于0,那么.N=N+1错误功能码功能码+0x80异常码01或02或03或04这是一个请求读离散量输出20-38的实例:请求域名域名(十六进制)(十六进制)域名域名(十六进制)功能起始地址功能起始地址Hi起始地址Lo输出数量Hi输出数量Lo01功能字节数功能字节数输出状态27-20输出状态35-28输出状态38-36010003CD006B05将输出27-20的状态表示为十六进制字节值CD,或二进制11001101。输出27是这个字节的MSB,输出20是LSB。通常,将一个字节内的比特表示为MSB位于左侧,LSB位于右侧。第一字节的输出从左至右在最后的数据字节中,将输出状态38-36表示为十六进制字节值05,或二进制00000101。输出38是左侧第六个比特位置,输出36是这个字节的LSB。用零填充五个剩余高位比特。注:用零填充五个剩余比特(一直到高位端)。NO异常码=01NONO异常码=02NOMB服务器发送mb_exception_rspNO异常码=01NONO异常码=02NOMB服务器发送mb_exception_rspMB服务器接收mb_req_pdu支持的功能码支持的功能码YES0x0001≤输出数量≤0x07D0异常码异常码=03起始地址起始地址OK和起始地址+输出数量OKYES请求处理读取离散输出OK异常码异常码=04MB服务器发送mb_rsp退出图10:读取线圈状态图6.202(0x02)读离散量输入在一个远程设备中,使用该功能码读取离散量输入的1至2000连续状态。请求PDU详细说明了起始地址,即指定的第一个输入地址和输入编号。从零开始寻址输入。因此寻址输入1-16为0-15。根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为1=ON和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输入。其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。请求PDU功能码1个字节0x02起始地址2个字节0x0000至0xFFFF输入数量2个字节1至2000(0x7D0)响应PDU功能码1个字节0x82字节数1个字节N*输入状态N*×1个字节*N=输出数量/8,如果余数不等于0,那么.N=N+1错误差错码0x82异常码异常码01或02或03或04这是一个请求读取离散量输入197-218的实例:请求请求响应域名域名(十六进制)(十六进制)域名域名(十六进制)(十六进制)功能起始地址功能起始地址Hi起始地址Lo输出数量Hi输出数量Lo功能字节数功能字节数输入状态204-197输入状态212-205输入状态218-2130203C4ACDB35将离散量输入状态204-197表示为十六进制字节值AC,或二进制10101100。输入204是这个字节的MSB,输入197是这个字节的LSB。将离散量输入状态218-213表示为十六进制字节值35,或二进制00110101。输入218位于左侧第3比特,输入213是LSB。注:用零填充2个剩余比特(一直到高位端)。NONONONOMB服务器发送mb_exception_rsp请求处理进入NONONONOMB服务器发送mb_exception_rsp请求处理进入MB服务器接收mb_req_pdu支持的功能码支持的功能码0x00010x0001≤输入数量≤0x07D0起始地址起始地址OK和起始地址+输入数量OKYES读取离散输入读取离散输入OKMB服务器发送mb_rsp退出退出图11:读离散量输入的状态图6.303(0x03)读保持寄存器在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求PDU说明了起始寄存器地址和寄存器数量。从零开始寻址寄存器。因此,寻址寄存器1-16为0-15。将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。请求功能码1个字节0x03起始地址2个字节0x0000至0xFFFF寄存器数量2个字节1至125(0x7D)功能码1个字节0x03字节数1个字节2×N*寄存器值N*×2个字节*N=寄存器的数量错误差错码差错码1个字节0x83异常码异常码1个字节01或02或03或04这是一个请求读寄存器108-110的实例:请求请求响应域名域名(十六进制)(十六进制)域名域名(十六进制)功能高起始地址功能高起始地址低起始地址高寄存器编号低寄存器编号功能字节数功能字节数寄存器值Hi(108)寄存器值Lo(108)寄存器值Hi(109)寄存器值Lo(109)寄存器值Hi(110)寄存器值Lo(110)03066B022B00000064将寄存器108的内容表示为两个十六进制字节值022B,或十进制555。将寄存器109-110的内容分别表示为十六进制0000和0064,或十进制0和100。NONONOMB服务器发送mb_exception_rsp请求处理进入NONONOMB服务器发送mb_exception_rsp请求处理进入MB服务器接收mb_req_pduNONO支持的功能码YES0x0001≤寄存器数量≤0x007D起始地址起始地址OK和起始地址+寄存器数量OKYES读多个寄存器OKMB服务器发送mb_rsp退出退出图12:读保持寄存器的状态图6.404(0x04)读输入寄存器在一个远程设备中,使用该功能码读取1至大约125的连续输入寄存器。请求PDU说明了起始地址和寄存器数量。从零开始寻址寄存器。因此,寻址输入寄存器1-16为0-15。将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。请求功能码1个字节0x04起始地址2个字节0x0000至0xFFFF输入寄存器数量2个字节0x0001至0x007D功能码1个字节0x04字节数1个字节2×N*输入寄存器N*×2个字节*N=输入寄存器的数量错误差错码差错码1个字节0x84异常码异常码1个字节01或02或03或04这是一个请求读输入寄存器9的实例:请求请求响应域名域名(十六进制)(十六进制)域名域名(十六进制)功能起始地址功能起始地址Hi起始地址Lo输入寄存器数量Hi输入寄存器数量Lo04功能字节数功能字节数输入寄存器9Hi输入寄存器9Lo0402000A00080001将输入寄存器9的内容表示为两个十六进制字节值000A,或十进制10。NONONOMB服务器发送mb_exception_rsp请求处理进入NONONOMB服务器发送mb_exception_rsp请求处理进入MBMB服务器接收mb_req_pduNONO支持的功能码0x0001≤寄存器的数量≤0x007D起始地址起始地址OK和起始地址+寄存器数量OKYES读输入寄存器OKMB服务器发送mb_rsp退出退出图13:读输入寄存器的状态图6.505(0x05)写单个线圈在一个远程设备上,使用该功能码写单个输出为ON或OFF。请求数据域中的常量说明请求的ON/OFF状态。十六进制值FF00请求输出为ON。十六进制值0000请求输出为OFF。其它所有值均是非法的,并且对输出不起作用。请求PDU说明了强制的线圈地址。从零开始寻址线圈。因此,寻址线圈1为0。线圈值域的常量说明请求的ON/OFF状态。十六进制值0XFF00请求线圈为ON。十六进制值0X0000请求线圈为OFF。其它所有值均为非法的,并且对线圈不起作用。正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。域名域名请求功能码1个字节0x05输出地址2个字节0x0000至0xFFFF输出值2个字节0x0000至0x00功能码1个字节0x05输出地址2个字节0x0000至0xFFFF输出值2个字节0x0000至0xFF00错误差错码1个字节0x85异常码异常码1个字节01或02或03或04这是一个请求写线圈173为ON的实例:请求响应响应功能功能输出地址Hi输出地址Lo输出值Hi输出值Lo(十六进制)(十六进制)域名域名功能功能输出地址Hi输出地址Lo输出值Hi输出值Lo(十六进制)(十六进制)05050000ACACFFFF000020YESNOYESNOMB服务器发送mb_exception_rsp支持的功能码进入YESNOYESNOMB服务器发送mb_exception_rsp支持的功能码进入MB服务器接收mb_req_pduNO输出值=输出值=0x0000或0xFF00输出地址OK请求处理NO写单个输出写单个输出OKMB服务器发送mb_rsp退出图14:写单个输出状态图6.606(0x06)写单个寄存器在一个远程设备中,使用该功能码写单个保持寄存器。请求PDU说明了被写入寄存器的地址。从零开始寻址寄存器。因此,寻址寄存器1为0。正常响应是请求的应答,在写入寄存器内容之后返回这个正常响应。请求功能码1个字节0x06寄存器地址2个字节0x0000至0xFFFF寄存器值2个字节0x0000至0xFFFF21功能码1个字节0x06寄存器地址2个字节0x0000至0xFFFF寄存器值2个字节0x0000至0xFFFF错误差错码差错码1个字节0x86异常码异常码1个字节01或02或03或04这是一个请求将十六进制0003写入寄存器2的实例:请求请求响应响应域名域名(十六进制)(十六进制)域名域名(十六进制)(十六进制)功能功能寄存器地址Hi寄存器地址Lo寄存器值Hi寄存器值Lo06功能输出地址功能输出地址Hi输出地址Lo输出值Hi输出值Lo06000001010000030322YESNOYESNOMB服务器发送mb_exception_rsp请求处理支持的功能码进入YESNOYESNOMB服务器发送mb_exception_rsp请求处理支持的功能码进入MB服务器接收mb_req_pduNO0x0000≤寄存器值≤0xFFFF寄存器地址寄存器地址OKNO写单个寄存器写单个寄存器OKMB服务器发送mb_rsp退出退出图15:写单个寄存器状态图6.715(0x0F)写多个线圈在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为ON或OFF。请求PDU说明了强制的线圈参考。从零开始寻址线圈。因此,寻址线圈1为0。请求数据域的内容说明了被请求的ON/OFF状态。域比特位置中的逻辑“1”请求相应输出为ON。域比特位置中的逻辑“0”请求相应输出为OFF。正常响应返回功能码、起始地址和强制的线圈数量。23请求PDU功能码1个字节0x0F起始地址2个字节0x0000至0xFFFF输出数量2个字节0x0001至0x07B0字节数1个字节N*输出值N*×1个字节*N=输出数量/8,如果余数不等于0,那么.N=N+1响应PDU功能码1个字节0x0F起始地址2个字节0x0000至0xFFFF输出数量2个字节0x0001至0x07B0错误差错码差错码1个字节0x8F异常码1个字节01或02或03或04这是一个请求从线圈20开始写入10个线圈的实例:请求的数据内容为两个字节:十六进制CD01(二进制1100110100000001)。使用下列方法,二进制比特对应输出。输出:2726252423222120––––––2928传输的第一字节(十六进制CD)寻址为输出27-20,在这种设置中,最低有效比特寻址为最低输传输的下一字节(十六进制01)寻址为输出29-28,在这种设置中,最低有效比特寻址为最低输出应该用零填充最后数据字节中的未使用比特。请求请求响应域名(十六进制)域名域名(十六进制)(十六进制)功能功能起始地址Hi起始地址Lo输出数量Hi输出数量Lo字节数输出值Hi输出值Lo0F00000A功能起始地址Hi功能起始地址Hi起始地址Lo输出数量Hi输出数量Lo0ACD24YESNONONOMB服务器发送mb_exception_rsp支持的功能码进入YESNONONOMB服务器发送mb_exception_rsp支持的功能码进入MBMB服务器接收mb_req_pdu*N=输出数量*N=输出数量/8,如果余数不等于0,那么N=N+10x00010x0001≤输出数量≤0x07B0和YES起始地址起始地址OK和起始地址+输出数量=OKYES请求处理写多个输出OKMB服务器发送mb_rsp退出图16:写多个输出的状态图6.816(0x10)写多个寄存器在一个远程设备中,使用该功能码写连续寄存器块(1至约120个寄存器)。在请求数据域中说明了请求写入的值。每个寄存器将数据分成两字节。正常响应返回功能码、起始地址和被写入寄存器的数量。25请求PDU功能码1个字节0x10起始地址2个字节0x0000至0xFFFF寄存器数量2个字节0x0001至0x0078字节数1个字节2×N*寄存器值N*×2个字节值*N=寄存器数量响应PDU功能码1个字节0x10起始地址2个字节0x0000至0xFFFF寄存器数量2个字节1至123(0x7B)错误差错码差错码1个字节0x90异常码1个字节01或02或03或04这是一个请求将十六进制000A和0102写入以2开始的两个寄存器的实例:请求响应响应域名域名(十六进制)(十六进制)域名域名(十六进制)功能起始地址功能起始地址Hi起始地址Lo寄存器数量Hi寄存器数量Lo字节数寄存器值Hi寄存器值Lo寄存器值Hi寄存器值Lo00010002功能起始地址Hi起始地址Lo寄存器数量功能起始地址Hi起始地址Lo寄存器数量Hi寄存器数量Lo0001000204000A010226NONOMB服务器发送mb_exception_rsp请求处理进入NONOMB服务器发送mb_exception_rsp请求处理进入MB服务器接收mb_req_pdu支持的功能码0x00010x0001≤寄存器数量≤0x007B和字节数=寄存器数x2NOYESNO初始地址初始地址OK和初始地址+寄存器数量=OKYESNO写多个寄存器写多个寄存器OKMB服务器发送mb_rsp退出退出图17:写多个寄存器状态图6.920(0x14)读文件记录使用该功能码进行文件记录读取。根据字节数量提供所有请求数据长度,并且根据寄存器提供所有记录长度。文件是记录的结构。每个文件包括10000个记录,寻址这些记录为十进制0000至9999或十六进制0X0000至0X270F,例如寻址记录12为12。该功能可以读取多个参考组。这些组可以是分散的(不连续的),但每组中的参考必须是连续的。用含有7个字节的独立“子请求”域定义每个组:参考类型:1个字节(必须规定为6)文件号:2个字节27文件中的起始记录号:2个字节被读出的记录长度:2个字节被读取的寄存器数量不能超过MODBUS报文允许的长度:256个字节,这个寄存器数量与预期响应中的所有其它域组合。正常响应是一系列“子响应”,与“子请求”一一对应。字节数域是所有“子响应”中的全部组合字节数。另外,每个“子响应”都包括一个表示自身字节数的域。请求PDU功能码1个字节0x14字节数1个字节0x07至0xF5字节子请求x,参考类型1个字节06子请求x,文件号2个字节0x0000至0xFFFF子请求x,记录号2个字节0x0000至0x270F子请求x,记录长度2个字节N子请求x+1,…响应PDU功能码1个字节0x14响应数据长度1个字节0x07至0xF5子请求x,文件响应长度1个字节0x07至0xF5子请求x,参考类型1个字节6子请求x,记录数据N×2个字节子请求x+1,…错误差错码差错码1个字节0x94异常码异常码1个字节01或02或03或04或08这是一个请求从远程设备读取两个参考组的实例:请求请求响应响应域名域名(十六进制)(十六进制)域名域名(十六进制)(十六进制)功能功能功能功能字节数字节数0C响应数据长度响应数据长度0E子请求1,参考类型06子请求子请求1,文件响应长度05子请求1,文件号Hi00子请求子请求1,参考类型06子请求1,文件号Lo04子请求子请求1,纪录数据Hi0D子请求子请求1,记录号Hi00子请求子请求1,纪录数据LoFE子请求1,纪录号Lo01子请求1,纪录数据Hi00子请求1,记录长度Hi00子请求1,纪录数据Lo20子请求1,纪录长度Lo02子请求2,文件响应长度05子请求2,参考类型06子请求2,参考类型0628对每个子请求YESNONONOMB服务器发送mb_exception_rsp支持的功能码对每个子请求YESNONONOMB服务器发送mb_exception_rsp支持的功能码子请求2,文件号Hi00子请求2,纪录数据Hi33子请求2,文件号Lo03子请求2,纪录数据LoCD子请求2,记录号Hi00子请求2,纪录数据Hi00子请求2,纪录号Lo09子请求2,纪录数据Lo40子请求2,记录长度Hi00子请求2,纪录长度Lo02进入进入MB服务器接收mb_req_pduNO0x070x07≤字节数≤0xF5YES参考类型参考类型OK和文件号=OK和起始地址=OK和起始地址+寄存器数=OKYES请求处理读通用参考OKMB服务器发送mb_rsp退出图18:读文件记录状态图6.9.121(0x15)写文件记录使用该功能码进行文件记录写入。根据字节数量提供所有请求数据长度,并且根据16比特字的29数量提供所有记录长度。文件是记录的结构。每个文件包括10000个记录,寻址这些记录为十进制0000至9999或十六进制0X0000至0X270F,例如寻址记录12为12。该功能可以写多个参考组。这些组可以是分散的,即不连续的,但每组内的参考必须是连续的。用含有7个字节和数据的独立“子请求”域定义每个组:参考类型:1个字节(必须规定为6)文件号:2个字节文件中的起始记录号:2个字节被写入的记录长度:2个字节被写入的数据:每个寄存器为2字节。被写入的寄存器数量不能超过MODBUS报文允许的长度:256个字节,这个寄存器数量与询问中的所有其它域组合。正常响应是请求的应答。请求PDU功能码1个字节0x14请求数据长度1个字节0x07至0xF5子请求x,参考类型1个字节06子请求x,文件号2个字节0x0000至0xFFFF子请求x,记录号2个字节0x0000至0x270F子请求x,记录长度2字节N子请求x,记录数据N×2个字节子请求x+1,…响应PDU功能码1个字节0x15响应数据长度1个字节子请求x,参考类型1个字节子请求x,文件号2个字节0x0000至0xFFFF子请求x子请求x,记录号2个字节0x0000至0xFFFF子请求x,记录长度2个字节0x0000至0xFFFFN子请求x,记录数据N×2个字节子请求x+1,…错误差错码差错码1个字节0x95异常码1个字节01或02或03或04或08这是一个请求将一个参考组写入远程设备的实例:请求响应响应域名(十六进制)域名域名(十六进制)(十六进制)功能功能功能功能请求数据长度0D请求数据长度请求数据长度0D子请求子请求1,参考类型06子请求子请求1,参考类型06子请求子请求1,文件号Hi00子请求子请求1,文件号Hi00子请求子请求1,文件号Lo04子请求子请求1,文件号Lo04子请求子请求1,记录号Hi00子请求子请求1,记录号Hi00子请求子请求1,纪录号Lo07子请求1,纪录号Lo07子请求1,记录长度Hi00子请求1,记录长度Hi00子请求1,纪录长度Lo03子请求1,纪录长度Lo03子请求1,记录数据Hi06子请求1,记录数据Hi06子请求1,记录数据LoAF子请求1,记录数据LoAF子请求1,记录数据Hi04子请求1,记录数据Hi04子请求1,记录数据LoBE子请求1,记录数据LoBE子请求1,记录数据Hi子请求1,记录数据Hi子请求1,寄存器数据Lo0D子请求1,寄存器数据Lo0D31对每个子请求YESNONONOMB服务器发送mb_exception_rsp进入对每个子请求YESNONONOMB服务器发送mb_exception_rsp进入MB服务器得到mb_req_pduNO支持的功能码0x07≤字节数≤0xF5YES参考类型参考类型OK和文件号=OK和起始地址=OK和起始地址+寄存器数=OKYES请求处理写入通用参考OKMB服务器发送mb_rsp退出图19:写文件记录状态图6.1022(0x16)屏蔽写寄存器该功能码用于通过利用AND屏蔽、OR屏蔽以及寄存器内容的组合来修改特定保持寄存器的内容。使用这个功能设置或清除寄存器中的单个比特。请求说明了被写入的保持寄存器、AND屏蔽使用的数据以及OR屏蔽使用的数据。从0开始寻址寄存器。因此,寻址寄存器1-16为0-15。功能的算法为:结果=(当前内容ANDAnd_Mask)OR(Or_MaskANDAnd_Mask)例如:十六进制二进制当前内容=00010010And_Mask=F2Or_Mask=2500100101And_Mask=0D00001101结果=1700010111注:如果Or_Mask值为零,那么结果是当前内容和And_Mask的简单逻辑AND(与)。如果And_Mask值为零,结果等于Or_Mask值。可以使用读保持寄存器功能(功能码03)读出寄存器的内容。于是,当控制器扫描它的用户逻辑程序时,随后可以改变寄存器的内容。正常的响应是请求的应答。在已经写入寄存器之后,返回响应。请求PDU功能码1个字节0x16参考地址2个字节0x0000至0xFFFFAnd_Mask2个字节0x0000至0xFFFFOr_Mask2个字节0x0000至0xFFFF响应PDU功能码1个字节0x16参考地址2个字节0x0000至0xFFFFAnd_Mask2个字节0x0000至0xFFFFOr_Mask2个字节0x0000至0xFFFF错误差错码1个字节0x96异常码异常码1个字节01或02或03或04这是一个利用上述屏蔽值在远程设备中对寄存器5的屏蔽写入实例。请求请求响应响应域名域名(十六进制)域名(十六进制)(十六进制)功能功能功能功能参考地址Hi00参考地址Hi参考地址Hi00参考地址Lo参考地址Lo04参考地址04And_MaskHi00And_MaskHiAnd_MaskHi00And_MaskF2And_MaskAnd_MaskF2Or_Or_MaskHi00Or_Or_MaskHi00Or_Mask25Or_MaskOr_Mask2533NONO参考地址OK进入NONO参考地址OK进入MB服务器得到mb_req_pdu支持的功能码NOYESYESNOAnd_MaskOK和Or_Mask=OKYES请求处理屏蔽写寄存器OKMB服务器发送mb_rsp MB服务器发送mb_exception_rsp退出图20:屏蔽写保持寄存器状态图6.1123(0x17)读/写多个寄存器在一个单独MODBUS事务中,这个功能码实现了一个读操作和一个写操作的组合。从零开始寻址保持寄存器。因此,寻址保持寄存器1-16为0-15。请求说明了起始地址、被读取的保持寄存器号和起始地址、保持寄存器号以及被写入的数据。在写数据域中,字节数说明随后的字节号。正常响应包括被读出的寄存器组的数据。在读数据域中,字节数域说明随后的字节数量。请求PDU功能码1个字节0x17读起始地址2个字节0x0000至0xFFFF读的数量2个字节0x0001至近似0x0076写起始地址2个字节0x0000至0xFFFF写的数量2个字节0x0001至近似0x0076写字节数1个字节2×N*写寄存器值N*×2个字节*N=写的数量响应PDU功能码1个字节0x17字节数1个字节2×N*读寄存器值N*×2个字节*N=读的数量错误差错码差错码1个字节0x97异常码1个字节01或02或03或04这是一个请求从寄存器4开始读六个寄存器并且从寄存器15开始读三个寄存器的实例:请求请求响应域名域名(十六进制)(十六进制)域名(十六进制)(十六进制)功能功能读起始地址Hi读起始地址Hi00字节数字节数0C读起始地址Lo读起始地址Lo03读寄存器值Hi读寄存器值Hi00读的数量Hi读的数量Hi00读寄存器值Lo读寄存器值LoFE读的数量Lo06读寄存器值Hi0A写起始地址Hi写起始地址Hi00读寄存器值Lo读寄存器值LoCD写起始地址Lo0E读寄存器值Hi读寄存器值Hi00写的数量Hi00读寄存器值Lo01写的数量Lo03读寄存器值Hi00写字节数06读寄存器值Lo03写寄存器值Hi00读寄存器值Hi00写寄存器值LoFF读寄存器值Lo0D写寄存器值Hi00读寄存器值Hi00写寄存器值LoFF读寄存器值LoFF写寄存器值Hi00写寄存器值LoFF35YESNOYESNONOMB服务器发送mb_exception_rsp支持的功能码进入YESNOYESNONOMB服务器发送mb_exception_rsp支持的功能码进入MB服务器接收mb_req_pduNO0x00010x0001≤读的数量≤0x007D和0x0001≤写的数量≤0x0079和字节数=写的数量x2读起始地址读起始地址OK和读起始地址+读的数量OK和写起始地址OK和写起始地址+写的数量OKYES请求处理读读/写多个寄存器OKMB服务器发送mb_rsp退出图21:读/写多个寄存器状态图6.1243(0x2B)读设备识别码这个功能码允许读取与远程设备的物理描述和功能描述相关的识别码和附加报文。将读设备识别码接口模拟为一个地址空间,这个地址空间由一组可寻址数据元素组成。数据元素是被叫对象,并且对象Id确定这个数据元素。接口由3种对象组成:l基本设备识别码。所有此种对象都是必备的:厂商名称、产品代码和修订本号。l正常设备识别码。除基本数据对象以外,设备提供了附加的和可选择的识别码以及数据对象描述。按标准定义所有种类的对象,但是这种对象的执行是可选的。l扩展设备识别码。除正常数据对象以外,设备提供了附加的和可选的识别码以及专用数据描述。所有这些数据都是与设备有关的。对象Id对象名称/描述类型M/O种类0x00厂商名称ASCII字符串强制的基本0x01产品代码ASCII字符串强制的0x02主要修订本ASCII字符串强制的0x03VendorUrlASCII字符串可选的规则0x04产品名称ASCII字符串可选的0x05模式名称ASCII字符串可选的0x06用户应用名称ASCII字符串可选的0x07…0x7F保留可选的0x80…0xFF可选择地定义专用对象范围[0x80—0xFF]与产品有关相关设备可选的扩展请求PDU功能码1个字节0x2BMEI类型1个字节0x0EReadDevId码1个字节01/02/03/04对象id1个字节0x00至0xFF响应PDU功能码1个字节0x2BMEI类型1个字节0x0EReadDevId代码1个字节01/02/03/04一致性等级1个字节随后更多1个字节00/FF下一个对象Id1个字节对象ID号对象号1个字节对象ID的列表1个字节对象长度1个字节对象值1个字节功能码37功能码错误0xAB:Fc0x2B+0x80MEI类型异常码01、02、03、04请求参数描述:指配号为14的MODBUS封装接口识别读识别码请求。定义四种访问类型:01:请求获得基本设备识别码(流访问)02:请求获得正常设备识别码(流访问)03:请求获得扩展设备识别码(流访问)04:请求获得特定识别码对象(专用访问)在识别码数据不适合单独响应的情况下,可以需要几个请求/响应事务处理。对象id字节给出了获得的第一个对象识别码。对于第一个事物处理来说,客户机必须设置对象id为0,以便获得设备识别码数据的开始。对于下列事务来说,客户机必须设置对象id为前面响应中服务器的返回值。如果对象id不符合任何已知对象,那么服务器象指向对象0那样响应(从头开始)。在单个访问的情况下:ReadDevId代码04,请求中的对象id给出了获得的对象识别码。如果对象id不符合任何已知对象,那么服务器返回一个异常码=02(非法数据地址)的异常响响应参数描述:功能码:MEI类型:ReadDevId码:一致性等级:随后更多:下一个对象Id:对象号对象0.idObject0.长度功能码43(十进制)0x2B(十六进制)为设备识别码接口指配号的14(0x0E)MEI类型与请求ReadDevId码相同:01、02、03或04设备的识别码一致性等级和支持访问的类型01:基本识别码(仅流访问)02:正常识别码(仅流访问)03:扩展识别码(仅流访问)81:基本识别码(流访问和单个访问)82:正常识别码(流访问和单个访问)83:扩展识别码(流访问和单个访问)在ReadDevId码01、02或03(流访问)的情况下,如果识别码数据不符合单个响应,那么需要几个请求/响应事务处理。00:对象不再是可利用的FF:其它识别码对象是可利用的,并且需要更多MODBUS事务处理在ReadDevId码04(单个访问)的情况下,必须设置这个域为00。如果“随后更多=FF”,那么请求下一个对象的识别码如果“随后更多=00”,那么必须设置为00(无用的)在响应中返回的对象识别码号(对于单个访问,对象号码=1)PDU中返回的第一个对象识别码(流访问)或请求对象的识别码(单个访第一个对象的字节长度Object0.值…ObjectN.idObjectN.长度ObjectN.值第一个对象的值(对象0.长度字节)最后对象的识别码(在响应中)最后对象的字节长度最后对象的值(对象N.长度字节)“基本设备识别码”的读设备识别码请求的实例:在这个实例中,一个响应PDU中发送所有的请求请求响应响应域名域名值值域名域名值值功能2B功能2BMEIMEI类型0EMEIMEI类型0EReadDevIdReadDevId码01ReadDevIdReadDevId码01对象id对象id00一致性等级一致性等级01更多继续更多继续00下一个对象id下一个对象id00对象号对象号03对象id00对象长度对象值“公司识别码”对象id01对象长度0A对象值“产品代码”对象id02对象长度05对象值“V2.11”如果一个设备需要几个事务处理发送响应,那么启动下列事务处理。第一个事务处理:请求请求响应响应域名域名值值域名域名值值功能功能2B功能功能2BMEIMEI类型0EMEIMEI类型0EReadDevIdReadDevId码01ReadDevIdReadDevId码01对象id对象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中央厨房合作合同范本
- Module7 Unit2 教学设计2024-2025学年外研版英语九年级上册
- 包装制品订购合同范本
- 动力柜安装合同范本
- 3人购车合同范例
- 公寓前台转租合同范本
- 冷链运输合同范本简易
- 加工装饰合同范本
- 出资赠与协议合同范例范例
- 第1课 两弹元勋国脊梁 许身国威壮河山-《邓稼先》教学设计七年级语文下册同步高效课堂(统编版2024)
- 陕西延长石油集团矿业公司招聘笔试题库2024
- 《力与形变》教学课件(一)
- 湖北省2024年村干部定向考试真题
- 浙江省中小学心理健康教育课程标准
- 辽宁省大连市庄河市2023-2024学年七年级下学期期末数学试题
- 垒球教案完整版本
- 2024年南京铁道职业技术学院单招职业倾向性测试题库附答案
- 2024年苏州农业职业技术学院单招职业适应性测试题库含答案
- 2024年江苏经贸职业技术学院单招职业适应性测试题库含答案
- 2024年大理农林职业技术学院单招职业适应性测试题库含答案
- C语言课程思政案例
评论
0/150
提交评论