MODBUS通信协议一.MODBUS通信协议概述1.1.MODBUS通信协议概述MODBUS通信协议是由美国Modicon公司研发和提出的,目前已经成为国际通用标准。MODBUS通信协议工作在ISO/OSI模型的数据链路层,其工作条件是物理层通信接口已经建立并且工作正常。MODBUS通信协议主要包括如下内容:●MODBUS通信接口MODBUS通信接口符合RS232C/RS485以及兼容的串行接口,该接口定义了针脚、电缆、信号位、波特率、奇偶校验。各种智能设备能够直接利用MODBUS接口规约进行组网。2●MODBUS通信符合主从的通信模式通信只能由主站主动发起并传送给从站。若主站发出的是广播命令,则从站不给予任何回应;若主站发出的是行动命令,则从站必须给予回应。从站的回应中包括描述命令执行域信息、数据表以及错误检验域信息;若从站不能执行该命令,则从站将建立错误消息并作为回应发送回去。自主站发至从站的信息报文称为命令或下行通信帧,而自从站发至主站的信息报文则称为响应或上行通信帧。●MODBUS通信的两种数据传输方式:ASCII和RTU模式当数据代码采用ASCII数据传输方式时被称为MODBUS-ASCII。当数据代码采用RTU(远程终端单元)数据传输方式时被称为MODBUS-RTU。在以RTU数据传输方式下,1个8Bits的字节由2个4Bits的16进制字符构成。十进制/16进制/二进制数代码表如下:MODBUS-RTU在发送1个字节时其中的位分布如下:数值(十进制代码)十六进制代码(H表示十六进制数)二进制代码(B表示二进制数)000H0000B101H0001B202H0010B303H0011B404H0100B505H0101B606H0110B707H0111B808H1000B909H1001B100AH1010B110BH1011B120CH1100B130DH1101B140EH1110B150FH1111B1█1位起始位2█8位数据位3█1位奇偶校验位,若选择无校验则无本位4█1位停止位,若无奇偶校验则为2位停止位(多数情况下仍然采用1位停止位)在MODBUS-RTU模式下,错误校验码采用CRC16模式。若无特别说明,在本文中所描述的通信协议均为MODBUS-RTU。5●MODBUS-RTU的消息帧结构MODBUS-RTU的消息帧结构如下:█地址:指从站的ID地址当主站向某从站发送消息时将该从站的地址放入消息帧的地址域中;当从站发送回应消息时,将自己的地址放入消息帧的地址域中以便主站知道哪个从站作了回应。地址0为广播命令。当MODBUS网络为更复杂的网络时,广播命令可能会取消或以其它形式取代。从站地址的范围为1-247(十进制),但为了与RS232C/RS485接口配合一般选择为1-32。6█功能域:指主站发布的功能命令虽然Modicon公司发布了多条MODBUS功能命令,但常用的命令只有9条,列表如下:起始位地址域功能域或命令代码域数据域CRC校验域停止位T1-T2-T3-T48Bit8BitN个8Bit16BitT1-T2-T3-T4命令代码(十六进制)定义说明01H读继电器输出状态02H读开关量DI输入状态03H读寄存器组04H读输入模拟量寄存器组05H单路继电器输出06H写单个寄存器07H读异常状态0FH写多个寄存器10H写寄存器组若从站对主站发布的命令有异议,则从站将功能域的最高位置1作为回应消息的功能域。例如若主站发布的命令代码是03H即二进制00000011B,则从站回应的异议功能代码是83H即二进制10000011B。█数据域:数据区数据域的集合是由若干组2位16进制数构成的,其中包括寄存器地址、要处理项的数目和域中实际数据字节数。对应于03H,数据域的结构是:寄存器地址高字节+寄存器地址低字节+寄存器数量高字节+寄存器数量低字节对应于10H,数据域的结构是:寄存器地址高字节+寄存器地址低字节+寄存器数量高字节+寄存器数量低字节+字节数量+第1寄存器数值+第2寄存器数值+…+第N寄存器数值寄存器地址的编码:寄存器地址范围功能主站信息帧中的地址十进制十进制十六进制0XXXX基址数字量输出区0000-9999)0000-270FH1XXXX基址数字量输入区10000-199992710-4E1FH2XXXX基址预留区20000-299994E20-752FH3XXXX基址输入寄存器区30000-399997530-9C3FH4XXXX基址保持寄存器区40000-499999C40-C34FH5XXXX基址预留区50000-65535C350-FFFFH注意当主站需要读从站中某寄存器数据,则从站返回的消息帧中数据所在真实寄存器地址为返回地址减1。例如在下图中:主站报文中填写的寄存器地址为8656,且48656寄存器中的真实数据为0010H。若采用03H命令读取从8656开始的连续4个寄存器中的数据,由图中可见返回的数据0010H出现在48657寄存器中。数据域的长度没有限制,但信息帧总长度不得超过256个字节。█CRC校验域:CRC16校验CRC校验通过对信息帧的[地址+功能域+数据域]实施以CRC16为除数的不借位除法操作,得到的商作为CRC校验码随同[地址+功能域+数据域]构成完整信息帧发送给对方,对方在接到报文后再次进行CRC16不借位操作,若2套CRC校验码相同则确认报文正确,否则将要求对方重新发报文。例如:若MODBUS从站的地址为01H,功能域为03H读寄存器命令,保持寄存器的首地址为48656即21D0H,被读寄存器的数量为4即0004H,则CRC校验码如下:完整的信息帧为:010321D000044FCC寄存器的地址为:48656,实际十进制地址为:8656,换算为十六进制地址为:21D0H。1.2.MODBUS网络概述MODBUS支持RS485规约,但网络结构必须为链形拓扑。在上图中,AC31系列PLC通过3套RS485接口与多套M102-M以MODBUS网络结构组网。注意在上图中每个RS485接口接入21套M102-M。在上图中,AC500与AC31同样采用RS485/MODBUS进行组网,AC500的1套通信接口最大组网能力为31套AC31系列PLC。MODBUS网络的通信速率与通信双方的距离有关。通信速率与距离的关系见下表,注意该表的数值仅供参考:速率,单位:bps参考距离,单位:米240012004800120096001200192001200336001000384001000576008007500080076800800115200600若MODBUS网络的通信速率确定后,则发送信息帧所需时间可以计算出来。计算方法如下:以通信速率为9600bps为例。若按MODBUS-RTU发送1个字节为10个位来计算则需时1.04毫秒;若按MODBUS-RTU发送1个字节为11个位来计算则需时1.15毫秒。按前例的信息帧(010321D000044FCC)来计算总共需要发送8个字节,则发送时间为1毫秒(1个字节为10位)或9.17毫秒(1个字节为11位)。考虑到传输延迟,故上述传输时间可按10毫秒来计算。2主要命令的信息帧行规以下行规摘自《ModiconModbusProtocolReferenceGuide》1)01/01H命令●01命令主站信息帧结构如下:“从站地址”+“功能码=01H”+“起始地址高字节”+“起始地址低字节”+“线圈数量高字节”+“线圈数量低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”2●01命令从站信息帧结构如下:“从站地址”+“功能码=01H”+“字节数量”+“状态字(线圈27-20)”+“状态字(线圈35-28)”++“状态字(线圈43-36)”+“状态字(线圈51-44)”+“状态字(线圈58-52)”+“CRC16校验码低字节”+“CRC16校验码高字节”请注意线圈的排列次序:在数据区中线圈组对应的字节按从小到大排列,而在某个字节中的线圈按从大到小排列。2)02/02H命令1●02命令主站信息帧结构如下:1“从站地址”+“功能码=02H”+“起始地址高字节”+“起始地址低字节”+“点数量高字节”+“点数量低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”1●02命令从站信息帧结构如下:1“从站地址”+“功能码=02H”+“字节数量”+“状态字(inputs10204-10197)”+“状态字(inputs10212-10205)”+“状态字(inputs10218-10213)”+“CRC16校验码低字节”+“CRC16校验码高字节”3)03/03H命令1●03命令主站信息帧结构如下:1“从站地址”+“功能码=03H”+“寄存器地址高字节”+“寄存器地址低字节”+“寄存器数量高字节”+“寄存器数量低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”1●03命令从站信息帧结构如下:1“从站地址”+“功能码=03H”+“状态字高字节(RegisterAddress40108)”+“状态字低字节(RegisterAddress40108)”+“状态字高字节(RegisterAddress40109)”+“状态字低字节(RegisterAddress40109)”+“状态字高字节(RegisterAddress40110)”+“状态字低字节(RegisterAddress40110)”+“CRC16校验码低字节”+“CRC16校验码高字节”4)05/05H命令1●05命令主站信息帧结构如下:1“从站地址”+“功能码=05H”+“线圈地址高字节”+“线圈地址低字节”+“线圈状态字高字节”+“线圈状态字低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”1●05命令从站信息帧结构如下:1“从站地址”+“功能码=05H”+“线圈地址高字节”+“线圈地址低字节”+“线圈状态字高字节”+“线圈状态字低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”5)06/06H命令1●06命令主站信息帧结构如下:1“从站地址”+“功能码=06H”+“寄存器地址高字节”+“寄存器地址低字节”+“数据状态字高字节”+“数据状态字低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”1●06命令从站信息帧结构如下:1“从站地址”+“功能码=06H”+“寄存器地址高字节”+“寄存器地址低字节”+“数据状态字高字节”+“数据状态字低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”6)15/0FH命令1●0F命令的主站信息帧结构如下:1“从站地址”+“命令码=0FH”+“线圈地址高字节”+“线圈地址低字节”+“线圈数量高字节”+“线圈数量低字节”+“字节数量”+“线圈状态高字节(继电器=RL8-RL1)”+“线圈状态低字节(继电器=RL16-RL9)”+“CRC16校验码低字节”+“CRC16校验码高字节”1●0F命令的返回信息帧结构如下:1“从站地址”+“命令码=0FH”+“线圈地址高字节”+“线圈地址低字节”+“线圈数量高字节”+“线圈数量低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”7)16/10H命令1●10命令主站信息帧结构如下:1“从站地址”+“命令码=10H”+“寄存器起始地址高字节”+“寄存器起始地址低字节”+“寄存器数量高字节”+“寄存器数量低字节”+“所有需要操作的寄存器字节总数量”+“第1寄存器内容高字节”+“第1寄存器内容低字节”+“第2寄存器内容高字节”+“第2寄存器内容低字节”+…+“CRC16校验码低字节”+“CRC16校验码高字节”2●10命令从站信息帧结构如下:“从站地址”+“命令码=10H”+“所有需要操作的寄存器字节总数量”+“寄存器数量高字节”+“寄存器数量低字节”+“CRC16校验码低字节”+“CRC16校验码高字节”薃肀莂蒃袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿羁膂莈蚅袇膁蒀蒈螃膀膀蚃虿腿节