• 3.16 MB
  • 2022-04-22 13:32:16 发布

GBZ19582.1-2004基于Modbus协议的工业自动化网络规范Modbus应用协议.pdf

  • 52页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'ICS25.040一一N10肠中华人民共和国国家标准化指导性技术文件GB/Z19582.1-2004基于Modbus协议的工业自动化网络规范第1部分:Modbus应用协议Modbusindustrialautomationnetworkspecification-Part1:Modbusapplicationprotocol2004-09-21发布2005-03-01实施率督留瞥臀裂嚼臀缝臀臀暴发“ GB/Z19582.1-2004.山i..口~ol1青本指导性技术文件包括两个通信规程中使用的Modbus应用层协议和服务规范:—串行链路上的ModbusModbus串行链路基于TIA/EIA标准:232-F和485-Ao—TCP/IP上的ModbusModbusTCP/IP基于IETF文件:RFC793和RFC7910串行链路和TCP/IP上的Modbus是根据相应ISO分层模型说明的两个通信规程。下图强调指出了本指导性技术文件的主要部分。深色方框表示规范,浅色方框表示已有的国际标准(TIA/EIA和IETF标准)。r1}4#ti-tit4S>rix默iA:1.W.,}1^-kVSI"!!/sv:..-4基于Modbu。协议的工业自动化网络规范分为三部分。—第1部分:Modbus应用协议—第2部分:Modbus协议在串行链路上的实现指南—第3部分:Modbus协议在TCP/IP-}的实现指南第1部分描述了Modbus事务处理;第2部分提供了一个有助于开发者实现串行链路上的Modbus应用层的参考信息;第3部分提供了一个有助于开发者实现TCP/IP上的Modbus应用层的参考信息。本部分的附录A是资料性附录。本部分由中国机械工业联合会提出。本部分由全国工业过程测量和控制标准化技术委员会归口。本部分起草单位:机械工业仪器仪表综合技术经济研究所、北京交通大学现代通信研究所、上海自动化仪表股份有限公司、施耐德电气(中国)投资有限公司、冶金工业钢铁研究总院、宝钢集团上海宝信软件股份有限公司。本部分主要起草人:欧阳劲松、孙听、刘铁椎、冯晓升、王勇、张荣生、丛力群、段永康。标准分享网www.bzfxw.com GB/Z19582.1-2004基于Modbus协议的工业自动化网络规范第1部分:Modbus应用协议1范围Modbus是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信,见图to从1979年开始,Modbus作为工业串行链路的事实标准,Modbus使成千上万的自动化设备能够通信。目前,对简单而精致的Modbus结构的支持仍在增长。互联网用户能够使用TCP/IP栈上的保留系统端口502访问Modbus,Modbus是一个请求/应答协议,并且提供功能码规定的服务。Modbu、功能码是Modbus请求/应答PDU的元素。本部分描述了Modbus事务处理框架内使用的功能码。Modbus是一种应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。目前,通过下列方式实现Modbus通信:—以太网上的TCP/IP,—各种介质(有线:EIA/TIA-232-F,EIA-422,EIA/TIA-485-A;光纤、无线等等)上的异步串行传输。—ModbusPLUS,一种高速令牌传递网络。一.MoDBSyus-mxM"codbusFf-WIJARM/MTFIfM/A--AL24u3825A"TAF_tfbernTOe*UxE,1;MkM-1/)9y!Mo8Ed4b2u3s,一图1Modbus通信栈2规范性引用文件下列文件中的条款通过GB/Z19582本部分的引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本部分,然而,鼓励根据本部分达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本部分。GB/T15969可编程序控制器RFC791,InternetProtocol,Sep81DARPA‘二参考文献[1]0 GB/Z19582.1-20043缩略语ADU(ApplicationDataUnit)应用数据单元HDI.C(HighLevelDatalinkcontrol)高级数据链路控制HMI(HumanManchineInterface)人机界面IETF(InternetEngineeringTaskForce)互联网工程工作组I/O(Input%Output)输人/输出IP(InternetProtocol)互联网协议LSB(LeastSignificantBit)最低有效位MAC(MediumAccessControl)介质访问控制MB(ModbusProtocol)Modbus协议MBAP(MODBUSApplicationProtocol)Modbus应用协议MEI(MODBUSEncapslatedInterface)Modbus封装接口MSB(MostSignificantBit)最高有效位PDU(ProtocolDataUnit)协议数据单元PLC(ProgrammableLogicController)可编程逻辑控制器RFC(RequestForComment)请求评注TCP(TransportControlProtocol)传输控制协议4背景概要Modbus协议可以方便地在各种网络体系结构内进行通信,见图20一Modbus444~一乱好t}i4}fMB+}1.1wNIMModbusuc}}}xr.T}rwo}XRS485vo`}}i"}{=y}vo!l的ModbusI—二二,,1易MMndh-__ML一一」图2Modbus网络体系结构的实例每种设备(PLC,HMI、控制面板、变频器、运动控制、I/O设备⋯⋯)都能使用Modbus协议来启动远程操作。同样的通信能够在基于串行链路和以太网TCP/IP网络上进行。网关能够实现在各种使用Modbus协议的总线或网络之间的通信。标准分享网www.bzfxw.com GB/Z19582.1-20045总体描述5.1协议描述Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引人一些附加域,见图30叫卜--~~-~---~~-~-ADU麟黛沸撼瀚}i-瓤--_麟馨-_.篡黝_黔fgoat?刻月卜~~~~~~~-~~-~~~P】)U图3通用Modbus帧启动Modbus事务处理的客户机创建Modbus应用数据单元。功能码向服务器指示将执行哪种操作。Modbus协议建立了客户机启动的请求格式。用一个字节编码Modbus数据单元的功能码域。有效的码字范围是十进制1--255028^-255为异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。向一些功能码加入子功能码来定义多项操作。从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散量和寄存器地址、处理的项目数量以及域中的实际数据字节数。在某种请求中,数据域可以是不存在的((0长度),在此情况下服务器不需要任何附加信息。功能码仅说明操作。如果在一个正确接收的ModbusADU中.不出现与所请求的Modbus功能有关的差错,那么服务器至客户机的响应数据域包括所请求的数据。如果出现与所请求的Modbus功能有关的差错,那么该域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。例如,客户机能够读一组离散量输出或输人的开/关状态,或者客户机能够读/写一组寄存器的数据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应(见图4)或者出现某种差错(称为异常响应),见图5。对于一个正常响应来说,服务器仅复制原始功能码。客户机服务器fa}1}}产益aKhitR图4Modbus事务处理(无差错)对于异常响应,服务器将原始功能码的最高有效位设置逻辑1后返回。 GB/Z19582.1-2004客户机_服务器}于-}1图5Modbus事务处理(异常响应)注:需要超时管理,以避免无限期地等待可能不会出现的应答。Modbus最初在串行链路上的实现(最大RS485ADU=256字节)限制了ModbusPDU的长度。因此,对串行链路通信来说,ModbusPDU=256一服务器地址(1字节)-CRC(2字节)=253字节。从而:RS232/RS485ADU=253字节+服务器地址(1字节)+CRC(2字节)二256字节。TCPModbusADU=253字节+MBAP(7字节)=260字节。Modbus协议定义了三种PDU。它们是:—Modbus请求PDU,mb_req_pdu;—Modbus响应PDU,mb_rsp_pdu;—Modbus异常响应PDU,mb_excep_rsp_pduo定义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功能码+Ox80oexception-code:[1字节〕,在第7章中定义了Modbus异常码。5.2数据编码Modbus使用最高有效字节在低地址存储的方式表示地址和数据项。这意味着当发送多个字节时,首先发送最高有效字节。例如:寄存器大小值16位0x1234发送的第一字节为0x12然后0x34注:更详细的信息参见「1]05.3Modbus数据模型Modbus的数据模型是以一组具有不同特征的表为基础建立的。4个基本表见表1:标准分享网www.bzfxw.com GB/Z19582.1-2004表飞布衬一AaiIl/oO!a}}ffr."-f9A7}F7}17-PT4&i!$$T},l#Ai}hkcJ4}}""wmtC1ftc1t9输入与输出之间以及位寻址的和字寻址的数据项之间的区别并不意味着应用特性的差别。如果所有4个表相互覆盖是对该目标机器最自然的解释,也是完全可接受的,而且很普遍。对于每个基本表,协议都允许单个地选择65536个数据项,而且其读写操作被设计为可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。很显然,必须将Modbus处理的所有数据(位,寄存器)放置在设备应用存储器中。但是,存储器的物理地址不应该与寄存器编号混淆。仅要求将寄存器编号与物理地址链接。Modbus功能码中使用的Modbus寄存器逻辑编号是以。开始的无符号整数索引。-—Modbus模型实现的实例下列实例表示了两种在设备中组织数据的方法。有多种组织数据的方法,在本部分中没有被全部描述。每个设备根据其应用都有它自己的组织数据的方法。实例1:有4个独立块的设备图6表示了含有数字量和模拟量、输人量和输出量的设备中的数据组织。由于不同块中的数据不相关,每个块是相互独立的。可通过不同Modbus功能码访问每个块。M--o--d-bu--s-)R---*--#---1Modbusih(WModbusig*图6带有独立块的Modbus数据模型实例2:仅有1个块的设备图7实例中,设备仅有1个数据块。通过几个Modbus功能码能够得到相同数据,既可通过16位访问也可通过1位访问。 GB/Z19582.1-2004Modbus}*#**pWRModbus*0AARaModbusik*W图7仅带有1个块的Modbus数据模型5.4Modbus寻址模型Modbus应用协议精确地定义了PDU寻址规则。在MUDBUSPDU中,从0^-65535寻址每个数据。Modbus应用协议还明确地定义了由4个块构成的Modbus数据协议,每个块由几个编号为1^-n的元素构成。在Modbus数据模型中,从I-n编号数据块中的每个元素。然后,必须将Modbus模型与设备应用结合(GB/T15969).Modbus数据模型和设备应用之间的映射完全与特定设备相关。....................................,b.Modbus----"A}{3k,.........................................................................................i............Modbus#.............................fYAM*55i}4.....V.....,!Modbus6.“一i**4f#54ikii"PDU03llltr图8Modbus寻址映射图8表示了用ModbusPDU的X-1寻址编号为X的Modbus数据。5.5Modbus事务处理的定义图9是状态图,描述了在服务器侧Modbus事务处理的一般处理过程。标准分享网www.bzfxw.com GB/Z19582.1-2004亩图9Modbus事务处理的状态图一旦服务器处理请求,使用合适的Modbus服务器事务处理建立Modbus响应。根据处理结果,可以建立两种类型响应:—一个正常的Modbus响应:响应功能码二请求功能码。—一个异常的Modbus响应(见第8章):1)用来为客户机提供处理过程中与所发现的差错相关的信息;2)异常功能码=请求功能码十0x80;3)提供一个异常码来指示差错原因。6功能码分类有三类Modbu、功能码,见图10。它们是:—公共功能码1)被确切定义的功能码;2)保证是唯一的;3)由Modbus.org确认的;4)公开的文档;5)可进行一致性测试;6)在MBIETFRFC中归档;7)包含已被定义的公共功能码和保留给未来使用的功能码。--一用户定义的功能码1)有两个用户定义功能码的区域,即十进制的65-72和100-1102)用户无需Modbus组织的任何批准就可以选择和实现一个功能码。3)不能保证被选功能码的使用是唯一的。4)如果用户希望将某种功能设置为一个公共功能码,那么用户必须启动RFC,以便将改变引人公共分类中,并且指配一个新的公共功能码。—保留功能码某些公司在传统产品上现行使用的功能码,不作为公共使用。 GB/Z19582.1-2004127110一赢蕊一赢鼎1001一}65Y------------豁脂知‘.‘召--{公共功能码‘{一图10Modbus功能码分类注:在功能码的公共区域中,可以保留一些功能码。6.1公共功能码定义见表20表2二标准分享网www.bzfxw.com GB/Z19582.1-20047功能码描述7.101(0x01)读线圈见图11和表3一表5a使用该功能码从一个远程设备中读1^--2000个连续的线圈状态。请求PDU指定了起始地址,即指定了第一个线圈地址和线圈数目。在PDU中,从17(十六进制11)返回从站忙计数响应数据域返回上一次重启动、清除计数器操作或加电之后对返回从站设备忙异常响应的远程设备寻址的报文数量。子功能数据域(请求)数据域(响应)00110000从站设备忙,从零开始寻址线圈。因此编号1^-16的线圈寻址为。-15.响应报文中的线圈按数据域的每位一个线圈进行打包。状态被表示成1=0N和。=OFF。第一个数据字节的LSB(最低有效位)包含询问中所寻址的输出。其他线圈依次类推,一直到这个字节的高位端为止,并在后续字节中按照从低位到高位的顺序排列。如果返回的输出数量不是8的倍数,将用零填充最后数据字节中的剩余位(一直到字节的高位端)。字节数量域说明了数据的全部字节数。表3请求卜AvoMrgRfi#斗一于卞1O.X02000-0X(0O1XF0目表4响应以公一于攀带川表5错误卜一omft"fi一一+一镖一斗气0舞1:q102A003X8A004州表6是一个请求读离散量输出20-38的实例:表6于考i$tJotfijfr#%tfR?17th?}5}It23c758c--23086A}`u]州 GB/Z19582.1-2004将输出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是左侧第6个位位置,输出36是这个字节的LSB。用零填充5个剩余高位位。注:用零填充5个剩余位(一直到高位端)。IlkMBl**il*&19=0XMWI}MBff**2bXmb_R;4=02ASN=04MBexception_rsp0x0001mb<-0HiSria}}}f&*t--}0xo7DO+WARt1=OK&**rtjX=OKa}dimbrsp图11读线圈状态图7.202(0x02)读离散It输入见图12和表7一表90使用该功能码从一个远程设备中读1-2000个连续的离散量输人状态。请求PDU指定了起始地址,即指定了第一个离散量输人地址和离散量输人数目。在PDU中,从零开始寻址离散量输入。因此编号1^,16的离散量输人寻址为0^-15,响应报文中的离散量输入按数据域的每位一个离散量输人进行打包。状态被表示成1=0N和。=OFF。第一个数据字节的LSB(最低有效位)包含询问中所寻址的输人。其他离散量输入依次类推,一直到这个字节的高位端为止,并在后续字节中按照从低位到高位的顺序排列。如果返回的输人数量不是8的倍数,将用零填充最后数据字节中的剩余位(一直到字节的高位端)。字节数量域说明了数据的全部字节数。标准分享网www.bzfxw.com GB/Z19582.1-2004表7请求一1一一州德川表8响应共R*.f.(.T..4..-T.0.,Aao}.,.N..=.N.N.-.+.x.l.1.o.^.....}t5....川表9错误卜-,}R4IaM}-{11}}份1:-1020x:-182035一表10是一个请求读离散量输入197^218的实例:表10一一一一将离散量输人204^-197的状态表示为十六进制字节值AC,或二进制10101100。输人204是这个字节的MSB,输人197是这个字节的LSBo将离散量输人218-v213的状态表示为十六进制字节值35,或二进制00110101。输人218位于左侧第3位,输入213是LSBo注:用零填充2个剩余位(一直到高位端)。 GB/Z19582.1-2004MB4=01OxOOOI<-,*Wtitmb_exception}"*Pi=03AgMtkMBM*#*#C}}}J3f1}}#=02iWmb_rspreq_pdu%AfA<-9M)Wk+JtA#tl=OK=04SOXO7DOi*FAAf1=OKMBI&ik*A=,}}}}}ir}mod!OK>mbrsp图12读离散f输入的状态图7.303(0x03)读保持寄存器见图13和表11~表130使用该功能码从远程设备中读保持寄存器连续块的内容。请求PDU说明了起始寄存器地址和寄存器数量。在PDU中,从零开始寻址寄存器。因此编号1^x16的寄存器寻址为0^-150将响应报文中的寄存器数据打包成每个寄存器有两字节。对于每个寄存器,第一个字节为高位字节,第二个字节为低位字节。表11请求牛r14rgfi4jg}AhE川下一幸二0X00拱州表12响应N=*45nf(j.一一一介件{*Vnfft4:15t:Mmq标准分享网www.bzfxw.com GB/Z19582.1-2004表13错误「痴4}4ff44一{1IKnyVv一+I下01:51,02ox:418303:6104州表14是一个请求读寄存器108^-110的实例:表14*WAgjig}Vf}MpftOM*-AthLEtjft1H_0HLioi一州将寄存器108的内容表示为两个十六进制字节值022B,或十进制555。将寄存器109^-110的内容分别表示为十六进制0000和0064,或十进制0和100}N4BjRR*P*jMj14jB=&3j0Mm3bR_&e0o.xIcRxeOpOtm0i.o!b1n<-,erWqsp;fpdOul7MSL-<9MOxAOO*7D=MOBKjR*,VEXjITiXmb_rp图13读保持寄存器的状态图 GB/Z19582.1-20047.404(0x04)读输入寄存器见图14和表15~表170使用该功能码从一个远程设备中读1^125个连续输人寄存器。请求PDU说明了起始地址和寄存器数量。在PDU中,从零开始寻址寄存器。因此,编号为1^-16的输人寄存器寻址为。一15a将响应报文中的寄存器数据打包成每个寄存器为两字节。对于每个寄存器,第一个字节包括高位位,第二个字节包括低位位。表15请求阵rJ}}t`u11}{"C2frfrV一二.V0x0000^-OxFFFF0x0001OOxOO7DxO4表16响应焦T/j*N=1rAf$Alk*#af}Mtft}hrgfi吕兰t4&N"1X2frv兰}vJKV2XN"0x04川表17错误卜万AIM4447}19下..........十丁下1"yj5下州下下0x8402J-5103J(不」}}}=01MB&*#yAikmb_exception_rspRP+AJ=039M%*=OKMB}3S`}}}Rm0x0001-*1A}*wr-hV-Vly"c-ifUmR91x_0iUn1川将输人寄存器9的内容表示为两个十六进制字节值00OA,或十进制10,7.505(0x05)写单个线圈见图15和表19~表210使用该功能码将一个远程设备中的一个输出写为ON或OFF}请求数据域中的常数指定所请求的ON/OFF状态。十六进制值FF00请求输出为ON。十六进制值0000请求输出为OFF。其他所有值均是非法的,并且对输出不起作用。请求PDU说明了被强制的线圈地址。从零开始寻址线圈。因此,编号为1的线圈被寻址为0。线圈值域的常数指定所请求的ON/OFF状态。十六进制值OxFF00请求线圈为ON。十六进制值0x0000请求线圈为OFF。其他所有值均为非法的,并且对线圈不起作用。正常的响应是请求的复制,在写人线圈状态之后被返回。表19请求卜Vja39井下12}r1-J5}牛0x000000^:x510-O5OxxFFFFF0F0表20响应卜r1MA3t二一黔一0x0000000-sxal0O5OxxFFFFF0F0表21错误一下}&Imfi一一一frIK}V下粉谕0102.850304州 GB/Z19582.1-2004}}}=01MBIf*#Ajigmb-exception_rspMBm*0061=03AN}1}f3h3f1}bQSSA=02odiift=0x0000mbA"}reqOxPduFFOO*l*Jk=0K=0414*+%tfiMBjR*jjjAiXAAlf=}OKmbrsp图巧写单个输出状态图表22是一个请求写线圈173为ON的实例:表22李一才c-t-}.ACFF0005}}+1>7.606(0x06)写单个寄存器见图16和表23~表25.使用该功能码在一个远程设备中写一个保持寄存器。请求PDU指定了被写人寄存器的地址。从零开始寻址寄存器。因此,编号为1的寄存器被寻址为0。正常的响应是请求的复制,在写人寄存器内容之后被返回。标准分享网www.bzfxw.com GB/Z19582.1-20047.707(0x07)读异常状态(仅用于串行链路)见图17和表27~表290使用这个功能码从一个远程设备中读8个异常状态输出的内容。因为异常码输出参量是已知的(在这个功能中不需要输出参量),该功能提供一种简单的访问这种信息的方法。正常的响应包括8个异常状态输出的内容。将这些输出打包成一个字节,每个输出一个位。在该字节的最低有效位中包含最低位输出参量的状态。表27请求}二冲能码}.1字节{0粉了二_.......⋯⋯}表28。向应}-瑞鑫一一十一一一一:务一一一.0x07O-OxFF州表29错误}差错码}:字节一。x87}}异常码}‘字节一。‘或。4}三图17读异常状态的状态图标准分享网www.bzfxw.com GB/Z19582.1-2004表30是一个请求读异常状态的实例:表30导邵不毕INAA兴州在这个实例中,输出数据是十六进制6D(二进制01101101)。从左至右,输出为OFF-ON-ON-OFF-ON-ON-OFF-ON。按从最高到最低寻址输出的方式显示状态。7.808(0x08)诊断(仅用于串行链路)见表31一表33.Modbus功能码08提供一系列测试,用于检查客户机(主站)设备与服务器(从站)之间的通信系统,或服务器中的各种内部差错状态。这个功能使用询问中的2个字节的子功能码域来定义所执行的测试类型。服务器在正常的响应中复制功能码和子功能码。一些诊断会导致远程设备通过正常响应的数据域返回相应数据。通常,向远程设备发送诊断功能,不影响远程设备中的用户程序运行。诊断不能访问用户逻辑,例如:离散量和寄存器。某些功能可以任意地复位远程设备中的差错计数器。但是,可以强制服务器设备进入“只听模式”,在这种模式中服务器设备监视通信系统中的报文而不对报文进行响应。如果应用程序与远程设备的进一步数据交换有关,就可能影响应用程序的结果。一般情况下,这种模式被强制用来从通信系统中去除有故障的远程设备。下列诊断功能专门用于串行链路设备。对返回询问数据请求的正常响应是回送相同的数据。同时还复制功能码和子功能码。表31请求一蓉二一N2X11-2f7.jK}iV一典川表32响应卜I:OfgVj11109}i二仁N2XI}2rfvVr-p二二oxo8表33错误}0错码}1字节一。X88’}{.异常码}‘早节一。1.或。“或。4}7.8.1串行链路设备支持的子功能码表34是由串行链路设备所支持的子功能码列表。所列出的每个子功能码均附带用于诊断的数据域内容的实例。 GB/Z19582.1-2004表34一00返回询问数据在响应中返回(回送)请求数据域中传递的数据。全部响应报文应该与请求报文一致。子功能数据域(请求)数据域(响应)0000任意复制请求数据01孟新启动通信选项必须初始化和重新启动远程设备串行链路端口,并且清除所有通信事件计数器。如果端口正在只听模式下,不返回响应。它是唯一的能将端口带出只听模式的功能。如果端口不是处于只听模式,返回正常的响应。在进行重新启动之前,出现这种状况。当远程设备接收到请求时,它设法进行重新启动,并进行加电确认测试。成功地完成测试将端口带人联机状态。请求数据域内容是十六进制FF00时,能够清除端口通信事件记录。内容是0000时,保持记录与重新启动之前相同。子功能数据域(请求)数据域(响应)00010000复制请求数据0001FF00复制请求数据02返回诊断寄存器在响应中返回远程设备的16位诊断寄存器内容。标准分享网www.bzfxw.com GB/Z19582.1-2004子功能数据域(请求)数据域(响应)00020000诊断寄存器内容03改变ASCII输入分隔符请求数据域中传递的字符“CHAR",作为报文结束分隔符(替代默认的LF字符),为以后报文使用。在ASCII报文结束不要求换行的情况下,使用这种功能。子功能数据域(请求)数据域(响应)0003CHAR00复制请求数据04强制只听模式强制被寻址的远程设备进人Modbus通信的只听模式。这就使远程设备与网络中的其他设备断开,允许网络中的其他设备继续通信,而没有来自被寻址远程设备的中断。没有返回响应。当远程设备进人只听模式时,关闭所有激活的通信控制。允许就绪看门狗定时器超时,锁定控制关断。当设备在这种模式下,监视对设备寻址的Modbus报文或广播,但不进行任何操作,不发送任何响应。进人这种模式后处理的唯一功能是重新启动通信选项功能(功能码8,子功能1)o子功能数据域(请求)数据域(响应)00040000没有返回的响应10(十六进制OA)清除计数器和诊断寄存器目的是清除所有计数器和诊断寄存器。加电时也会清除计数器。子功能数据域(请求)数据域(响应)00OA0000复制响应数据11(十六进制OB)返回总线报文计数响应数据域返回上一次重启动、清除计数器操作或加电之后远程设备在通信系统中检测到的报文数量。子功能数据域(请求)数据域(响应)00OB0000全部报文计数12(十六进制0C)返回总线通信错误计数响应数据域返回上一次重启动、清除计数器操作或加电之后远程设备遇到的CRC错误数量。子功能数据域(请求)数据域(响应)00OC0000CRC错误计数13(十六进制OD)返回总线异常错误计数响应数据域返回上一次重启动、清除计数器操作或加电之后远程设备返回的Modbus异常响应数量。在第7章中详细说明和列出了异常响应。子功能数据域(请求)数据域(响应)00OD0000异常差错计数14(+六进制OE)返回从站报文计数响应数据域返回上一次重启动、清除计数器操作或加电之后对远程设备寻址的报文数量或远程设备处理的广播报文数量。子功能数据域(请求)数据域(响应) GB/Z19582.1-200400OE0000从站报文计数15(+六进制OF)返回从站无晌应计数响应数据域返回上一次重启动、清除计数器操作或加电之后对没有返回响应(既没有正常响应也没有异常响应)的远程设备寻址的报文数量。子功能数据域(请求)数据域(响应)00of0000从站无响应计数17(十六进制11)返回从站忙计数响应数据域返回上一次重启动、清除计数器操作或加电之后对返回从站设备忙异常响应的远程设备寻址的报文数量。子功能数据域(请求)数据域(响应)00110000从站设备忙计数18(+六进制12)返回总线字符超限计数响应数据域返回上一次重启动、清除计数器操作或加电之后,对由于字符超限状况而无法处理的远程设备寻址的报文数量。字符抵达端口的速度高于存储字符的速度,或者由于硬件故障而丢失字符均产生字符超限。子功能数据域(请求)数据域(响应)00120000从站字符超限计数20(十六进制14)清除超限计数器和标志清除超限错误计数器,并复位错误标志。子功能数据域(请求)数据域(响应)00140000返回请求数据7.8.2实例和状态图见图18和表350这是一个请求远程设备返回询问数据的实例。它使用子功能码0(两个字节域的十六进制0000)o用两个字节数据域(十六进制A537)发送返回的数据。表35卞万川对其他类型询问响应的数据域可能包含错误计数或子功能码请求的其他消息。标准分享网www.bzfxw.com GB/Z19582.1-2004二圈18诊断状态图7.911(OxOB)获得通信事件计数器(仅用于串行链路)见图19和表36~表38.使用这个功能码从远程设备通信事件计数器中获得状态字和事件计数。通过在一系列报文之前和之后获取的当前计数,客户机可以确定远程设备是否正常地处理报文。每次成功地完成报文传输就将远程事件计数器增加1。异常响应、轮询命令或读事件计数器命令不增加计数器。利用重新启动通信选项的子功能码(码0001),或者清除计数器和诊断寄存器(码00OA),通过诊断功能(码08)复位事件计数器。正常响应包括两字节状态字和两字节事件计数。如果远程设备一直在处理前面发出的程序命令(存在忙状态),那么状态字将为全1(十六进制FFFF)。否则,状态字为全Oo表36请求}功能码}‘字节1OxOB} GB/Z19582.1-2004表37响应卜T)1%{}}s卜共1}v22frV寸息OxOBfrV0x0000OxFFFF表38错误片万AIMIA丁一二卡一一万Ox8B01:pj04一川乡图19获取通信事件计数器状态圈表39是一个请求获得远程设备中通信事件计数器的实例:表39寸下草一7.1012(OxOC)获得通信事件记录(仅用于串行链路)见图20和表40一表420标准分享网www.bzfxw.com GB/Z19582.1-2004使用这个功能码从远程设备中获得状态字、事件计数、报文计数以及一个事件字节域。该状态字和事件计数与获得通信事件计数器功能码(十六进制11OB)返回的信息一致。报文计数器包含上一次重启动、清除计数器操作或加电之后远程设备处理的报文数量。报文计数与诊断功能(码08)、子功能总线报文计数(十六进制码11OB)返回的报文计数一致。事件字节域包含0^-64个字节,每个字节与远程设备的一个Modbus发送或接收操作状态对应。远程设备按时间顺序将事件放入域中。字节。是最新事件。新字节替代域中的最旧字节。正常响应包含一个2字节状态字域、一个2字节事件计数域、一个2字节报文计数域以及一个含有0^-64个事件字节的域。一个字节计数域定义了这四个域中的数据总长度。表40请求}坊能码}1学活{Ox0C}表41响应耸*N=4VfajRzji4ftf+ft3x2牛^5"(#.4i1"(tNti-#6126j4frK)Cx}iV1V1"}frtVhf>oOx000川表42错误卜一镖羚一+二书袭毕二斗一万0iOx:518C04一日MBj}*jjXmbeMxc=BepJV0t4io*nfArsMp(m}Mb_}Brte}&q-}#pd}#u4j}#idg}mb=OrsKp图20获取通信事件记录状态图表43是一个请求获得远程设备中通信事件记录的实例: GB/Z19582.1-2004表43一一}c}*41tft49,!Z*4%tf4RXitf:{k;}5:(}?*f+*t/1itfl-itftLoHi01itLoHioc080001212000I在这个实例中,状态字是十六进制0000,表示远程设备没有正在处理程序功能。事件计数表示了远程设备已经计数264(十六进制0108)个事件。报文计数表示了已经处理了289(十六进制0121)个报文。用事件0字节表示最新通信事件。最新通信事件的内容(十六进制20)表示远程设备最近进人了只听模式。用事件1字节表示前一个事件。前一个事件的内容(十六进制00)表示远程设备接收一个通信重新启动。下面说明响应事件字节的格式。事件字节包含的内容由获得通信事件记录功能返回的事件字节可以是四种类型中的任何一种。每个字节中的位7(高位位)定义了这种类型。还可以由位6进一步定义。下面详细解释这四种类型。—远程设备Modbus接收事件当远程设备接收询问报文时,存储这种类型的事件字节。在远程设备处理报文之前存储。通过将位7设置为逻辑“1”定义这种事件。其他位在相应状态为“真”时被设置为逻辑“1"。字节的格式为:位内容0未使用1通信错误2未使用3未使用4字符超限5当前在只听模式下6收到广播71—远程设备Modbus发送事件当远程设备处理完请求报文时,存储这种类型的事件字节。如果远程设备返回正常响应,异常响应或没有响应后存储。通过将位7设置为逻辑“0"、将位6设置为逻辑“1”定义这种事件。其他位在相应状态为“真”时设置为逻辑“1"。字节的格式为:位内容0读异常发送(异常码1-3)标准分享网www.bzfxw.com GB/Z19582.1-20041从站中断异常发送(异常码4)2从站忙异常发送(异常码5^-6)3从站程序NAK异常发送(异常码7)4出现的写超时错误5当前在只听模式下6170一一远程设备进人只听模式当远程设备进人只听模式时,存储这种类型的事件字节。内容十六进制04定义了这个事件。—远程设备开始重启通信当远程设备重新启动通信端口时,存储这种类型的事件字节。通过附带子功能重新启动通信选项(码0001)的诊断功能(码08),可以重新启动远程设备。该功能还能将远程设备置于“错误状态下继续”或“错误状态下停止”模式。如果将远程设备置于“错误状态下继续”模式,则将事件字节加人现存事件记录中。如果将远程设备置于“错误状态下停止”模式,则将事件字节加入事件记录中,并且将其余记录清。。内容为0定义了该事件。7.1115(OxOF)写多个线圈见图21和表44~表460该功能码将一个远程设备中的一个线圈序列的每个线圈强制为ON或OFF。请求PDU指定了被强制的线圈编号。从零开始寻址线圈。因此,编号为1的线圈被寻址为0,请求数据域的内容指定了被请求的ON/OFF状态。数据域中为逻辑“1”的位请求相应输出为ON。为逻辑“0”的位请求相应输出为OFF.正常的响应返回功能码、起始地址和被强制的线圈数量。表44请求PDU二一i00xx000000O1N-x^O-"OFOxFOF7BFFO表45响应PDU卜k}A#b.fi11t}一214;fjEK:vV川斗一{表46错误卜下‘r#m"x"fi19十‘一夯止斗二命)2O,x083FPI04日 GB/Z19582.1-2004FMB)R*OVjgMB**#*ILmbexceptionOxoo01<-=ozmbe-rsp*req_pdu"N=-jVit%(=Nw4ktlAJt-<94lAkE=0440ON;N0,jWMJI)kSAN=0x0780+OfftljPtdi%(jjim=OKnl;t*Lb=OKMBN+1/8,JAR*OA=OKi01A11;mbt}J}p图21写多个输出的状态图这是一个请求从线圈20开始写人10个线圈的实例:请求的数据内容为两个字节:十六进制CDO1(二进制1100110100000001)。二进制位按如下方式对应输出。位:1100110100000001输出:2726252423222120一一--一一一2928传输的第一字节(十六进制CD)对应为输出27^20,最低有效位对应为最低输出(20)0传输的下一字节(十六进制01)对应为输出29^28,最低有效位对应为最低输出(28)0应该用零填充最后数据字节中的未使用位,见表47.表47丰牛布标准分享网www.bzfxw.com GB/Z19582.1-20047.1216(0x10)写多个寄存器见图22和表48一表500使用该功能码在一个远程设备中写连续寄存器块((1^-123个寄存器)。在请求数据域中指定了请求写人的值。将数据打包成每个寄存器两字节。正常的响应返回功能码、起始地址和被写人寄存器的数量。表48请求)迄甚一叁}表49响应牛IjgM1MfIl一2JKfrJ-J}二二砰01x-0010203O^X(-OI0xox0.F.0...F7.,BF,..;月表50错误一一ARe*A1i于斗下万1}}5一仁-01PI02OxA9003A04一IRSAlkM=B01W14*S6M}JBJN=IAR0Mm}3Cb#}e&f!x}AfNi*jfrv*rn*vxfi,x,xi"#ht,E+:tiEftClyRIqA4,7K.V}4}.vTA"112=JK}7.}..}-T-}5里耳日 GB/Z19582.1-2004表57响应寻一仁布表58错误一Agig一一1}}5一‘OX9401,02,03,04A08一一图24读文件记录状态图表59是一个请求从远程设备读两个参量组的实例:组1包括文件4,中的2个寄存器,以寄存器1开始(地址0001),组2包括文件3中的2个寄存器,以寄存器9开始(地址0009)0标准分享网www.bzfxw.com GB/Z19582.1-2004表59少7.1521/6(Ox15/OxO6)写文件记录见图25和表60~表620使用该功能码进行文件记录写人。根据字节数量提供所有请求数据长度,并且根据16位字的数量提供所有记录长度。文件是记录的结构。每个文件包括1000。个记录,寻址这些记录为十进制0000^-9999或十六进制0x0000^-Ox27OF,例如:寻址记录12为120该功能可以写多个参量组。这些组可以是分散的,即不连续的,但每组内的参量必须是连续的。用含有7个字节和数据的单独“子请求”域定义每个组:参量类型:1个字节(必须指定为6)e文件号:2个字节。文件中的起始记录号:2个字节。所写人记录的长度:2个字节。被写人的数据:每个寄存器为2字节。被写人的寄存器数量加上与询问中的所有其他域不能超过Modbus报文PDU允许的长度:253个字节。正常的响应是请求的复制。 GB/Z19582.1-2004表60请求一布表61响应一一仁{表62错误巨IvigigR"B"A一一11}}5}5升01,02,03,04川0x95标准分享网www.bzfxw.com GB/Z19582.1-2004;MB1Rg*A#S2?M9tiB=gM1*0m3b*i*Relx*RceO4&ApkxXtioO0=mn70b_<-<2r_-Ase-lprq_V1,4pj}d*f1u1j04&k_<<_=O04xAF5AKiMiAijik-bjhgEft+M}*AB}1441=iR$iO}6*O0}KMK*0i#11f1fi}i==O-OKbKrsp图25写文件记录状态图表63是一个请求将一个参考组写入远程设备的实例:组包括文件4中的3个寄存器,以寄存器7开始(地址0007)a表63蓄不一 GB/Z19582.1-20047.1622(0x16)屏蔽写寄存器见图26和表64~表660该功能码用于通过利用“AND",屏蔽、"OR",屏蔽以及当前寄存器内容的组合来修改指定的保持寄存器的内容。使用这个功能设置或清除寄存器中不同的位。请求指定了被写人的保持寄存器、被用于“AND”屏蔽的数据以及被用于“OR",屏蔽的数据。从。开始寻址寄存器。因此,寻址寄存器1一16为。^150功能的算法为:结果=(当前内容ANDAnd_Mask)OR(Or_MaskANDAnd-Mask)例如:十六进制二进制当前内容=1200010010And_Mask=F211110010Or_Mask=2500100101And_Mask二OD00001101结果=1700010111注1:如果OrMask值为零,那么结果是当前内容和And-Mask的简单逻辑AND(与)。如果And-Mask值为零,结果等于OrMask值。注2:可以使用读保持寄存器功能(功能码03)读出寄存器的内容。但是,当控制器扫描它的用户逻辑程序时,随之可以改变寄存器的内容。正常的响应是请求的复制。在寄存器被写入之后,返回响应。表64请求一womfAndSAAktOrMask斗三享幸川Mask表65响应AndOr-Mask一14EVMask22f?!V一介一2frV表66错误卜二P*q月二1}}5一OX9601,02,03A04标准分享网www.bzfxw.com GB/Z19582.1-2004二图26屏蔽写保持寄存器状态圈表67是一个利用上述屏蔽值在远程设备中对寄存器5的屏蔽写人的实例。表67导布寸一7.1723(0x17)读/写多个寄存器见图27和表68~表70,这个功能码实现了在一个单独Modbus事务中一个读操作和一个写操作的组合。在读之前进行写操作。 GB/Z19582.1-2004从零开始寻址保持寄存器。因此,寻址保持寄存器1^16为。^-150请求指定了被读取的保持寄存器的起始地址和数目,以及被写人的保持寄存器的起始地址和数目。在写数据域中,字节计数指定随后的字节数目。正常的响应包含所读寄存器组中的数据。在读数据域中,字节计数域指定随后的字节数目。表68请求布于)表69响应二{一牛川表70错误卜}}a}5一+一#}"}01}}}}一一OXs70102,0304标准分享网www.bzfxw.com GB/Z19582.1-2004气图27读/写多个寄存器状态图表71是一个请求从寄存器4开始读6个寄存器并且从寄存器15开始写3个寄存器的实例:表71一乒一 GB/Z19582.1-2004表71(续)牛牛一一7.1824(0x18)读FIFO队列见图28和表72~表740这个功能码允许读远程设备中的先人先出(FIFO)寄存器队列内容。这个功能码返回队列中寄存器的计数,随后为队列的数据。最多可以读32个寄存器:计数加上最多31个队列的数据寄存器。首先返回队列计数寄存器,随后为队列数据寄存器。这个功能码读队列内容,但不能清除队列内容。在正常的响应中,字节计数表示了随后的字节数量,包括队列计数字节和数值寄存器字节(不包括差错校验域)。队列计数是队列中数据寄存器数量(不包括计数寄存器)。如果队列计数大于31,返回一个含有差错码03(非法数据值)的异常响应。表72请求卜tgigFIFOtoft011E升一I}r-v2frV井万OxI80x0000-OxFFFF表73响应价井2N"2x25"一牛一表74错误卜一Vgf4*4一斗下下书扁斗一0x980102,03:pj04日标准分享网www.bzfxw.com GB/Z19582.1-2004}}S}M=B0j1}}*}6}1MiW=gB0Wm"2b}*R}&e"RxA0cAhexmpT}0=b1t0i}o0nr3e"0b}q"}<-rRsppFdVIuF0AFM=IFf0Ot4AAith*E<<03x1iFtMF-BFFIFMO*WAigI=liir$OKmbrsp图28读FIFO队列状态图表75是一个对远程设备读FIFO队列请求的实例。请求是读指针寄存器1246