周 敏,郭迎庆,李永博
(南京林业大学 机械电子工程学院,南京210037)
太阳能作为一种新能源,以其清洁、无污染、取之不尽等优点,被寄予了厚望。 对太阳能的利用主要是通过太阳能的光伏作用来收集能源。
20 世纪80年代以前,光伏发电应用得并不多,与光伏发电相关的监控仪表也很少,主要通过人工的方式对系统进行监控。 操作人员手工操作发电系统,使用检测仪表对系统进行检测、记录,误差较大。 这种传统方法很明显已经不适合现今高速发展的时代。 如今,光伏发电已经得到了大力发展,国外在光伏发电的监控技术方面已经较为成熟,但由于人们比较关注光伏发电的产业化,监控系统主要为提高光伏发电的效率,研究重点放在了系统的控制方面,对于系统的监测和维护考虑得很少[1-3]。 故在此基于Linux 操作系统的Qt 模块设计了太阳能充电显示界面。
该太阳能充电显示界面可以将太阳能充电过程产生的电压数据实时显示,并且以折线图的形式动态呈现,因此可以获得太阳能充电过程的原始数据,为太阳能充电系统的改进与优化以及科学研究提供有用的数据,它的设计对光伏发电技术的进一步推广和应用具有十分重要的意义。
Qt 是一个跨平台的C++图形用户界面应用程序开发框架,由挪威TrollTech 公司出品。 Qt 具有优良的跨平台特性、可移植性、面向对象、海量帮助文档、开源等优点。Linux 下的Qt Designer 简化了用户界面设计过程, 提供了大量封装好的工具和接口,用户可以轻而易举地通过拖拽的方式布控Qt 界面控件。 布局完成后,可以通过简单的方式对各个窗口控件以及界面风格进行相应的参数设置。 总之,Qt Designer 为太阳能充电过程监测的显示界面设计提供了便捷的方式。
文中设计的图形显示界面是用于监测太阳能充电过程中电压的变化的。 首先需要对整个显示界面中的控件进行合理布局,然后编程实现各个控件的功能以及控件间的关系,最后实现绘制实时动态曲线图。
在Qt 程序开发中,除了可以手写代码实现软件开发外, 还可以通过Qt 的GUI 界面设计器Qt Designer 进行界面的绘制和布局。 通过鼠标直接拖拽窗口部件,便能高效、快速地实现GUI 界面的设计。根据设计要求,显示界面的设计主要包括数据显示模块、按键控制模块、图形显示模块,如图1 所示。
图1 图形显示界面布局Fig.1 Graphic display interface layout
1)数据显示模块 该模块用于显示实时数据。进入Qt 设计器主界面后,在顶层窗口部件中划分一块区域作为数据显示模块,再将其用网格布局划分为4 部分,分别为最大值、最小值、平均值和当前值。
2)按键控制模块 在实际工程中,显示界面往往需要一个启停的控制按钮。 在界面上拖拽2 个QPushButton 部件作为启停控制按钮和保存按钮,通过点击“启动”按钮即可控制数据动态显示的开始和暂停。 点击“保存”按钮,实现对监测数据的保存,以便后期用于数据分析。
3)图形显示模块 最终的数据以折线图的形式显示在图形显示模块,横坐标为时间,纵坐标为数值。 在此界面图形的绘制主要依赖Qt Charts 模块。 在Qt Charts 发布之前,Qt 比较著名的2 个画图插件是Qwt 和Qcustom,其中Qcustom 较轻量,只需要在project 中包含qcustomplot.h 和qcustomplot.cpp几乎就可以使用。 相比Qcustom,Qwt 的功能更为强大,但其安装不便,且仅是对静态图表的表示非常出色,动态曲线表现性能并不突出。
整个显示界面中控件的布局完成后,需要在“.h”和“.cpp”文件中对所选择的控件进行定义和声明,然后这些控件才能实现其功能。
2.2.1 数据显示的实现
实时获得最大值和最小值的算法主要用到了QList 和QSort 类。QList<T>是最常用的容器,在此用于存储得到的数据。Qsort<T>是Qt 中自带的快速排序函数。 将列表的数据按照升序形式进行排序,然后将排序的结果输出,第1 个值即为最小值,最后一个值即为最大值。 程序如下:
实时获得平均值同样用到了QList 类。首先使用QList 的“int QList::count(const T &value) const”,不断对产生的数据个数进行计数。 然后使用“const T &QList::at(int i) const”,执行将前面数据的总和加上一个新数据作为新的总和,再将新的总和与数据个数相除得到当前数组的平均值,如此不断循环进行。 程序如下:
实时输出当前值则是直接将新增的数输出,程序如下:
2.2.2 按键控制实现
Qt 提供了信号和槽机制用于完成界面操作的响应,是完成任意2 个Qt 对象之间的通信机制。 其中, 信号会在某个特定情况下或动作下被触发,槽是等同于接受并处理信号的函数。
启动和暂停按钮使用的是QTimer 类的槽“[slot]void QTimer::stop( )”和“[slot]void QTimer::start( )”。 当点击按钮控件时,按钮控件会发出单击信号,相应的QTimer 的槽函数接收到这个信号,开始调用停止/开始的函数。 程序如下:
2.2.3 图形显示实现
文中界面图形的绘制主要依赖Qt Charts 模块。 在安装Qt 的时候,如果选择了Qt charts 部分,那么在Qt 中使用charts 时,只需要在“.pro”文件中添加语句“QT += charts”,并且在程序的开头加上一句“using namespace Qtcharts”或者一个宏“QT_CHARTS_USE_NAMESPACE?”。
绘制折线图时, 最先考虑其坐标轴。 纵坐标Y轴固定不变,所以可通过“chart->createDefaultAxes( )”语句设置。 对于二维坐标轴的设定,定义maxY为100,满足所有数据不超过该值。 通过“axisY()->setRange (a,b)” 来设定Y 轴 (其中a,b 为任意常数),将Y 轴设定为0~maxY。 程序如下:
对图形显示的命名使用setTitle()函数,默认居中显示。将图标命名为“Dynamic display”。使用语句chart->setTitle("Dynamic display");
由于所设计的显示界面用于实时动态显示数据, 即折线图要随着横坐标X 轴的增长而实时变化。 当数据还未填充整个显示区时,曲线从右到左逐渐出现,当充满显示区后,旧数据用新数据来替代,核心算法就是收到一个新的数据时添加到List的后面,并把List 的第1 个数据删除,看上去就是曲线向前滑动了一步。X 轴获取系统当前时间,并且随时间滚动。 程序如下:
当数据个数超额,则删除最前面的数据,程序如下:
在实际太阳能充电过程中,用于绘制折现图形的数据通过电压传感器获得。 为了便于界面设计,在此使用任意样本数据来代替。 将样本数据保存于config.txt 文本中,用<QFile>来读取config.txt 文件中的数据。 程序如下:
将产生的数据用折线图表示出来, 如图2a 所示,图中所显示的折线带有很明显的锯齿状。 为了使所显示的线更光滑平整,且消除锯齿,通过语句:
chartView->setRenderHint (QPainter::Antialiasing)来提高抗锯齿渲染的能力。 经过抗锯齿处理,显示的线条更加光滑,如图2b 所示。
图2 抗锯齿处理前后的数据折线图Fig.2 Data line diagram before and after anti-aliasing treatment
最后,为了界面的美观,需要对图标的位置进行必要的布局。 常用的布局方式有3 种:水平布局、垂直布局、网格布局。
在“.cpp”文件的开始定义#include<QHboxLayout>类,QhboxLayout 便是水平布局, 可以设置整个图形距离窗口的边距。通过“setContentsMargins(a,b,c,d)”,调整图形显示框的上下左右与顶层窗口的距离,这样使图形界面显得更整齐。 该设计将边距全部调整为0,整个图标填充满整个窗口。 程序如下:
Qchartview 类是为了显示曲线,“ui->chartView->setChart(chart);”的作用是将图形和窗口建立联系,使图形放在窗口中显示。 没有这2 条语句,绘制的图形就不会显示,仅有一个空白的窗口而已。
为了验证所设计界面的有效性和准确性,采用了2 组不同的数据在该界面中进行显示。
第1 组数据由正弦函数产生,即
式中:t 为时间变量。 该函数在所设计界面上的实时显示如图3 所示。 界面测试之正弦信号显示可见,该界面能准确地显示正弦信号。
图3 界面测试之正弦信号显示Fig.3 Sinusoidal signal display for interface testing
第2 组测试数据采用实时采集的太阳能充电过程中蓄电池端电压的电压值。 数据采集当天所用的太阳能电池板开路电压, 为20.1 V; 工作电压为11.33~11.44 V。 要求充电测试当天光照充足, 温度28 ℃。所采集的具体数值见表1。运行后界面显示效果如图4 所示。
表1 太阳能充电电压Tab.1 Solar charging voltage
图4 界面测试之充电电流显示Fig.4 Interface test charging current display
将太阳能充电的数据用Excel 绘制,如图5 所示。通过对比可见,该显示界面能够准确显示数据组。
图5 蓄电池端电压随时间的变化Fig.5 Variation of battery terminal voltage with time
以上2 组数据测试表明, 在此基于Linux 操作系统中Qt 模块所设计的太阳能充电显示界面,能够实现太阳能充电过程的数据实时动态的监测功能。
基于Linux 的Qt 模块设计的图形界面,能够满足太阳能充电过程的数据监控。 其中,界面设计在Linux 操作系统下开发,主要包括显示界面的设计、数据的动态显示以及横轴的实时滚动。 通过界面测试,表明设计的该图形界面准确地实现了实时采集数据的实时动态显示功能。