MODBUS规约说明一.传输方式RTU方式二.通讯数据格式信息传输为异步方式,并以字节为单位。在主站和从站之间的传递的通讯信息是如下的字格式:字格式(串行数据)二进制起始位0位数据位8位奇偶校验位无:没有奇偶校验停止位1位三.事务处理定义根据响应处理结果,可以建立两种类型响应:1.正确MODBUS响应:响应功能码=请求功能码2.异常MODBUS响应用来为客户机提供处理过程中与被发现的差错相关的信息;响应功能码=请求功能码+0x80;提供一个异常码来指示差错原因。四.功能码描述1.0x01读线圈根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为1=ON和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。请求PDU功能码1个字节0x01起始地址2个字节0x0000至0xFFFF线圈数量2个字节1至2000(0x7D0)响应PDU功能码1个字节0x01字节数1个字节N,N=输出数量/8,如果余数不等于0,那么N=N+1线圈状态N个字节错误差错码1个字节0x81异常码1个字节01或02或03或042.0x02读离散量输入根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为1=ON和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输入。其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。请求PDU功能码1个字节0x02起始地址2个字节0x0000至0xFFFF输入数量2个字节1至2000(0x7D0)响应PDU功能码1个字节0x02字节数1个字节N,N=输出数量/8,如果余数不等于0,那么N=N+1输入状态N个字节错误差错码1个字节0x82异常码1个字节01或02或03或043.0x03读保持寄存器将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。请求PDU功能码1个字节0x03起始地址2个字节0x0000至0xFFFF寄存器数量2个字节N(1至125)响应PDU功能码1个字节0x02字节数1个字节2*N寄存器值2*N个字节错误差错码1个字节0x83异常码1个字节01或02或03或044.0x04读输入寄存器将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。请求PDU功能码1个字节0x04起始地址2个字节0x0000至0xFFFF输入寄存器数量2个字节N(1至125)响应PDU功能码1个字节0x04字节数1个字节2*N输入寄存器值2*N个字节错误差错码1个字节0x84异常码1个字节01或02或03或045.0x05写单个线圈在一个远程设备上,使用该功能码写单个输出为ON或OFF。请求数据域中的常量说明请求的ON/OFF状态。十六进制值FF00请求输出为ON。十六进制值0000请求输出为OFF。其它所有值均是非法的,并且对输出不起作用。请求PDU说明了强制的线圈地址。从零开始寻址线圈。因此,寻址线圈1为0。线圈值域的常量说明请求的ON/OFF状态。十六进制值0XFF00请求线圈为ON。十六进制值0X0000请求线圈为OFF。其它所有值均为非法的,并且对线圈不起作用。正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。请求PDU功能码1个字节0x05输出地址2个字节0x0000至0xFFFF输出值2个字节0x0000至0xFF00响应PDU功能码1个字节0x05输出地址2个字节0x0000至0xFFFF输出值2个字节0x0000至0xFF00错误差错码1个字节0x85异常码1个字节01或02或03或046.0x06写单个寄存器在一个远程设备中,使用该功能码写单个保持寄存器。请求PDU说明了被写入寄存器的地址。从零开始寻址寄存器。因此,寻址寄存器1为0。正常响应是请求的应答,在写入寄存器内容之后返回这个正常响应。请求PDU功能码1个字节0x06寄存器地址2个字节0x0000至0xFFFF寄存器值2个字节0x0000至0xFFFF响应PDU功能码1个字节0x06寄存器地址2个字节0x0000至0xFFFF寄存器值2*N个字节0x0000至0xFFFF错误差错码1个字节0x86异常码1个字节01或02或03或047.0x10写多个寄存器在一个远程设备中,使用该功能码写连续寄存器块(1至约120个寄存器)。在请求数据域中说明了请求写入的值。每个寄存器将数据分成两字节。正常响应返回功能码、起始地址和被写入寄存器的数量。请求PDU功能码1个字节0x10起始地址2个字节0x0000至0xFFFF寄存数量2个字节N(0x00001至0x0078)字节数1个字节2*N寄存器值N*2个字节响应PDU功能码1个字节0x10起始地址2个字节0x0000至0xFFFF寄存器数量2个字节N(0x00001至0x0078)错误差错码1个字节0x90异常码1个字节01或02或03或04五。MODBUS异常响应当客户机设备向服务器设备发送请求时,客户机希望一个正常响应。从主站询问中出现下列四种可能事件之一:1.如果服务器设备接收到无通信错误的请求,并且可以正常地处理询问,那么服务器设备将返回一个正常响应。2.如果由于通信错误,服务器没有接收到请求,那么不能返回响应。客户机程序将最终处理请求的超时状态。3.如果服务器接收到请求,但是检测到一个通信错误(奇偶校验、LRC、CRC、...),那么不能返回响应。客户机程序将最终处理请求的超时状态。4.如果服务器接收到无通信错误的请求,但不能处理这个请求(例如,如果请求读一个不存在的输出或寄存器),服务器将返回一个异常响应,通知用户错误的本质特性。异常响应报文有两个与正常响应不同的域:功能码域:在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为0(它们的值都低于十六进制80)。在异常响应中,服务器设置功能码的MSB为1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制80。通过设置功能码的MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应中,服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。MODBUS异常码代码名称含义01非法数据值对于从站来说,询问中包括的值是不可允许的值。这个值指示了组合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。02非法数据地址对于从站来说,询问中接收到的数据地址是不可允许的地址。特别是,参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,带有偏移量96和长度4的请求会成功,带有偏移量96和长度5的请求将产生异常码02。03非法数据值对于从站来说,询问中包括的值是不可允许的值。这个值指示了组合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。04从站设备故障当从站正在设法执行请求的操作时,产生不可重新获得的差错。六。用Modbus规约传输数据,每一类数据的具体数据格式解释1.遥测数据可以使用功能码03或者04,每个遥测为16位带符号数据2.输入或输出状态功能码为01或02或者03,用03读的时候,也是每个数据位标识一个状态,1为ON,0为OFF,第一个状态在第一个字节的LSB位,后面的依次类推。3.电度数据功能码为03,两个字组合为一个电度数据,低字在前,高字在后。4.遥控功能码为05,ON写的值为0xFF00,OFF写的值为0x00005.对钟功能码为0x10,格式可以为IEC格式或者是UNIX格式,高字和高字节在前面。6.soe根据不同的子站定义来做