1、字段字节数描述设备地址1BYTE 型数据,对象的地址。范围1247。每组蓄电池分配一个访问地址,默认情况下组1 地址为1,组2 地址为组1地址加1,以此类推。监测多少组蓄电池,就占用连续的多少个地址。组1 地址可以前台修改,相应组2 地址也会在组1 地址上增1。功能码BYTE 型数据。见“命令解析”。正常情况下发送和应答的功能码一致,异常情况下参见“异常应答机制”。数据区N校验2CRC16 校验,校验生成函数参考附录七。 帧格式图解 在Modbus 串行链路,地址域只含有子节点地址。如前文所述,合法的子节点地址为十进制0 247。每个子设备被赋予1 247 范围中的地址。主节点通过将子节点的地
2、址放到报文的地址域对子节点寻址。当子节点返回应答时, 它将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答。 功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域。 错误检验域是对报文内容执行冗余校验 的计算结果。根据不同的传输模式(RTU or ASCII)使用两种不同的计算方法。4.串行传输模式RTU 它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。Modbus 串行链路上所有设备的传输模式 (和串行口参数) 必须相同。4.1 RTU传输模式串行链路上第一个MODBUS执行的长度约束限制了MODBUS PDU大小(最大RS48
3、5ADU=256字节)。因此,对串行链路通信来说,MODBUS PDU=256-服务器地址(1字节)-CRC(2 字节)253字节。帧描述 : Modbus RTU 帧最大为256 字节。4.2 Modbus 报文RTU帧 由发送设备将Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。在 RTU 模式,报文帧由时长至少为3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作t3.5。整个报文帧必须以连续的字符流发送。如果两个字符之间的空闲间隔大于1.5 个字符时间,则
4、报文帧被认为不完整应该被接收节点丢弃。串通讯的数据帧格式图解串口通信输出格式为:1 位起始位,8 位数据位,1 位停止位,奇校验。默认波特率为2400bps,可调节为1200bps, 2400bps,4800bps, 9600bps。编码系统: 8位二进制报文中每个8 位字节含有两个4 位十六进制字符(09, AF)Bits per Byte: 1 起始位8 数据位, 首先发送最低有效位1 位作为奇偶校验1 停止位偶校验是要求的, 其它模式( 奇校验, 无校验) 也可以使用。为了保证与其它产品的最大兼容性,同时支持无校验模式是建议的。默认校验模式模式必须为偶校验。注 : 使用无校验要求2 个停
5、止位。字符是如何串行传送的:每个字符或字节均由此顺序发送(从左到右):最低有效位(LSB) . . . 最高有效位(MSB)下行数据结构(主机发送到从机数据协议) 起始码 地址码 功能码 数据区 CRC校验 停止码 | | | | | |- - - - - -1、 数据格式:【起始码:0xEB 0x90 0xEB 0x90】起始码:+ 从机地址码(1)+【命令码】(1)【起始地址(2)寄存器数(2)】CRC16校验(2) +停止码(2)(括号内为字节数) CRC16高字节在前低字节在后2、从机地址码为表示广播方式,所有从机都能收到并处理,否则地址码与从机地址相同时从机才响应;因此从机地址范围:
6、1247三上行数据结构(从机发送到主机数据协议) 起始码 地址码 功能码 数据区 CRC校验 停止码- - - - - -2、 数据格式:(1)【寄存器数(2)+N个数据】CRC16校验(2) +停止码(2)(括号内为字节数)CRC16高字节在前低字节在后4.4 帧检验域: 循环冗余校验(CRC)在RTU 模式包含一个对全部报文内容执行的,基于循环冗余校验 (CRC - Cyclical RedundancyChecking) 算法的错误检验域。CRC 域检验整个报文的内容。不管报文有无奇偶校验,均执行此检验。CRC 包含由两个8 位字节组成的一个16 位值。CRC 域作为报文的最后的域附加在
7、报文之后。计算后,首先附加低字节,然后是高字节。CRC高字节为报文发送的最后一个子节。附加在报文后面的CRC 的值由发送设备计算。接收设备在接收报文时重新计算CRC 的值,并将计算结果于实际接收到的CRC 值相比较。如果两个值不相等,则为错误。CRC 的计算, 开始对一个16 位寄存器预装全1。然后将报文中的连续的8 位子节对其进行后续的计算。只有字符中的8个数据位参与生成CRC 的运算,起始位,停止位和校验位不参与CRC计算。CRC 的生成过程中, 每个 8位字符与寄存器中的值异或。然后结果向最低有效位(LSB)方向移动(Shift) 1位,而最高有效位(MSB)位置充零。然后提取并检查LS
8、B:如果LSB 为1, 则寄存器中的值与一个固定的预置值异或;如果LSB 为 0, 则不进行异或操作。这个过程将重复直到执行完8 次移位。完成最后一次(第8 次)移位及相关操作后,下一个8位字节与寄存器的当前值异或,然后又同上面描述过的一样重复8 次。当所有报文中子节都运算之后得到的寄存器忠的最终值,就是CRC。5 数据存储和传输顺序5.1 16bit数据类型字节存储及传输顺序MODBUS 使用一个big-Endian,对于16bit 数据类型, 先传输高字节,再传输低字节。例如3A56H,先传送3AH,再传送56H。输入寄存器和保持寄存器都是16bit 寻址的寄存器。可以认为单个寄存器的位存
9、储顺序也是高字节在前,低子字节在后。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 字符串数据类型存储及传输顺序字符串数据传输时先
10、传输较靠前的字符。字符串数据类型在输入寄存器和保持寄存器存储时,顺序上较靠前的字符存储在较低地址的寄存器中。在一个寄存器中,较靠前的8bit 字符存储在高字节上,较靠后的8bit 字符存储在低字节上。5.4. 布尔型数据类型存储及传输顺序布尔型数据主要分布在离散输入寄存器中。离散输入寄存器实际以字节为单位存储和传输。较低地址的寄存器存储在一个字节的较低位上。传输时,先传输较低地址的寄存器值。存储较低地址的8 个寄存器的字节先于存储较高地址的8 个寄存器的字节传输。例如:连续的16 个离散输入寄存器的值从低地址到高地址依次为:1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1。传输时
11、分两个字节传输,先传输二进制1,1,0,1,1,1,0,0 八个位,实际存储的值为二进制00111011(注意低位先传),即3BH。再传送1,1,0,1,1,1,0,1 八个位,实际存储的值为B,即BBH。6.MODBUS应用层协议:命令解析和“数据区”定义命令解析本章中所罗列的发送接收数据内容仅指“命令结构”一节中所提到的“数据区”。6.1. 标准MODBUS命令 读离散输入寄存器02H在一个远程设备中,使用该功能码读取离散量输入的1 至2000 连续状态。请求PDU 详细说明了起始地址,即指定的第一个输入地址和输入编号。从零开始寻址输入。因此寻址输入1-16 为0-15。根据数据域的每个比
12、特将响应报文中的离散量输入分成为一个输入。指示状态为1= ON 和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输入。其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。 响应 PDU1 个字节0x02字节数 1 个字节N*输入状态 N*1个字节 *N输出数量/8,如果余数不等于0,那么 N = N+1将离散量输入状态204-197表示为十六进制字节值AC,或二进制1010 1100。输入204是这个字节的MSB,输入197
13、 是这个字节的LSB。将离散量输入状态218-213表示为十六进制字节值35,或二进制0011 0101。输入218位于左侧第3 比特,输入213 是LSB。注:用零填充2 个剩余比特(一直到高位端)。6.1.2 读输入寄存器04H在一个远程设备中,使用该功能码读取1 至大约125 的连续输入寄存器。请求PDU 说明了起始地址和寄存器数量。从零开始寻址寄存器。因此,寻址输入寄存器1-16 为0-15。将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。将输入寄存器9 的内容表示为两个十六进制字节值
14、00 0A,或十进制10。6.1.3 读保持寄存器03H 在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求PDU说明了起始寄存器因此,寻址寄存器1-16 为0-15。将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。将寄存器108的内容表示为两个十六进制字节值02 2B,或十进制555。将寄存器109-110的内容分别表示为十六进制00 00 和00 64,或十进制0 和100。 报告从站ID 11H表6-1-4-1 报告从站ID 命令发送数据区说明:为了及时监视到设备重启,要求每次轮训数据时都必须进行一次“报告从站ID”。6.1.5 MODBUS
15、 异常响应当客户机设备向服务器设备发送请求时,客户机希望一个正常响应。从主站询问中出现下列四种可能事件之一: 如果服务器设备接收到无通信错误的请求,并且可以正常地处理询问,那么服务器设备将返回一个正常响应。 如果由于通信错误,服务器没有接收到请求,那么不能返回响应。客户机程序将最终处理请求的超时状态。 如果服务器接收到请求,但是检测到一个通信错误(奇偶校验、LRC、CRC、.),那么不能返回响应。 如果服务器接收到无通信错误的请求,但不能处理这个请求(例如,如果请求读个不存在的输出或寄存器),服务器将返回一个异常响应,通知用户错误的本质特性。异常响应报文有两个与正常响应不同的域:功能码域:在正
16、常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为0(它们的值都低于十六进制80)。在异常响应中,服务器设置功能码的MSB 为1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制80。通过设置功能码的MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应中,服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。客户机请求和服务器异常响应的实例:在这个实例中,客户机对服务器设备寻址请求。功能码(01)用于读输出状态操作。它将请求地址
17、1245(十六进制04A1)的输出状态。值得注意的是,象输出域(0001)号码说明的那样,只读出一个输出。如果在服务器设备中不存在输出地址,那么服务器将返回异常码(02)的异常响应。这就说明从站的非法数据地址。从下页开始异常码的列表。异常判断流程参考图7 MODBUS 对寄存器表访问模式基本表格对象类型访问类型内容离散量输入寄存器表单个比特只读 /O 系统提供这种类型数据输入寄存器表16-比特字只读I/O 系统提供这种类型数据保持寄存器表读写通过应用程序改变这种类型数据8 程序设计结构当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响
18、应来说,服务器仅对原始功能码响应。对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1。MODBUS 协议定义了三种PDU。它们是: MODBUS请求PDU,mb_req_pdu MODBUS响应PDU,mb_rsp_pdu MODBUS异常响应PDU,mb_excep_rsp_pdu定义mb_req_pdu 为:mb_req_pdu = function_code, request_data,其中function_code - 1个字节 MODBUS 功能码request_data - n个字节,这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量
19、、子功能码等信息。定义mb_rsp_pdu 为:mb_rsp_pdu = function_code, response_ data,其中response_data - n个字节,这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。定义mb_excep_rsp_pdu 为:mb_excep_rsp_pdu = function_code, request_data,其中function_code - 1个字节 MODBUS 功能码+ 0x80exception_code - 1个字节,在下表中定义了MODBUS 异常码。9. 数据类型说明:BYTE unsigned
20、 charINT unsigned shortFLOAT floatULONG unsigned long9.1附录一离散输入寄存器表 功能码:起始地址十进制十六进制说明( 读写设置告警时标)年 0000BYTE00009999月0001112日0002131时30003023分40004059秒500051号板电压过高 600060-无告警,1-告警1号板电压过低 700071号板大板没放出电流800081号板内阻电压异常900091号板均充结束10000A0-无提示;1-核容放电结束提示。在核容放电结束后1号板核容放电结束提示11000B在核容放电结束后,该提示信号维持1分钟,然后自动取消
21、。1号温度过高12000C1号板通讯故障13000D2号板电压过高 14000E2号板电压过低 15000F21号板大板没放出电流1600102号板内阻电压异常1700112号板均充结束1800121-放电结束提示。2 号板核容放电结束提示 1900132号板通讯故障2000142号温度过高210015开关量12200160断,1通开关量2230017开关量3240018开关量4250019附录二保持寄存器表(读写)功能码:0x03起始地址十六进制(Byte)数据类型范围单位( 读写设置巡检时标)本次测量设备IDINT电池类型: 容量参数电池类型 : 电压参数设备最大板数051号板测量电池数2号板电池组上限电压0098float0999V电池组下限电压009C ( 读写设置巡检间隔时间)UNLLONG(读写快速巡检设置时间 )UNLONG (读写设置内阻定检时标 )28001C(读写设置连接内阻定检时标 )30001E电池报警设置单节电池上限电压500032单节电池下限电压54003658003A62003E附录三 输入寄存器表(只读)功能码:0x04(Byte )( 巡检最新时间1 )-(巡检获取测量值1)- 1号板总电压F
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1