1. 引言
为及时掌握我国地下水实际情况,解决地下水研究数据缺乏的障碍,因此建立完善的地下水监测网络是非常必要的 [1] [2] 。近年来地下水位监测的新技术新手段主要有传感网技术、水文地球物理方法、遥感技术、现场多参数水质监测等 [3] 。
为充分利用传感器网络提供大量、高质量的实测数据,解决目前地下水位监测点分散,数据采集频次高,监测设备功能单一等缺点,本文针对水资源研究的需要,设计了基于Salvo嵌入式操作系统的地下水位远程监测终端,终端采用ATMega128控制器,GPRS/SMS自主切换和以太网技术的混合组网通信方式,使终端和网络间实现“永远在线”的连接,太阳能市电互补供电方式提高了终端的稳定性,更加适合多种环境的地下水位监测现场。通过引入嵌入式操作系统Salvo,很好地解决了地下水位的自动采集,自动存储,远程双向传输功能,保证了监测设备和监测数据的稳定可靠。
2. 操作系统Salvo及任务分配
Salvo是一款基于优先级任务切换、支持事件驱动的多任务嵌入式实时操作系统(RTOS),主要特点是占用内存资源少,功能强大,工作稳定可靠,尤其适合内存资源少的单片机应用,而且对于多个任务同一个优先级, Salvo以时间片(round-robin)循环方式切换,同时Salvo占用RAM的大小取决于用户定义的变量和调用的应用函数,支持的任务和事件数量,一般典型设计系统占用RAM为1~2 k。
基于RTOS软件开发的主要工作是任务分配以及明确任务功能和编写任务代码 [4] 。为了减少Salvo在任务切换时占用过多的系统资源,根据上述分析,应尽量减少任务数量和全局变量数,因此本文中Salvo配置成以多任务运行、二进制信号、事件消息驱动,基于优先级和基于时钟的实时任务操作系统。系统时隙为2 ms,通过Timer1中断获取。系统共配置6个任务,其中2个任务被配置成等待状态,包括4个事件配置,2个消息事件(message),2个二进制信号事件(bin semphere)。图1是系统任务通信及占用硬件资源示意图。
3. 多通讯方式
随着嵌入式技术的不断发展,无线通信技术、基于TCP/IP的Internet技术融合在一起的远程监控系

Figure 1. Task communication and hardware resources
图1. 任务通信及占用硬件资源
统成为远程终端的发展趋势。远程在线数据传输技术在工业现场的数据采集和监控中得到了广泛的应用,目前远程数据传输方式包括无线传输模式和有线传输模式,其中远程无线通信传输模式主要有短消息(SMS)、GPRS;远程有线通信模式有以太网。
本文设计的地下水位远程在线监测设备融合了远程数据传输的无线传输模式和有线传输模式。由于移动通信网络数据业务繁忙时信道会被堵塞,造成GPRS通信延时或中断,采用SMS的数据传输可实现紧急数据和消息发送,例如水位的上下限报警和电源欠压报警等,这样采用GPRS和SMS相结合的通信方式,可保证数据传输的高效性又提高了终端的灵活性。同时为了防止出现无线设备在长期工作中存在的异常情况,如信号弱,SIM卡欠费,GPRS网络中断及垃圾短信等问题,为保证数据的安全性,本文还增加了以太网功能,以太网不仅弥补了上述问题,尤其针对要求数据量传输大,例如传输现场视频及清晰图片等功能时,以太网具有更好的优势。
多通讯方式切换机理
地下水位远程在线监测设备采用了SIMCOM公司推出的GSM/GPRS双频模块SIM900,具有低功耗设计,在睡眠模式下,电流功耗仅有2.5 mA。设备的串口根据接收数据中的通道选择命令来决定数据通过GPRS或SMS方式来发送数据,方式转换采用虚拟串口即软件复用串口方式,通过AT指令选择工作在哪个通道。双通道方式工作原理如图2所示。

Figure 2. Working principle of dual channel mode
图2. 双通道方式工作原理
首先AT指令设置为数据模式,使能GPRS连接,“+++”从数据方式切换到命令模式,“ATO\r\n”从命令模式切换到数据模式:
int CMD_DATA_TO_CMD_MODE[] = {+++};
int CMD_CMD_TO_DATA_MODE[] = {ATO\r\n};
GPRS_TxStr(CMD_DATA_TO_CMD_MODE, strlen((char*)CMD_DATA_TO_CMD_MODE));
远程无线通信方式在Salvo系统中置为一个任务,通过监听端口的数据,根据接收数据包的解析,分别执行相应的功能。在无线数据发送过程中,如间隔10s发送3次无响应则退出无线通信方式,启动以太网进行有线数据传输。
4. 系统硬件描述
地下水位远程在线监测设备主要负责对现场数据采集及处理,数据传输,包括模拟量和数字量信号I/O单元,微处理器单元,数据存储器单元、GUI单元、有线/无线通信单元、电源单元、市电/太阳能自动切换单元及低电压检测电路等组成,本系统基本结构框架如图3所示。
ATMega128控制器作为中断控制器,其原理为:对于这些中断,程序计数器跳转到实际的中断向量以执行中断处理例程,同时硬件将清除相应的中断标志。中断标志也可以通过对其写“1”来清除。当中断发生后,如果相应的中断使能位为“0”,则中断标志位置位,并一直保持到中断执行,或者被软件清除。
其基本工作流程是:通过触摸屏设置输入水位各项参数,如水位的高程、量程和放线值等,并将参数进行保存,系统实时监控工作电压及各项监测参数并在液晶屏上显示,GPRS和以太网等采用消息事件任务。
4.1. 模拟量输入输出及控制
本终端采用的是投入式液位计,测量水深一般为0~100米,输出电流信号4~20 mA,考虑到实际水深精度要求,本终端采用了低温漂、高精度的采样电阻250欧,因此4~20 mA的电流信号可转换为1 V~5 V的电压信号。AD转换芯片采用TLC2543,精度为12位,则计算测量值公式:

Figure 3. Basic structure of the system
图3. 系统基本结构框图

其中:M——测量值;
Vad——采样电压;
MR——量程。
为达到更高的精度要求,软件进行了温度补偿。
4.2. 市电/太阳能电源自动切换
为了保证电源连续性,终端采用市电和太阳能电源互补的工作方式,利用太阳能供电不仅节能而且经济,但是太阳能辐射具有不连续性和间歇性,尤其是在连续阴雨天时,因蓄电池不足而出现电压过低情况。通过太阳能和市电组成双电源供电系统,不仅满足了经济性要求,而且弥补了太阳能缺点。
市电输入电源的处理主要是电路保护,主要有自恢复保险F2和TVS瞬态抑制二极管D3,可免受浪涌脉冲的损坏(图4)。
考虑到现场电源对设备的影响,终端设备以太阳能供电为主,市电供电为辅。市电经过开关电源后输入电压为12 V,其输入端如图5的J101,蓄电池供电电压为15 V,输入端J104,因此当蓄电池输入电压Vin过低小于12 V时,市电自动实现切换。
4.3. 传感器电源控制
由于现场电源不稳定,尤其是水泵等设备工作时对液位计电源的冲击,导致液位计的损坏,因此在不需要数据采集的时间段,传感器电源关断,可以保护传感器的寿命,同时为了减小系统功耗,设备设计了传感器电源控制电路,如图6所示。
网络SENSOR连接传感器电源,传感器电源的开关由ATMEGA8的引脚PD7来控制。电源的开关使用PMOS管SI9947DY,它在不导通的情况下内阻大,导通的情况下内阻很小,可通过电流大,因此

Figure 4. Protection of electric input circuit
图4. 市电输入电路保护

Figure 5. City power/solar power automatic switching circuit
图5. 市电/太阳能电源自动切换电路

Figure 6. Sensor power control circuit
图6. 传感器电源控制电路
可以实现较彻底的关闭和打开。PMOS为低压驱动原件,它的栅极由PD7引脚控制,当PD7引脚输出高电平时,三极管9013导通,栅极电压被拉低,Vgs形成负压,源极和漏极导通,传感器的电源打开,实现供电。反之,当PD7输出低电平时,传感器电源关闭,实现传感器电源的开关。开关的长短可根据具体情况调节。
5. Salvo操作系统的配置
Salvo操作系统主要有免费版、标准版、增强版。Salvo以不同的库或源代码的形式支持多个编译器。本文Salvo应用是在ICCAVR 7编辑器和Studio4集成环境下进行的。为了减小目标代码,占用RAM空间少,因此在编译Salvo前,需要对Salvo进行配置。步骤如下 [5] :
1) 目标代码建立方式:Salvo应用程序目标代码建立方式有两种:基于库的建立和基于源代码的建立。基于源代码的目标代码建立,Salvo应用程序从用户程序源代码、Salvo用户函数源代码及Salvo的mem.c建立而成,因此同库的建立方式相比,基于源代码的建立方式目标代码更小,运行时占用RAM少。本文采用基于源代码的建立。目标代码建立流程如图7所示。
2) Salvo配置:Salvo的配置信息保存在应用程序的salvocfg.h文件中,配置时需要正确指定相应的参数,例如任务数、事件数、消息队列、全局变量以及RAM大小。以下是采用标准库进行编译的salvocfg.h的配置文件:
#define OSUSE_LIBRARY TRUE
#define OSLIBRARY_TYPE OSL
#define OSLIBRARY_CONFIG OSA
#define OSTASKS 6
#define OSEVENTS 2
#define OSEVENT_FLAGS 2
#define OSMESSAGE_QUEUES 2
5.1. 任务分配
根据终端的特点,为了减少Salvo在任务切换时不占用太多的系统资源,主要将任务分为6个任务,每个任务的功能描述如下 [6] [7] :
(1) GPRS_Ontime _Task:在GPRS主循环中,主要完成对收到的完整GPRS帧数据和TCP数据的处理,并对中心站数据做出响应,为减少RAM资源的占用,待所有的命令返回结果输出完毕退出之前,必须清除接收缓冲区中的内容。每30 s发送一次心跳包,优先级设为1。

Figure 7. The target code to create a flow chart
图7. 目标代码建立流程图
(2) Voltage_Monitor_Task:每30ms检测PC.7端口,高电平则电压过低,将标志位Voltage_Flag置1,优先级设为2。
(3) DS1302_Task:每1s读取一次DS1302的当前时间值,时间值存入全局变量数组DS1302_Get_Date[]中,优先级设为2。
(4) ADC_TaskStk:每20ms执行一次AD转换,计算最终值后存入数组中,待数组填满后,采用限幅平均滤波算法进行数字过滤,根据设定值判断是否超出水位上下限,如果超出则将预警标志位置1。优先级设为3。
(5) LCD_CMD_Process:LCD触摸屏键盘监控,每20ms运行一次。优先级设为3。
(6) Network_Task_Main:显示AD转换的结果和报警信息。LCD液晶动态显示任务,负责系统的设置时的辅助显示任务,处于等待状态,由事件触发激活。优先级设为4。
5.2. 事件设置
Salvo中,信号(Semaphores)和消息(Messages)用来代表事件(events),信号和事件提供了实现任务间通讯的机制 [8] [9] 。
本系统配置了1个消息(Touch_Key)和2个二进制信号(Ontime_Report 和 Warning_Lever)。其中,Touch_Key为触摸屏按键消息,系统获取按键消息信号后执行相应的按键任务LCD_CMD_Process,与二进制信号不同,消息被用来控制资源。Ontime_Report和Warning_Lever为Ontime_Report_Task任务和Warning_Task任务的触发二进制信号,定时上报数据和预警任务被设置成为处于等待状态,系统不会去运行它,只有在触发信号将其激活后,系统才会去运行它。代码示例如下:

在任务Warning_Lever ()中,程序如果运行到OSSignalBinSem(BINSEM_ALARM),BINSEM_ALARM 就置1。在任务Warning_Task ()中,当程序运行到OS_WaitBinSem(BINSEM_ALARM)时,如果BINSEM_ALARM=1,就将其置0,并执行其后面的代码;否则就一直处于等待状态,其后面的代码永远不会被执行 [10] 。
5.3. 系统节拍
系统中建立一个精确的工作时钟,对于基于时钟的多任务操作是非常重要的。本系统中,利用CPU内部时钟来产生系统节拍(system tick)。时钟Timer1配置成每2 ms中断运行一次,中断优先级设置为最高,中断程序调用Salvo的OSTimer()服务程序,并重载Timer1的预设值,保持系统以2ms的节拍运行。其代码如下:

通过OSTimer()和OSDelay(),在通常情况下,保证了任务运行时间的正确性,如在ADC_CHx_Enable任务中,调用OSDelay(10),该任务就每30ms执行一次。其代码如下:

5.4. 工作流程
如图8所示。Salvo运行后,只有活动的任务在运行,处于等待状态的任务并不消耗系统资源,只有在被激活时才占用系统资源,因此运行效率得到提高。
初始化SFR:SFR是Special Function Register,即特殊功能寄存器。SFR是各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据。它是最具有特殊的部分,现在功能的增加和扩展几乎都是通过增加特殊功能寄存器SFR来达到目的的。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器。
主程序源代码示例如下:

6. 实验
针对地下水位远程监测设备,主要进行了GPRS/SMS切换和远程数据收发等解析方面的性能测试以及系统稳定性测试。系统测试平台基于JAVA Web技术的远程监控中心系统。
地下水位远程监测设备每天定时发送5次上报数据,测试时间从2011年5月26号至2012年5月26号,测试时间为1年,根据数据统计分析,数据上报成功率为98.2%,未能上报数据主要原因:由于现场的抽水和下雨时雨水倒灌入井造成了水位超出了上下限,使设备处于报警状态,短信预警共发生次数为10次,成功发送率100%。
7. 结论
针对目前地下水位监测存在的问题,采用了远程数据传输技术和嵌入式Salvo操作系统,设计了水位远程在线监测终端,其融合了GPRS/SMS和以太网数据远程传输技术,保证了数据传输的可靠性。
本系统操作方式为全自动供电工作方式,控制单元系统能够自动按照设定好的时间完成采集数据、数据分析、发送数据等工序;系统还设计了故障报警、液位报警、手动自动选择开关。系统设计有效的接地装置,以达到最大限度的系统保护。
系统主要功能:
(1) 获取分析仪器及辅助设备的工作状态,如运行、采集、测量、校准、报警、远程对时、供电状态等。
(2) 具有历史数据存储功能,能在现场进行3个月以上的历史数据查询。
(3) 抗干扰能力强,具有停电自动切换、来电自动恢复、异常自动启动和复位等功能。
(4) 根据不同类型的自动控制监测站和运行维护的要求,实现对仪器设备的远程控制。
(5) 具有数据采集功能,控制操作功能,对时功能。
(6) 仪器设备状态量采集(包括实现远程控制的状态量)
通过设备在现场应用表明,应用Salvo嵌入式操作系统作为系统的核心,使远程在线监测终端具有可靠性、稳定性的同时,具备了实时性、在线连续监测等特点,满足了水位远程监测的需求。