找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7019|回复: 0
打印 上一主题 下一主题
收起左侧

Modbus DTU与服务端间的通讯协议

[复制链接]
跳转到指定楼层
楼主
ID:398336 发表于 2018-9-15 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一.数据帧格式
              为防止DTU和服务器传输过程中因网络原因导致拆包、粘包,因此约定传输的基本数据帧格式如下,DTU上传和服务器下发的数据包均需满足此数据帧格式要求。服务器应解决TCP传输过程中的拆包粘包问题,确保每次处理的是完整的数据包。
              基本数据帧格式:
域名
Type
Length
Data[n]
CheckSum
长度(byte)
1
2
n
1
含义
包类型
包长
n个数据
校验和
备注
决定了Data的内容
从Data到CheckSum的字节数。大端格式(高字节在前)

从Type开始按字节累加到本域的前一字节.每次累加进位去掉。
Type:数据包类型,也理解为Command. 不同的Tyep其对应的Length大小可能不同,Data也有所区别。
Length:在此之后的数据长度。大端格式。
CheckSum:校验和,虽然TCP传输协议本身已经有CRC校验,但网络传输路径的复杂性仍然无法保证数据一定无误,因此需要对每个数据帧(包)再进行简单的校验。

二.Login和LoginAck及其Data含义
DTU每次和服务器建立TCP连接后,首先必须先往服务器发Login命令,服务器根据业务需要判断其合法性(鉴权),然后回复LoginAck命令。
传输方向
Type名称
Type
含义
Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
上行
Login
0x12
DTU请求登陆服务器
PSN(uint32)|PASS(uint32)|PName(uchar[8])|CurVer(uint16)| CCID(char[20]) |
下行
LoginAck
0x12
服务器应答DTU登陆请求
Right(uchar)|FoTaFlag(uchar)|TickTime(uchar)|SendTestMode(uchar)|SendTestTime(uchar)|NewVer(uint16)|NewPort(uint16)|NewIP(uchar[4])|
PSN:DTU编码.每个DTU都有唯一的产品序列号(或简称DTU编码)。
PASS: DTU密码。
              服务器建立PSN和PASS关系表,初始化情况下PASS为0,当DTU请求Login时,如果数据库里PSN对应的PASS为0时,不需比对直接通过,并将DTU上传的PASS值写入数据库中,下次DTU再登录服务器时,因数据库的PASS非0而需要比较DTU上传的PASS和数据库的PASS是否相同,不同则认为鉴权失败。
PName:产品名称,如HS121, 不够8字节的后面补0.
CurVer:当前DTU应用版本号。
CCID:  SIM卡的ICCID号(20个字符)。
Right:服务器鉴权结果。
              Right=0xEA表示鉴权成功! 其他值均表示鉴权失败。如果鉴权失败,服务器应在发完这条响应数据包后主动关闭此TCP连接。
FoTaFlag:  空中升级配置标志:
              FoTaFlag =0--不支持空中升级;
              FoTaFlag =1--可手动空中升级;用户通过串口或按键组合才能触发触发空中升级。
              FoTaFlag =2--可自动空中升级。DTU收到此信息后应马上进入空中升级模式。
TickTime:上传心跳时间间隔
SendTestMode:  数据上传模式,可以选择服务器查询,或者DTU自动上传。(目前此模式无效,只支持定时上传)
              SendTestMode=0 :任何一个测量值发生变化终端马上上传,但上传速度不大于SendTestTime              所设定的时间。如SendTestTime=3则最快上传速度为3              秒一次。
              SendTestMode =255:忽略Test值是否有变化,只按照SendTestTime设定的时间间隔上传。
              SendTestMode=x( 0<x<255):当第1~x个Test参数中有任何一个变化时马上上传,否则将根据SendTestTime所设定的时间定时上传. Test测量值顺序按终端和服务器约定的SendTest命令中Data的TestValue顺序排列,2字节一组(组成unsigned short 或short类型数据)。
SendTestTime: DTU上传Test时间,在没有服务端下发查询的时候DTU以此时间间隔上传DTU保存值,为0时表示不自动上传。
NewVer:表示当前DTU软件的最新版本号,0表示没有新版本。当DTU检查到当前版本小于最新版本时,DTU根据FoTaFlag决定是否远程升级。
NewPort:新服务器端口。
NewIP:新服务器端IP地址。如123.86.55.33 第一个字节为123 按此顺序。
                            NewPort和NewIP 可用于服务器迁移和负载均衡需要。为0时终端不处理,非0时终端将更新存储的服务器IP和Port,下次链接服务器将用新的IP和Port.
三、SendTick和SendTickAck及其Data含义:
              DTU Login到服务器时,服务器下发的LoginAck中包含了TickTime参数(单位为秒),其值代表了DTU应该至少在多长时间内发起一次上行数据,如果在这个时间段内没有任何上行数据传输(如SendTest或SendSetup),则必须发一个SendTick 数据包到服务器,以便服务器持续保持TCP链路。
传输方向
Type名称
Type
含义
Data内容格式

上行
SendTick
0x13
DTU上传心跳包
下行
SendTickAck
0x13
服务器回应心跳
四. SaveSetup和SaveSetupAck及其相关的Data含义:
SaveSetup用于服务器配置自动上传数据的时间间隔,以及DTU里关于寄存器地址的信息列表,即“寄存器列表”,DTU将根据此列表读取对应寄存器地址的值(value)。配置成功后DTU用SaveSetupAck包把所配置的寄存器列表返回给服务器,可供服务器用于校验配置成功与否。
传输方向
Type名称
Type
含义
Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行
SaveSetup
0x16
服务器配置DTU的地址列表
SendTestTime(uchar)| SetDev1(uchar)|SetAddr1 (int16)|SetDev2(uchar)| SetAddr2(int16)|...
上行
SaveSetupAck
0x16
DTU响应服务器
Result(uchar)|SendTestTimeAck(uchar)|SetDevAck1(uchar)|SetAddrAck1 (int16)|SetDevAck2(uchar)| SetAddrAck2(int16)|...




寄存器地址列表:
从机号(uchar)
寄存器地址(int16)
1
0x55
1
0x56
1
0x57
2
0x55
...
...
下行SaveSetup:
SendTestTime:配置自动上传数据的时间间隔(单位:秒)
SetDev1SetAddr1从机号,寄存器地址
SetDev2SetAddr2从机号,寄存器地址
SetDev3SetAddr3从机号,寄存器地址
SetDev4SetAddr4从机号,寄存器地址
SetDev5SetAddr5从机号,寄存器地址
......
上行SaveSetupAck:
成功返回:
Result1
SendTestTimeAck: 自动上传数据的时间间隔(单位:秒)
SetDevAck1SetAddrAck1从机号,寄存器地址
SetDevAck2SetAddrAck2从机号,寄存器地址
SetDevAck3SetAddrAck3从机号,寄存器地址
SetDevAck4SetAddrAck4从机号,寄存器地址
SetDevAck5SetAddrAck5从机号,寄存器地址
......
失败返回:
Result0
五. ReadSetup和ReadSetupAck及其相关的Data含义:
ReadSetup用于服务器读取DTU里存储的自动上传时间间隔参数,以及“寄存器列表”。
传输方向
Type名称
Type
含义
Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行
ReadSetup
0x19
服务器配置DTU的地址列表
上行
ReadSetupAck
0x19
DTU响应服务器
SendTestTime (uchar)|ReadDev1(uchar)|ReadAddr1 (int16) | ReadDev2(uchar)|ReadAddr2(int16)|...
SendTestTime自动上传时间间隔
ReadDev1ReadAddr1从机号,寄存器地址
ReadDev2ReadAddr2从机号,寄存器地址
ReadDev3ReadAddr3从机号,寄存器地址
ReadDev4ReadAddr4从机号,寄存器地址
ReadDev5ReadAddr5从机号,寄存器地址
......



六、SendTest和SendTestAck及其相关的Data含义:
              SendTest是DTU定时自动上传的数据包,数据内容为寄存器里的值(value)。DTU将根据“寄存器列表”去获取从机的对应的寄存器里对应值(value),按顺序排列为如Value1,Value2,Value3... 将所有测量数据一起打包成SendTest数据包上传给服务器。
传输方向
Type名称
Type
含义
Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
上行
SendTest
0x14
DTU上传测量数据
NetState(uchar)|TestCode(uchar)|Value1(int16) | Value2(int16)...
下行
SendTestAck
0x14
服务器响应DTU上传测量数据
TestCode(uchar)
NetState: 网络状态.DTU通讯模块的CSQ值。
TestCode: 测量值标识码。为了DTU同步Value数据到服务器,服务器收到SendTest数据包并成功解析、存储后将此TestCode回传给DTU。
              当DTU本地的各种Value发生变化且满足SendTestMode要求时,本地记录的TestCode加一(255加1等于0),然后和所有的Value打包成SendTest数据包上传给服务器,当服务器收到SendTest数据包且成功解析并保存后将其值返回给DTU即可,假如服务器收到的SendTest数据包和事先约定的数据包不相符(比如个数少了),则服务器可以通过将TestCode减一(0减1等于255)后再回传给DTU,这样DTU会触发重传。TestCode服务器不需要保存在数据库中。
Value1 : 第一个寄存器地址里的值;
Value2 : 第二个寄存器地址里的值;
Value3 : 第三个寄存器地址里的值;
Value4 : 第四个寄存器地址里的值;
......
七.ReadTest和ReadTestACK及相关的Data含义
ResdTest用于服务器查询指定寄存器的数据。
ResdTestAck是DTU返回给服务器的数据包,由对应的寄存器的值(value)组成。
传输方向
Type名称
Type
含义
Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行
ResdTest
0x18
服务器查询DTU
ReadValueDev1(uchar)|ReadValueAddr1 (int16)|ReadValueDev2(uchar)| ReadValueAddr2(int16)|...
上行
ResdTestAck
0x18
DTU响应服务器查询
Result(uchar)|ReadValue1(int16)| ReadValue12(int16)......
上行ResdTest:
ReadValueDev1ReadValueAddr1从机号,寄存器地址
ReadValueDev2ReadValueAddr2从机号,寄存器地址
ReadValueDev3ReadValueAddr3从机号,寄存器地址
ReadValueDev4ReadValueAddr4从机号,寄存器地址
ReadValueDev5ReadValueAddr5从机号,寄存器地址
......

下行ResdTestAck:
成功返回:
Result1
ReadValue1: 第一个寄存器地址里的值
ReadValue2: 第一个寄存器地址里的值
ReadValue3: 第一个寄存器地址里的值
ReadValue4: 第一个寄存器地址里的值
ReadValue5: 第一个寄存器地址里的值
......
失败返回:
Result0
八. SetControl和SetControl Ack及相关的Data含义
从机中,某些寄存器是用于配置的。SetControl用于服务器给DTU下发指令,让DTU去设置某些寄存器的参数. SetControlAck为DTU响应服务器的数据包,跟服务器下发的配置参数一致,可供服务器校验配置成功与否。
传输方向
Type名称
Type
含义
Data内容格式
(按顺序排列,排在前面的先传输,大端格式)
下行
SetControl
0x17
服务器控制DTU
SetValueDev1 (uchar) |SetValueAddr 1(int16)| SetValue(int16)1| SetValueDev2 (uchar) |SetValueAddr 2(int16)| SetValue(int16)2|......
上行
SetControlAck
0x17
DTU响应服务器
Result(uchar)|SetValueDevAck1 (uchar)|SetValueAddrAck1 (int16)| SetValueAck1 (int16) |SetValueDevAck2 (uchar)|SetValueAddrAck2 (int16)| SetValueAck2 (int16)|......
下行SetControl:
SetValueDev1:              从机号
SetValueAddr1寄存器地址
SetValue1参数
SetValueDev2:              从机号
SetValueAddr2寄存器地址
SetValue2参数
......

上行SetControlAck:
成功返回:
Result1
SetValueDevAck1:              从机号
SetValueAddrAck1寄存器地址
SetValueAck1参数
SetValueDevAck2:              从机号
SetValueAddrAck2寄存器地址
SetValueAck2参数
......

失败返回:
Result:0

附:
DTUDTU内的寄存器列地址和寄存器值列表示意:
从机号(uchar)
寄存器地址(int16)
值(int16)
1
0x33
0x12
1
0x34
0x34
1
0x55
0x56
1
0x56
0x78
1
0x57
0x90
2
0x55
0x12
2
0x88
0x12


完整的Word格式文档51黑下载地址:
Modbus DTU与服务端间的通讯协议20170523.docx (27.71 KB, 下载次数: 17)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表