实时监测系统数据处理和动态曲线绘制方法

2015-03-15 05:59马志刚刘文怡张文栋
图学学报 2015年1期
关键词:绘图绘制曲线

马志刚, 刘文怡, 张文栋

(1. 中北大学仪器科学与动态测试教育部重点实验室;电子测试技术重点实验室,山西 太原 030051;2. 山西农业大学信息科学与工程学院,山西 太谷 030801)

实时监测系统数据处理和动态曲线绘制方法

马志刚1,2, 刘文怡1, 张文栋1

(1. 中北大学仪器科学与动态测试教育部重点实验室;电子测试技术重点实验室,山西 太原 030051;2. 山西农业大学信息科学与工程学院,山西 太谷 030801)

数据处理和曲线绘制是实时监测系统不可或缺的组成部分。实时监测系统由前端数据采集模块、数据传输通道和后端监测模块组成。分析各种数据传输方式的特点,讨论前端采集模块中数据组织和发送的一般方式,研究后端监测模块中数据处理和曲线绘制的基本流程。针对常规曲线绘制方法效率较低、显示死板等缺点,提出基于内存拷贝数据更新方式的动态曲线绘制方法。使用API相关函数优化曲线绘制程序,使程序执行效率有较大提高,可以保证测试系统实时性要求。

实时监测;数据处理;曲线绘制;内存拷贝;数据更新;API函数

随着计算机、传感器、通信、数据处理等相关学科的发展,实时监测系统已广泛应用于工农业生产、环境安全、航空航天、国防装备等各大领域。如工业设备可靠性、安全性监测与故障诊断[1-2],工程质量监测[3-4],地质灾害预测[5],电力生产和系统维护[6],油气能源生产、勘探[7],农田[8],温室,食品安全,环境保护[9-10],气象预测,医疗监控[11],交通[12],安保,导弹、火箭发射监测[13]等方面都有各类实时监测系统的成功应用。

由于曲线比较直观,大多数实时监测系统都要求将关键参数以曲线或图形的方式呈现在屏幕上。实时曲线可以反映被监测参数的实时变化情况,是对测量系统当前工作状态的直观描述,实时性要求非常高[14]。随着计算机软件技术的发展,多种开发工具(如 Visual Basic、Visual C++、LabWindows等)、第三方控件、组件等均可被方便地运用于图形应用软件的开发。考虑到监测系统对实时性要求较高,因此必须尽可能地提高程序执行效率。其除了与数据结构、算法、所处理的数据量等因素有关外,还与开发工具的选择密切相关[14-15]。经综合考虑,本文基于 Visual C++ 2008(VC 2008)展开讨论。

1 实时监测系统

典型的实时监测系统通常由前端采集模块、数据传输通道(线缆或无线方式)和后端监测模块组成,如图 1所示。前端模块和后端模块之间可采用多种数据通信方式,比较常用的有:USB传输方式[13]、光纤传输方式[5]、以太网分布式传输方式[3,6]、无线传感器网络传输方式[8]等。相比而言:USB方式数据传输速度较快,其USB 3.0的数据传输速度高达5 Gbps,但该方式易受外部电磁环境干扰而影响数据传输。光纤传输方式不易受复杂电磁环境影响且数据传输速度快,单根光纤的数据传输速率可达若干Gbps,传输距离能达几十公里,但光纤本身较为脆弱易折断,需深埋铺设加以保护。以太网传输方式的软、硬件结构简单且传输距离一般能达到100米左右,但其中的UDP模式在数据传输时有丢包的风险。无线传感网络方式可用于多点监测,但需解决多节点之间的协同、时间同步等难题。

图1 实时监测系统的组成

2 数据处理

在实时监测系统中,有大量从现场采集的测试数据通过前端模块实时传输到后端监测模块。这些数据反映了设备或系统的运行状态和性能参数,对其进行分析、计算,可为待监测设备或系统提供决策依据[1]。一般情况下,实时监测系统的前端模块只负责将采集到的数据经编帧、组包后发送至后端模块,后续的数据分析、处理、曲线显示等大都在后端模块中完成。

2.1 前端模块数据组织和发送

不同的测试数据有特定的数据组织方式,工程上将其称为“编帧”,编帧得到的一帧数据被称为“帧结构”[14]。“组包”是将若干数据帧组合成待发数据包的过程,组包大小需视采样率、采样通道数、发送时间间隔等因素而定。“帧结构”和“包结构”通常由帧(包)头、数据、帧(包)计数、帧(包)尾等组成。表1所示的是一种比较典型的简单数据帧结构[16]。

表1 一种典型的简单数据帧结构

前端模块可采用定时方式向后端模块发送数据包。例如,可将每毫秒(ms)采集的数据编为一帧,而将100 ms(0.1 s)的数据组成一包(100帧)并发往后端监测模块。在此情况下,后端监测模块每隔0.1 s就会接收并处理一包数据。

2.2 后端模块数据接收和处理

后端监测模块可以通过定时或循环方式接收来自前端模块的数据包。接收到的数据必须先经过“解包”和“解帧”,得到每通道数据后,方可进行分析、处理和曲线显示。实时数据接收、处理和曲线绘制流程如图2所示。为实现对数据的完整处理,如果前一包数据末尾有剩余数据,应先将其缓存,然后与下一包数据拼接后再进行处理。

图2 数据实时接收、处理和曲线绘制流程

3 实时曲线绘制

绘制实时曲线时需格外关注绘制方式、数据更新算法、曲线绘制算法等,这些因素都会对程序执行效率产生影响[17-18]。

3.1 实时曲线绘制方式

按照曲线显示效果不同,实时曲线绘制方式可分为逐点分屏绘制方式和动态绘制方式。假定将显示区域宽度设置为N个数据点。逐点分屏绘制是指从显示区域左端开始,根据时间推进依次绘制第一个、第二个,直至第N个数据点,最终整个显示区域被占满;然后显示区域的所有数据点被清除,并开始新一轮的数据点绘制。该方法的优点是程序简单、工作量较小、绘制速度较快。但其缺点也很明显:数据点在显示区域自左向右依次出现,而之前绘制的点则保持不动,直到显示区域被填满后清除重绘,其效果如图3所示。这种绘制效果不符合人的正常视觉习惯,无法实现真正的实时动态显示。

本文采用动态绘制方式。第一个数据点首先被绘制在显示区域的最右端(位置:N),当第二个数据点到达时,第一个数据点需要向左移动一个单位(位置:N–1),而后将第二个数据点绘制在显示区域的位置N处;依此类推,当第N个数据点到达时,其前(N–1)个数据点需集体左移一个单位,此时第一个数据点将位于显示区域的最左端。动态绘制方式得到的效果是数据点总是从显示区域的右端进入后连续向左流动,符合人的正常视觉习惯,其效果如图4所示。但是该绘制方式需要不断进行移位操作,工作量较大。因此,必须优化算法结构、简化运算过程,才能提高绘图效率,满足监测系统的强实时性要求。

图3 逐点分屏绘制方式效果

图4 动态绘制方式效果

3.2 数据更新算法

由于后端监测模块不断接收来自前端采集模块发来的数据,所以曲线不可能在显示区域一次性全部显示。在实际应用中,数据曲线只能以动态方式逐段逐屏显示。为保证实时性,显示区域的曲线在定时(如100 ms)刷新时必须有一部分是最新的,这就是“数据更新”。采用动态方式绘制曲线,其数据更新方法包括:

(1) 队列法。该方法需要创建一个“先进先出”的数据队列,其中包含最新的N个数据点,每接收到一部分新数据,经过处理后就将其插入数据队列尾部,而之前收到的数据就会被挤出队列。这样可以保证队列中的数据总是最新的,曲线绘制时,直接从队列中提取所有数据即可。

(2) 数组法。定义一个长度为 N 的数组DisDat[N],当有新数据(M个)到来时,就将数组中原有数据集体向前移动M个位置,然后将新数据赋给数组 DisDat的最后 M 个数据单元(DisDat[N–M]~DisDat[N–1]),如果数组已经被数据填满,则最先接收到的数据将被覆盖。此方法中,数组长度 N可以直接取为显示区域每次显示的数据点数。数组法的原理和实现过程比较简单,但是由于涉及频繁的数组元素搬移,导致其程序执行效率较低。分析以下代码:

# define DisCnt = 2550; //每屏显示数据点数

int NewCnt; //最新数据点数

float DisDat[DisCnt]; //数据

float NewDat[DisCnt]; //最新数据

//循环搬移数据

for(i = NewCnt; i < DisCnt; i++)

{

DisDat[i - NewCnt]= DisDat[i];

}

//更新最新数据

梓轩是个男孩子,说起话来没必要那么绕弯。我们在很短的时间内就愉快地结束了谈心。梓轩说:“老师,您这么一说,我还真觉得我和小雨就是相互欣赏。您放心,从今以后我会把全部精力用在学习上,给同学们做最好的榜样!”

for(i = DisCnt - NewCnt; i < DisCnt; i++)

{

DisDat[i]= NewDat[i – (DisCnt - NewCnt)];

}

如果绘制的数据点数较少,数据搬移操作耗时占曲线绘制总耗时的比重很小,甚至可以忽略;一旦绘制点数较多时,这部分时间就会急剧增加。因此需要考虑优化搬移数据部分的代码。

考虑到应用程序接口(application program interface, API)提供了内存拷贝函数CopyMemory,如果直接调用该函数,将有望缩短用于大批量搬移数据的时间。修改后的代码可以设计为:

CopyMemory(DisDat, DisDat + NewCnt, DisCnt -NewCnt); //循环搬移数据

CopyMemory(DisDat + DisCnt - NewCnt, NewDat, NewCnt); //更新最新数据

表2 两种数据搬移方法耗时对比(ms)

3.3 曲线绘制算法

VC 中提供了使用微软基础类库(microsoft foundation classes, MFC)绘制曲线的方法,基本过程为:确定绘图区域,创建设备描述表,初始化绘图工具(画刷、画笔、字体、颜色等),绘制曲线,释放绘图资源。

绘图区域一般为矩形,假定(X1, Y1)和(X2, Y2)分别是绘图区域左上角和右下角的坐标;dW表示绘图区域水平单位长度,它用于定位数据点在绘图区域中的水平位置(横坐标),该值与绘图区域宽度(X2 – X1)和每屏显示的数据点数(DisCnt)有关,即dW = (X2 – X1) / DisCnt;dH表示绘图区域的垂直单位高度,它用于定位数据点在绘图区域中的垂直位置(纵坐标),该值与绘图区域高度(Y2 – Y1)和数据点幅度范围有关,幅度范围可通过测试数据的最小值(ValMin)和最大值(ValMax)计算得到,即dH = (Y2– Y1) / (ValMax – ValrMin)。由于绘图区的坐标系(纵轴为自上而下方向)与常用的平面直角坐标系(纵轴为自下而上方向)不同,为符合习惯,数据点的纵坐标需经过转换。最终,每个数据点的坐标(PX[i], PY[i])可表示为:

PX[i]= X1 + dW * i;

PY[i]= Y2 - DisDat[0]* dH

绘制曲线时,可循环调用 LineTo函数将数据点依次用直线相连。这是一种比较常规的方法,但是效率较低。本文采用MFC中的API函数Polyline,通过调用该函数可直接将一组点显示出来,其语法格式为:

BOOL Polyline(LPPOINT lpPts, int nCnt);

其中:lpPts数组中存放一组数据点,(lpPts[i].x, lpPts[i].y)表示第i个数据点的坐标;参数nCnt表示数据点数。曲线绘制的核心代码为:

for(i=0; DisCnt; i++)

{

lpPts[i].x = PX[i];

lpPts[i].y = PY[i];

}

pDC -> Polyline(lpPts, DisCnt)

经过测算,采用Polyline方法绘图比常规方法(使用LineTo函数)更为高效[14]。

4 应用实例和分析

根据某测量系统功能需求,本文使用VC 2008作为开发工具,设计了实时监测系统测试软件,如图5所示。该系统的前端采集模块和后端监测模块之间采用基于 UDP协议的以太网数据传输方式,系统需要对多路(309路)测量参数以曲线方式进行实时监测。

实际上,对所有参数同时进行曲线绘制既无必要,也不现实。一方面,有限的曲线绘制区域包含过多曲线时,将影响视觉效果;再者,同时绘制的曲线数目越多,耗时则越多,将影响程序执行效率。表3列出了传统方法和本文提出的动态曲线绘制方法的绘制时间与显示点数、同时绘制曲线条数之间的对比。可见,曲线绘制是一项比较耗时的操作,即便采用效率较高的动态曲线绘制方法,也需要在显示点数、同时绘制的曲线条数之间做权衡,否则会影响到整个系统的实时性。

图5 某实时监测系统测后端监测模块界面

表3 多路曲线绘制中传统方法与本文方法耗时对比(ms)

5 结 论

实时监测在各类测试领域均有广泛应用,而数据处理和曲线绘制在实时监测系统中占有重要地位。本文利用MFC中API函数对内存拷贝和曲线绘制的支持,讨论了曲线绘制中的数据更新方法和绘图效率问题。利用CopyMemory函数可以实现对数组中数据的高效搬移,而通过调用 Polyline函数,可以优化绘图程序,使得程序执行效率有大幅提升。

[1]杜小璐, 朱明富, 王 琰. 工业现场实时监测数据的存储系统设计[J]. 华中科技大学学报: 自然科学版, 2008, 36(Sup1): 281-283.

[2]Uysal A, Bayir R. Real-time condition monitoring and fault diagnosis in switched reluctance motors with Kohonen neural network [J]. Journal of Zhejiang University-SCIENCE C (Computers & Electronics), 2013, 14(12): 941-952.

[3]郭宝玉, 李 震, 花胜强. 基于可靠 UDP的强震消息触发大坝实时监测系统[J]. 水电自动化与大坝监测, 2011, 35(5): 57-59, 67.

[4]Dai Yongbo, Li Peng, Liu Yanju, et al. Integrated real-time monitoring system for strain/temperature distribution based on simultaneous wavelength and time division multiplexing technique [J]. Optics and Lasers in Engineering, 2014, 59(8): 19-24.

[5]孙义杰, 张 丹, 童恒金, 等. 分布式光纤监测技术在三峡库区马家沟滑坡中的应用[J]. 中国地质灾害与防治学报, 2013, 24(4): 97-102.

[6]吴仕兵, 朱 武. 基于UDP浪涌保护器监测系统的设计[J]. 上海电力学院学报, 2013, 29(3): 283-287.

[7]杨 维, 张德珍. 网格型煤矿井下环境多参数监测[J].华中科技大学学报: 自然科学版, 2010, 38(10): 70-74.

[8]孙宝霞, 王卫星, 雷 刚, 等. 基于无线传感器网络的稻田信息实时监测系统[J]. 农业机械学报, 2014, 45(9): 241-246.

[9]王国建, 鲍军民, 李 桑, 等. 分布式环境照度监测系统的研究与实现[J]. 自动化仪表, 2013, 34(9): 34-36.

[10]冷 欣, 陈建峰, 叶 永. 一种分布式环境声音振动监测系统的实现[J]. 测控技术, 2013, 32(6): 24-27.

[11]张 宁, 张 跃. 远程医用实时监测与分析终端的研制[J]. 自动化与仪表, 2010, 25(2): 5-8, 49.

[12]Feng Yiheng, Hourdos J, Davis G A. Probe vehicle based real-time traffic monitoring on urban roadways [J]. Transportation Research Part C, 2014, 40(3): 160-178.

[13]沈三民, 狄宋珍, 秦 丽, 等. 基于FPGA的火箭参数实时监测系统设计[J]. 火力与指挥控制, 2011, 36(5): 160-163.

[14]马志刚, 刘文怡. 航天测试系统大容量数据曲线绘制方法的研究[J]. 图学学报, 2014, 35(4): 623-629.

[15]刘文怡, 甄国涌. 高速测控系统中实时数据处理软件技术研究[J]. 华北工学院学报, 2004, 25(3): 191-193.

[16]马志刚, 刘文怡, 张文栋. 航天测试系统通用数据处理软件的设计[J]. 微电子学与计算机, 2014, 31(11): 98-101.

[17]黄纯国, 钟乐海. 基于 Windows的通用曲线绘图软件的设计[J]. 计算机应用, 1997, 17(3): 28-30.

[18]胡星星, 滕云田, 王喜珍, 等. 地震波形数据实时监控软件的实现[J]. 地震地磁观测与研究, 2008, 29(1): 104-108.

A Method for Data Processing and Dynamic Curve Plotting in Real-time Monitoring System

Ma Zhigang1,2, Liu Wenyi1, Zhang Wendong1
(1. Key Laboratory of Instrumentation Science & Dynamic Measurement, Ministry of Education; Science and Technology on Electronic Test & Measurement Laboratory, North University of China, Taiyuan Shanxi 030051, China; 2. College of Information Science and Engineering, Shanxi Agricultural University, Taigu Shanxi 030801, China)

Data processing and curve plotting are dispensable functional modules in real-time monitoring system. The real-time monitoring system is composed of front-end acquisition module, data transmission channel and back-end monitoring module; characteristics of different data transmission ways are analyzed. The general method of data organization and transmission in front-end module is discussed. Meanwhile, the fundamental course of data processing and curve plotting in back-end module are researched. In view of low efficiency and rigid display result in conventional method, the dynamic curve plotting method based on memory copying data updating mode is proposed. Some API functions are adopted to optimize the plotting program, which can improve the program execution efficiency and ensure the real-time requirement in testing system.

real-time monitoring; data processing; curve plotting; memory copy; data updating; API functions

TP 311; TP 277; TP 391

A

2095-302X(2015)01-0133-06

2014-05-28;定稿日期:2014-07-25

国家自然科学基金资助项目(51275491)

马志刚(1982–),男,山西文水人,讲师,在读博士。主要研究方向为航天智能测量系统数据处理、惯性感知与测控技术等。E-mail:sxau_mzg@163.com

刘文怡(1970–),男,山西岚县人,教授,博士,博士生导师。主要研究方向为航天智能测量系统、无线传感网络等。E-mail:liuwenyi@nuc.edu.cn

猜你喜欢
绘图绘制曲线
来自河流的你
“禾下乘凉图”绘图人
未来访谈:出版的第二增长曲线在哪里?
基于Excel VBA和AutoCAD的滚动轴承参数化比例图绘制方法
幸福曲线
超萌小鹿课程表
垂涎三尺
放学后
梦寐以求的S曲线
在转变中绘制新蓝图