基于某LoRa地组网方案设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于LoRa的组网设计方案
目录
1 概述 (1)
2 功能性能指标 (1)
2.1 功能指标 (1)
2.2 性能指标 (2)
3 技术路线选择 (3)
4 系统设计 (4)
4.1 系统组成 (4)
4.2 系统工作模式 (5)
4.2.1 主机轮询的组网方式 (6)
4.2.2 分时间片的组网方式 (6)
5 通信设计 (7)
5.1 MODBUS通信协议 (7)
5.2 MODBUS通信示意图 (8)
6 软件设计 (8)
6.1 软件流程图 (8)
6.2 软件时序图 (9)
7 结构设计 (10)
7.1 接口设计 (10)
7.2 外形设计 (11)
8 实验方案 (12)
9 项目进度和质量保证 (13)
9.1 项目研制进度计划 (13)
9.2 质量控制与文件交付进度计划 (14)
10 主机与监测系统通信协议 (14)
10.1 概述 (14)
10.2 协议标准设置 (14)
10.3 字节格式 (15)
10.4 帧格式 (15)
10.5 浮点数存贮和传输格式 (16)
10.6 功能码 (16)
10.7 读写保持寄存器 (16)
10.8 举例 (17)
10.9 异常响应 (19)
10.10 CRC16校验方式 (19)
1 概述
基于LoRa的组网通信系统采用LoRa通信协议进行组网通信,系统由计算机终端、通信基站、集成通信模块的用户设备、具备通信功能的用户设备等组成,实现整套系统的互相通信。
2 功能性能指标
2.1 功能指标
⏹LoRa组网通信功能:通过通信基站向全部设备广播信息;通过通
信基站向某一特定设备发送参数或控制命令;通信基站同时接收16个设备的上传数据。
⏹LoRa通信加密功能:无线通信具备加密功能,提供加密算法。
⏹设备命名功能:为每一个接入网络的设备定义设备编号,名字可长
期不变,也可经授权改变,可唯一识别不同的设备,满足后续数据处理。
⏹485通信功能:按照485标准以及MODBUS数据格式,通信模块可
完成与用户模块电路之间的数据通信。
⏹调试界面软件功能:实时显示各设备数据,包括设备工作状态、设
备传感器数据;设置设备参数与状态,包括设备命名与修改、下达复位命令、设置报警值、设置数据上传时间间隔、启停数据采集等;存储数据,按照不同任务、不同设备进行关联存储;数据可查询;数据可打印。
⏹API接口通信功能:按照MODBUS数据格式和LoRa通信协议,建立
界面软件(包括调试界面软件)和通信基站之间通信通道,界面软件可实现相应功能。
⏹故障显示与定位功能:当通信基站和通信模块发生故障时,界面可
显示故障,并显示具体哪一个通信模块或通信基站发生故障。
2.2 性能指标
⏹无线通信体制:LoRa通信,一个基站对多个通信设备的组网通信。
⏹无线通信距离:无遮挡传输距离≥5000m,有金属遮挡传输距离≥
2000m。
⏹无线通信速率:通信基站向用户设备下传数据≥1kbps;用户设备
向通信基站上传数据≥5kbps;通信基站数据吞吐速率≥10kbps,可同时接收≥16路的设备上传数据;有遮挡时,上传和下传数据率的衰减量≤50%。
⏹通信模块供电:采用+12V电源供电。
⏹通信基站功耗:通过DC12V电源适配器进行设备供电。
⏹数据加密:无线通信上传和下传数据进行加密,16路同时上传时,
数据吞吐速率不超过通信基站额定能力的70%。
提供数据加解密算法。
⏹485通信速率:通信模块向用户模块电路的下传数据速率≥1kbps;
用户模块电路向通信模块的上传数据速率≥5kbps;数据格式采用MODBUS通讯协议。
⏹一次工作时间:一次开机,可可靠连续工作12h。
⏹工作温度:-35℃~55℃。
⏹存储温度:-40℃~70℃。
⏹湿度:40℃工作温度下,90%湿度,通信基站、通信模块能正常工
作,且不凝露。
⏹元器件和原材料的性能参数满足环境温度(工作温度、存储温度)
要求。
3 技术路线选择
LoRa是LPWAN(低功耗广域物联网)通信技术中的一种,LoRa 作为目前最有发展前景的低功耗广域通信技术,已经被运用在个各行各业中。
是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。
LoRa 无线通信采用直序扩频技术,具有通信距离远、功率密度集中,抗干扰能力强的优势。
同时具有软件 FEC 前向纠错算法,其编码效率较高,纠错能力强,在突发干扰的情况下,能主动纠正被干扰的数据包,大大提高可靠性和传输距离。
目前,LoRa主要在全球免费频段运行,包括433、868、915 MHz等。
LoRa是物联网应用中的无线技术有多种,可组成局域网或广域网。
ZigBee是一种无线连接,可工作在2.4GHz(全球流行)、
868MHz(欧洲流行)和915 MHz(美国流行)3个频段上,是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术。
基于此,我们选择传输距离远、功耗低(长电池寿命)的LoRa 模块。
4 系统设计
基于LoRa的组网通信系统由计算机终端、通信基站、集成通信模块的用户设备、具备通信功能的用户设备等组成,系统采用LoRa 通信协议进行组网通信,实现命令或参数的下达,以及数据的采集与上传等功能。
图4.1 基于LoRa的组网通信系统组成示意图
4.1 系统组成
系统由计算机终端、通信基站、集成通信模块的用户设备(设备1~设备10)、具备通信功能的用户设备(设备11~设备16)等组成。
表1 设备清单
4.2 系统工作模式
因射频的特性决定了无线串口收发模块可以一发多收,不能同时多发一收,造成了射频组网的最大的障碍,因此,为了解决这个问题就只能够利用时间来实现组网,下面是无线LoRa收发模块实现多发一收的解决方案。
4.2.1 主机轮询的组网方式
主机轮询方式组网是主机逐个查询的方式,该组网方式能够准确上传,并且相互设备之间不容易出现冲突,组网也比较稳定,但是缺点是主机轮询耗时间长。
这种组网方式适合那些对时间要求不高的组网应用。
主机轮询的组网方式原理很简单,通过点名的方式实现应答。
如主机发送给1号从机,由于从机都有地址设别,因此只有从机1能够响应主机。
从机1收到主机的命令后,将数据上传给主机。
主机再以相同点的轮询方式轮询其它从机数据。
图4.2 主机轮询组网图
4.2.2 分时间片的组网方式
分时间片的组网方式对于组网数据收集来说是比简单的轮询方式快了很多,但是对从机的时间同步以及发送延迟要求高。
图4.3 分时间片组网图
如图,这种组网方式是先由主机发起广播时间,从机收到后,同步自己的本地时间,同步完成后,根据自己的编号进行延时上传,从而实现多发一收的功能。
这种组网方式收发数据时间节省很多,并且能够防止冲突,但是对软件延时等调整要求较高。
为保证数据传输的实时性,选择第二种方式分时间片的组网方式,实现整个系统的无线通信。
5 通信设计
5.1 MODBUS通信协议
MODBUS网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。
其系统结构既包括硬件、亦包括软件。
它可应用于各种数据采集和过程监控。
它已经成为一种通用工业标准。
MODBUS网络只有一个主机,所有通信都由它发出。
网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。
MODBUS协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
它描述了一个控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。
它制定了消息域格局和容的公共格式。
MODBUS网络以RTU模式进行通信,在消息中的每个8Bit字节按照原值传送,不做处理。
这种方式的主要优点是:数据帧传送之间没有间隔,相同波特率下传输数据的密度要比ASCII高,传输速度更快。
5.2 MODBUS通信示意图
本系统由无线LoRa和有线485进行组网通信。
均采用MODBUS通信协议RTU通信方式。
可进行点对点通信和点(基站)对多(模块)通信。
具备通信功能
内置通信模块
基站
监测主机
485(MODBUS)
LoRa(MODBUS)
LoRa(MODBUS)
LoRa
图5.1 基于LoRa的通信示意图
6 软件设计
6.1 软件流程图
监测主机界面软件主要对整个系统的运行状况进行监控。
出
现异常情况时,给出报警提示;同时可进入设置界面进行参数设置,对历史数据存储和打印。
开机
初始化
实时监测探测器数据、状态,TF卡状态,电池电量、时间
参数设置(有线/无线)
时
间
设
置
报
警
阈
值
报
警
时
间
设
备
编
号
系
统
复
位
异
常
提
示
结束
数
据
密
钥
数
据
存
储
于
打
印图6.1 监测主机软件流程图
6.2 软件时序图
监测主机界面软件可通过无线LoRa或者有线485进行通信。
监测主机作为主机,可对任一设备进行点对点通信,也可通过广播命令控制所有从机,当主机获取所有从机数据时,从机根据设备编号延时间隔固定时间依次回应数据。
监测主机任一数据请求便携主机
1
便携主机
2
便携主机
3
数据响应
任一数据请求数据响应
任一数据请求数据响应所有数据请求数据响应
数据响应
数据响应
100ms
图6.2 监测主机软件时序图
7 结构设计
通信基站和通信模块采用如图所示外形结构和安装尺寸,包括各接口定义。
7.1 接口设计
图7.1 电气接口示意图
图7.2 状态指示图
表2 电气接口定义表
7.2 外形设计
图7.3 结构外形尺寸图8 实验方案
9 项目进度和质量保证9.1 项目研制进度计划
9.2 质量控制与文件交付进度计划
文件清单如下:
10 主机与监测系统通信协议
10.1 概述
本协议规定了主机与监测系统的通信协议,所有相关硬件设备都应遵从协议规。
10.2 协议标准设置
采用RS-485标准接口。
——标准协议:Modbus RTU协议。
——波特率: 9600 bps。
——设备地址:1-247(出厂默认值为00H )。
——通讯方式:监测主机主机主动发送命令,便携主机被动应答。
10.3 字节格式
编码系统: 8 位二进制,十六进制 0‐9,A‐F。
数据位: 1 起始位, 8位数据(低位先送),无奇偶校验,停止位1 位。
错误校验区:循环冗余校验(CRC16)
RTU 错误校验码为 2 字节 16 位 CRC 码。
10.4 帧格式
Modbus信息以帧的方式传输,每帧有确定的起始点和结束点,使接收设备在信息的起点开始读地址,并确定要寻址的设备(广播时对全部设备),以及信息传输的结束时间。
RTU 模式中,信息开始至少需要 3.5 个字节的静止时间,发送完最后一个字节后,也有一个 3.5 个字符的静止时间。
整个信息必须连续发送。
如果在发送帧信息期间,出现大于 1.5个字符的静止时间时,则接收设备刷新不完整的信息,并假设下一个地址数据。
10.5 浮点数存贮和传输格式
浮点数采用IEEE标准的单精度浮点数格式,如图所示,每个数由4字节组成,数据传输时,从第一字节到第四字节的顺序传送。
10.6 功能码
10.7 读写保持寄存器
02H、报警状态:0 = 正常, 1 = 报警。
TF卡状态:0 = 正常, 1 = 异常。
03H、电量:0-100.
09H、报警时间:0 = 0.5s, 1 = 1s,2 = 2s.
0AH、设备编号:1 - 247.
0BH、系统复位:写入0x00AA可复位。
10.8 举例
1、读取设备数据与状态:01 03 00 00 00 07 xx xx(地址01)
从应答:01 03 07 00 00 00 50 12 07 01 09 0C 22 xx xx
实时数据0.05 Bq/cm2,未报警,TF卡正常,80%,18年7月1日9时12分34秒。
2、读取报警时间:01 03 00 09 00 01 xx xx(地址01)
从应答:01 03 02 00 01 xx xx
报警时间为1s.
3、写系统时间:01 10 00 04 00 03 12 07 01 09 0C 22 xx xx
从应答:01 03 02 00 01 xx xx
4、系统复位:01 06 00 0B 00 AA xx xx
从应答:01 06 00 0B 00 AA xx xx(成功原样返回)
10.9 异常响应
出现异常指令时,设置功能码的MSB为1。
这使得异常响应中的功能码值比正常响应中的功能码值高0x80,返回异常指令。
10.10 CRC16校验方式
static const uint8 auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
static const uint8 auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};
/*************************************************************** * Function : calculate_crc
* Description : 计算校验和
* Input Para :
* Output Para :
* Return Value:
***************************************************************/ uint16 calculate_crc(uint8 *puchMsg, uint8 usDataLen )
{
uint8 uchCRCHi = 0xFF ;
uint8 uchCRCLo = 0xFF ;
uint8 uIndex ;
uint16 CrC16;
while (usDataLen--)
{
uIndex = uchCRCHi ^ (*(puchMsg++));
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
CrC16 = uchCRCLo;
CrC16 <<= 8;
CrC16 += uchCRCHi;
return CrC16 ;
}。