蓄电池组在线监测装置MODBUS通信协议1 MODBUS通信协议原理2 物理层接口蓄电池组在线监测装置,采用RS485 线路进行通信。
3 Modbus 串行数据链路层协议3.1 Modbus主站/从站协议原理Modbus 串行链路协议是一个主-从协议。
在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号为247 ) 连接于同一个串行总线。
Modbus 通信总是由主节点发起。
子节点在没有收到来自主节点的请求时,从不会发送数据。
子节点之间从不会互相通信。
主节点在同一时刻只会发起一个Modbus 事务处理。
主节点以两种模式对子节点发出Modbus 请求:→ 在单播模式,主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个'应答')。
在这种模式,一个Modbus 事务处理包含2 个报文:一个来自主节点的请求,一个来自子节点的应答。
每个子节点必须有唯一的地址(1 到247),这样才能区别于其它节点被独立的寻址。
→ 在广播模式,主节点向所有的子节点发送请求。
对于主节点广播的请求没有应答返回。
广播请求一般用于写命令。
所有设备必须接受广播模式的写功能。
地址0 是专门用于表示广播数据的。
单播和广播模式的区别在一个多点的结构下(如RS485)更加易于理解。
3.2 Modbus地址规则Modbus 寻址空间有256 个不同地址。
0 1~47 55~248广播地址子节点单独地址保留Modbus 主节点没有地址,只有子节点必须有一个地址。
该地址必须在Modbus 串行总线上唯一。
图解如下:3.3 串行链路数据帧格式3.3.1 Modbus帧描述MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。
特定总线或网络上的MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。
表3-2 数据帧格式表字段字节数描述设备地址1BYTE 型数据,对象的地址。
范围1~247。
每组蓄电池分配一个访问地址,默认情况下组1 地址为1,组2 地址为组1地址加1,以此类推。
监测多少组蓄电池,就占用连续的多少个地址。
组1 地址可以前台修改,相应组2 地址也会在组1 地址上增1。
功能码 1 BYTE 型数据。
见“命令解析”。
正常情况下发送和应答的功能码一致,异常情况下参见“异常应答机制”。
数据区N见“命令解析”。
校验 2 CRC16 校验,校验生成函数参考附录七。
帧格式图解▪ 在Modbus 串行链路,地址域只含有子节点地址。
如前文所述,合法的子节点地址为十进制0 –247。
每个子设备被赋予1 –247 范围中的地址。
主节点通过将子节点的地址放到报文的地址域对子节点寻址。
当子节点返回应答时,它将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答。
▪ 功能码指明服务器要执行的动作。
功能码后面可跟有表示含有请求和响应参数的数据域。
▪ 错误检验域是对报文内容执行"冗余校验" 的计算结果。
根据不同的传输模式(RTU or ASCII)使用两种不同的计算方法。
4.串行传输模式RTU它定义了报文域的位内容在线路上串行的传送。
它确定了信息如何打包为报文和解码。
Modbus 串行链路上所有设备的传输模式(和串行口参数) 必须相同。
4.1 RTU传输模式串行链路上第一个MODBUS执行的长度约束限制了MODBUS PDU大小(最大RS485ADU=256字节)。
因此,对串行链路通信来说,MODBUS PDU=256-服务器地址(1字节)-CRC(2 字节)=253字节。
帧描述:→ Modbus RTU 帧最大为256 字节。
4.2 Modbus 报文RTU帧由发送设备将Modbus 报文构造为带有已知起始和结束标记的帧。
这使设备可以在报文的开始接收新帧,并且知道何时报文结束。
不完整的报文必须能够被检测到而错误标志必须作为结果被设置。
在RTU 模式,报文帧由时长至少为3.5 个字符时间的空闲间隔区分。
在后续的部分,这个时间区间被称作t3.5。
整个报文帧必须以连续的字符流发送。
如果两个字符之间的空闲间隔大于1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。
串通讯的数据帧格式图解4.3.1///*****************串口传输设置********************蓄电池组在线监测装置,采用RS485 线路进行通信。
串口通信输出格式为:1 位起始位,8 位数据位,1 位停止位,奇校验。
默认波特率为2400bps,可调节为1200bps, 2400bps,4800bps, 9600bps。
编码系统: 8–位二进制报文中每个8 位字节含有两个4 位十六进制字符(0–9,A–F)Bits per Byte: 1 起始位8 数据位,首先发送最低有效位1 位作为奇偶校验1 停止位偶校验是要求的,其它模式( 奇校验,无校验) 也可以使用。
为了保证与其它产品的最大兼容性,同时支持无校验模式是建议的。
默认校验模式模式必须为偶校验。
注: 使用无校验要求2 个停止位。
字符是如何串行传送的:每个字符或字节均由此顺序发送(从左到右):最低有效位(LSB) . . . 最高有效位(MSB)4.3.2///*****************RTU数据格式********************一。
下行数据结构(主机发送到从机数据协议)起始码地址码功能码数据区CRC校验停止码| | | | | |-------------- ------------------- ----------------- ------------------------------- ------------------ ----------1、数据格式:【起始码:0xEB 0x90 0xEB 0x90】起始码:+ 从机地址码(1)+【命令码】(1)+【起始地址(2)+寄存器数(2)】+CRC16校验(2) +停止码(2)(括号内为字节数)CRC16高字节在前低字节在后2、从机地址码为0表示广播方式,所有从机都能收到并处理,否则地址码与从机地址相同时从机才响应;因此从机地址范围:1~247三.上行数据结构(从机发送到主机数据协议)起始码地址码功能码数据区CRC校验停止码| | | | | |-------------- ------------------- ----------------- ------------------------------- ------------------ -----------2、数据格式:【起始码:0xEB 0x90 0xEB 0x90】起始码:+ 从机地址码(1)+【命令码】(1)+【寄存器数(2)+N个数据】+CRC16校验(2) +停止码(2)(括号内为字节数)CRC16高字节在前低字节在后4.4 帧检验域: 循环冗余校验(CRC)在RTU 模式包含一个对全部报文内容执行的,基于循环冗余校验(CRC - Cyclical Redundancy Checking) 算法的错误检验域。
CRC 域检验整个报文的内容。
不管报文有无奇偶校验,均执行此检验。
CRC 包含由两个8 位字节组成的一个16 位值。
CRC 域作为报文的最后的域附加在报文之后。
计算后,首先附加低字节,然后是高字节。
CRC高字节为报文发送的最后一个子节。
附加在报文后面的CRC 的值由发送设备计算。
接收设备在接收报文时重新计算CRC 的值,并将计算结果于实际接收到的CRC 值相比较。
如果两个值不相等,则为错误。
CRC 的计算, 开始对一个16 位寄存器预装全1。
然后将报文中的连续的8 位子节对其进行后续的计算。
只有字符中的8个数据位参与生成CRC 的运算,起始位,停止位和校验位不参与CRC计算。
CRC 的生成过程中,每个8–位字符与寄存器中的值异或。
然后结果向最低有效位(LSB)方向移动(Shift) 1位,而最高有效位(MSB)位置充零。
然后提取并检查LSB:如果LSB 为1,则寄存器中的值与一个固定的预置值异或;如果LSB 为0,则不进行异或操作。
这个过程将重复直到执行完8 次移位。
完成最后一次(第8 次)移位及相关操作后,下一个8位字节与寄存器的当前值异或,然后又同上面描述过的一样重复8 次。
当所有报文中子节都运算之后得到的寄存器忠的最终值,就是CRC。
5 数据存储和传输顺序5.1 16bit数据类型字节存储及传输顺序MODBUS 使用一个‘big-Endian’,对于16bit 数据类型,先传输高字节,再传输低字节。
例如3A56H,先传送3AH,再传送56H。
输入寄存器和保持寄存器都是16bit 寻址的寄存器。
可以认为单个寄存器的位存储顺序也是高字节在前,低子字节在后。
5.2 32bit数据类型字存储及传输顺序MODBUS 使用一个‘big-Endian’,对于32bit 浮点型、32bit 整型等32bit 数据类型,先传输高16bit 字,再传输低16bit字。
比如8DF377A2H 数据,先传输8DF3H,再传输77A2H。
在输入寄存器和保持寄存器中,32bit 数据占用连续的两个寄存器地址。
相应低地址存储高16 位,高地址存放低16 位。
8DF377A2H 数值如果用地址12、13 连个寄存器来存放,则地址12 寄存器存放8DF3H,地址13 寄存器存放77A2H。
5.3 字符串数据类型存储及传输顺序字符串数据传输时先传输较靠前的字符。
字符串数据类型在输入寄存器和保持寄存器存储时,顺序上较靠前的字符存储在较低地址的寄存器中。
在一个寄存器中,较靠前的8bit 字符存储在高字节上,较靠后的8bit 字符存储在低字节上。
5.4. 布尔型数据类型存储及传输顺序布尔型数据主要分布在离散输入寄存器中。
离散输入寄存器实际以字节为单位存储和传输。
较低地址的寄存器存储在一个字节的较低位上。
传输时,先传输较低地址的寄存器值。
存储较低地址的8 个寄存器的字节先于存储较高地址的8 个寄存器的字节传输。
例如:连续的16 个离散输入寄存器的值从低地址到高地址依次为:1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1。
传输时分两个字节传输,先传输二进制1,1,0,1,1,1,0,0 八个位,实际存储的值为二进制00111011(注意低位先传),即3BH。
再传送1,1,0,1,1,1,0,1 八个位,实际存储的值为10111011B,即BBH。
6.MODBUS应用层协议:命令解析和“数据区”定义命令解析本章中所罗列的发送接收数据内容仅指“命令结构”一节中所提到的“数据区”。
6.1. 标准MODBUS命令6.1.1. 读离散输入寄存器02H在一个远程设备中,使用该功能码读取离散量输入的1 至2000 连续状态。