孙 琦,傅 军
(海军工程大学 电气工程学院,湖北 武汉 430033)
气象预报对当今人们合理调控生产生活起到重要作用,正确的气象预报依赖于长期、准确、实时的气象观测数据。从20世纪90年代后期开始,我国大力加强地面气象观测业务能力建设,已初步建立了与国民经济建设发展相适应的观测网。但是在沙漠、高山、海岛等环境条件恶劣、人烟稀少的地区,交通、供电、通信等基础设施薄弱,给人工值守和依赖地面通信网络的气象观测站点带来了巨大的建设和运行成本,然而获取完整翔实的水文气象资料是开展相关科研工作和气象服务决策的重要基础。
近几十年来,随着电子信息和计算机技术的发展,逐渐出现了无人值守、无需经常维护的自动无人气象站,解决了传统气象站中,部分气象站人力成本高、难以维护和数据采集困难的问题。自动气象站的应用和普及,可以很大程度地增加气象数据采集时空密度,有效地提高气象观测效果以及可靠性,满足观测可比性等方面的要求,减少气象观测站的运营费用[1]。
自动气象观测站按照通信方式可以分为两类,即有线遥测气象站和无线遥测气象站[2]。有线遥测气象站是传统的气象监测方式,感应部分和接收处理部分相隔几十米或者几千米,其间用有线通信电路传输。传感器将数据通过数据线传输到PC机上。这种方式适合于有人值守区。无线遥测气象站大部分采用物联网模式,通过GPRS数据传输方式,将数据上传至网络平台,凡是有网络的地方,都可以随时登录平台,查看气象站现场数据,且有短信预警提示的功能。这种又被称为无人气象站。
在公共移动通信网尚未完全覆盖的人烟稀少地区,使用GPRS体制工作的气象站因网络覆盖盲区的问题,难以满足气象传输要求。因此,有必要使用可靠、无网络覆盖盲区的北斗短报文通信技术作为气象站的信息通路[3],以提高气象站的适用性和可靠性。
针对以上现状,本文设计了基于北斗的无人值守气象站。使用太阳能蓄电池作为电源,气象站传感器和主控单元之间使用RS 485-ModBus协议,利用北斗系统的短报文通信功能与北斗/GSM通信服务网关结合使用,在终端用户侧可实现随时通过手机发送特定字符获取远端水文气象数据服务[4],技术人员也可以远程随时查询气象水文站的工作状态,便于及时进行故障处置。
无人气象站承担在恶劣环境下的气象观测任务,因此设备应具有以下指标:
(1)通信质量稳定、无通信盲区、丢包少、可以实现双向通信、接收用户指令;
(2)设备应该具有宽电压输入、供电设备输出电压稳定;
(3)通信延迟小、通信带宽大、传感器设备工作可靠;
(4)两种帧协议的接收解析与封装发送[5]。
依据要求通信质量必须稳定,而GPRS/GSM存在通信盲区及信号不稳定等因素,采用北斗卫星通信的数据传输模式,保证数据可靠上传。北斗卫星通信系统覆盖范围广,没有通信盲区,信息加密传输安全。“北斗三号”区域短报文通信服务,服务容量提高1 000万次/h以上,单次通信能力[6]1 000汉字(14 000 bit),短报文通信传输时延[7]约3.8 s。本设计中报文长度不会超过200个汉字,数据采集间隔在分钟级,因此,“北斗三号”区域短报文服务完全可以满足重点服务区内数据传输对通信容量和实时性的要求。由于户外供电不便,设计上采用太阳能蓄电池供电方式,保证在阴雨天气下,系统连续工作3天以上。
系统硬件主要由北斗模块及天线、气象传感器、单片机模块和太阳能电源四部分组成。气象结构如图1所示。
图1 气象站结构
综合卫星报文处理速度和接口资源的考虑,本设计采用基于Cortex-M4内核的微控制器STM32F429IGT6作为主控芯片,进行通信协议解析与封装、数据传输与控制,利用USART串口和RS 485接口实现主控单元与各个模块的数据传输,底板电源使用MP2482DN电源管理芯片,支持6~12 V直流电压输入,低压差线性稳压器1086-3.3控制电路输入电压为3.3 V,3.3 V过流保护防止底板电流过大。为了防止使用过程中静电以及瞬时大电流对芯片的影响,在重要芯片、接口、复位电路等部位采用TVS管和ESD管保护。
北斗板卡用于与远端的各种水文气象自动观测设备进行短报文通信。本设计采用海聊科技的T2北斗短报文板卡,此板卡兼容北斗用户终端通用数据接口2.1和4.0协议,集RNSS,RDSS为一体,具有全天候的定位导航和双向报文通信功能,工作温度-40~85 ℃,平均故障间隔≥5 000 h,成功率≥99%,模块待机功率约为0.65 W,发射瞬态功率约为15 W,支持7~18 V直流供电,使用三级民用北斗卡,通信频次60 s。
气象站要求传感器可靠性好、使用寿命长、精度高、传输信号稳定。本设计采用PR-300BYH-M型系列气象传感器。数据传输采用标准ModBus-RTU通信协议、RS 485标准,通信距离最大可达2 000 m,可以实现温湿度、大气压力、光照度的测量。主要技术指标如图2所示。
图2 气象站主要技术指标
考虑到无人气象站在户外工作,因此使用太阳能电池板作为气象站的电源。阳光充足的条件下保持设备运行并给蓄电池充电,蓄电池充电时间8~16 h。在无光状态下使用蓄电池内的电能,蓄电池最大输出可达到12 V/5 A,功率60 W,可以满足使用要求,电池容量20 A·h。RD0538T1模块发射瞬间功率小于15 W,待机功率小于0.65 W,发射瞬间持续时间小于0.3 s。若每分钟发射一条报文,则模块平均功率为(15/60)×0.3+0.65=0.725 W,气象站百叶窗的功率为0.8 W,主控单元功率小于1 W,则在无光状态下,气象站可以连续运行(12×20)/(0.725+0.8+1)=95 h,实现了无人气象站不断电运行。整个供电系统通过太阳能控制电路来控制蓄电池的充放电,主要功能是在夜间电池板电压输出为0时,防止电池中的电能回流到电池板中,此外它在防止过度充电方面同样发挥着关键作用。使用FP5139芯片和Π型滤波电路,控制北斗端电压为恒定值,防止电压变化过大而损坏RD芯片。
传感器的RS 485A/B与单片机的RS 485A/B分别对应连接,主控底板中RS 485接口部分采用SP3485E芯片,两线制RS 485是一种半双工方式,所以需要切换收发状态,用PB8引脚的高低电平来控制接收和发送。当PB8输出低电平的时候,控制主控单元RS 485接口为接收状态,当PB8为高电平的时候,控制主控单元RS 485接口为发送状态。单片机内部连接RS 485的引脚分别是PD5,PD6,PD5是发送引脚,PD6是接收引脚。单片机RS 485接口硬件原理图如图3所示。系统硬件连接如图4所示。
图4 系统硬件连接
图3 单片机RS 485接口硬件原理
(1)主控单元作为主机与气象站传感器进行通信,使用ModBus-RTU协议可以获取温湿度、大气压力、光照度等信息。
(2)RDSS数据帧的接收解析与封装发送。用户向气象站北斗端发送查询命令,无人气象站北斗天线接收到的信号经过模块内部的处理,转换成串口数据并输出到主控单元。原始串口数据经过帧协议解析后,得到用户数据。识别提取其中的特定命令后,主控单元做出响应通过RS 485总线查询对应寄存器的数据。再封装成协议帧输出到串口,气象站北斗端将得到的串口数据经过内部信号处理后,通过天线发射出去,完成整个工作过程。
3.2.1 总体设计方案
总体设计程序分为初始化部分、控制传感器部分、控制北斗部分,如图5所示。初始化部分主要进行北斗、RS 485通信使用的USART外设、引脚的初始化、系统时钟的使能以及北斗模块的自检。这一部分的软件编写围绕各种寄存器的操作以及北斗短报文协议来展开。
图5 程序整体设计流程
初始化成功之后输入目标的北斗号码,为了提高程序的效率,在主函数中设置两层嵌套循环,第一层循环是判断北斗信号强度,直到满足通信条件为止,第二层循环是主要的接收和发送代码、数据处理代码等。进入到第二层后,不会返回第一层。一二层之间入口是判断北斗接收置位情况。
对北斗报文进行解析与遍历,判断是否存在特定的字符。程序分支执行北斗定位申请和ModBus问询帧发送函数,处理从机发送过来的应答帧后,提取寄存器中气象数据以及DWR语句中的经纬度、时间等信息,经过字符串的拼接整合与转换格式,通过北斗发送函数,最后回到判断北斗接收置位处。
3.2.2 单片机控制传感器部分
STM32控制气象站百叶窗,初始化RS 485通信使用的USART外设及相关引脚。编写控制SP3485E芯片进行收发数据的函数,根据ModBus通信协议编写收发的数据帧。
ModBus协议是基于RS 485物理层来实现的,在RS 485通信中信号频率越高,越容易产生反射波干扰。通常传输速率在1 200~19 200 b/s之间选取。通信距离1 km以内,从通信效率、节点数、通信距离[8]等综合考虑可选用4 800 b/s;通信距离 1 km 以上时,应考虑通过增加中继模块或降低速率的方法提高数据传输可靠性。综合可靠性和有效性,本文采用9 600 b/s作为RS 485接口的速率。STM32作为主机实现ModBus协议的核心在于对数据帧结束的判断。ModBus协议没有停止位,规定当数据之间间隔大于3.5个字节的时间时,代表一个数据帧发送或者接收的完成。那么延迟时间大于(1/9 600)×8×3.5≈2.92 ms 时,即代表一个数据帧的结束,考虑到硬件的延迟,定义时间大于4 ms时数据帧结束。因此,初始化定时器的时间为4 ms,开始处于关闭状态。串口接收中断函数中设置定时器使能和清0代码,定时器溢出中断函数中设置定时器使能和接收完成置位代码。
在进行串口初始化后,使RS 485常态处于接收态,中断函数接收到第一个字节后,开启计时器,在不发生溢出的情况下,每接收一个字节都将定时器清0。当定时器发生溢出中断时,表明时间间隔大于4 ms,即一帧接收完成,ModBus接收标志位置位,关闭定时器用于下一次帧停止的判断。帧停止逻辑流程如图6所示。
图6 帧停止逻辑流程
为了防止变量混乱,设计程序时将ModBus相关的变量、数组、缓存区都放到一个结构体之中,方便程序设计。
STM32作为主机需要发送数据时,将主机端RS 485接口置于发送态,将发送缓存区中的带有地址码和功能码的数据通过串口发送,通过RS 485收发转换器转换成特定的电平信号在总线上传输。ST内置的库函数中USART_FLAG_TXE,USART_FLAG_TC这两个标志位有一定的区别,USART_FLAG_TXE表示数据寄存器中的数据已经被发送移位寄存器取走了,但发送移位寄存器中可能还没有启动发送过程,发送移位寄存器中的数据往外面发送的时间相对于CPU指令执行时间来说是比较耗时的。USART_FLAG_TC代表一个数据帧发送完成事件,由于RS 485标准对于发送的时间要求比较高,因此选择USART_FLAG_TC作为发送完成的标志位。否则在实验时会出现不能正常发送的情况。问询帧结构见表1所列。
表1 问询帧结构 B
3.2.3 单片机控制北斗部分
使用混合传输模式,汉字先转化为GB2312码,然后每个字节的高低4位分别转化为一个字节,变成可打印字符。
根据北斗卫星导航系统用户终端通用数据接口2.1协议来设计建立结构体,用来存放发送和接收的数据、标志位等。由于报文长度很长,若单独每一种报文都建立相应的结构体就会占用很多的内核内存,造成不必要的浪费,所以可以采用结构体嵌套联合体的方式以节省内存资源。
帧协议解析的核心在于对接收到的串口数据内容进行分割与提取,由于北斗报文之中,每一部分之间通过‘,’或者‘*’分隔开,有一定的规律性,想要获取某一部分的数据,可以设计一个指针ptr指向北斗报文,另一个变量tmpLen用于计算区间字符串长度,当遇到‘,’时,字符指针ptr移到区间字符串的开始,并将从ptr开始的长度为tmpLen的字符串复制到输出字符串中,最后将tmpLen清0,准备下一次寻找。
对于经纬度DWR报文的解析,由于每个子报文都有作用,故设计采用字符串分割函数char *strtok(char s[],const char *delim);以‘,*’作为分割条件,在第一次调用时,strtok()必须给予参数s字符串,之后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。最后将得到的子串通过switch-case语句分别存储在相应的结构体中,得到经纬度和时间信息。
首先是验证单片机发送的北斗报文格式是否正确以及验证气象站工作是否正常,采用232转USB线连接到上位机串口7上,模拟单片机接收到北斗报文过程和数据回传的过程。测试情况如图7所示。串口7(模拟用户北斗端)发送北斗报文数据‘$BDTXR,0247716,1,2,A4424331323350*34 ’。其中含有特定字符‘P’,用于获取大气压力值。
从图7中可以看到,单片机与气象站之间通信正常,得到大气压力的值是97.7 Pa。串口7(北斗)收到报文数据段B4F3C6F8D1B9C1A6CAC73A39372E37205061,经过gb2312解码之后得到字符串:大气压力是97.7 Pa,与串口4显示的传感器的数值相同。
图7 串口调试助手模拟情况
第二阶段,连接好设备之后,将北斗天线朝南无遮挡放置,进行调试,输入气象数据接收端的北斗卡号,进行北斗强度测试,若强度大于等于3,可以实现通信。利用北斗海聊公司的北斗短报文入网服务,实现只有1台北斗设备情况下报文的发送和接收(经过上百条实际测试该平台夏季对于长春地区在16:00以后发送成功率较高)。接收北斗报文测试情况如图8所示。
图8 接收北斗报文测试情况
当接收到特定的字符如H后,主控单元响应命令获取当前湿度值,通过串口向北斗模块发送通信申请报文:$CCTXA,0247716,1,2,A4CAAAB6C8CAC73AB0D9B 7D6D6AE33382E32*00 ,根据收到的响应数据‘$BDFKI’来判断发送是否成功。
本文根据现有的水文气象观测数据传输的现实需求和北斗发展现状论述了基于北斗的无人值守气象站的设计,通过串口调试和仿真测试,实现了气象数据的发送和北斗报文的接收。设计的无人气象站能够稳定、安全可靠地传输信息,具有不受距离、地域限制,通信费用低,节省人力的优点,特别适合在偏远等普通信号无法覆盖的地区的气象观测,与目前建成的基于GPRS网络的自动气象站互为补充,对于掌握我国全域气象数据具有重要意义。