摘要:近年来,随着智能传感器、无线传感器网络及FPGA/CPLD技术的快速发展,以传感器为核心的多种类数据采集已经成为人类感知自然界最直接、有效的方式。这种新的传感器数据采集系统可广泛应用于军事国防、交通、污染环境监测,制造,医疗卫生领域,具有可观的应用价值。本文通过使用多线程技术和策略设计模式设计采集软件,使软件保证采集的实时性和可靠性,并使软件易扩展更多传感器采集。
关键词:多传感器;实时数据采集;软件设计;实现
前言
在PC机上开发多传感器实时数据采集软件已成为工业控制、信息融合等领域的重要环节。为保证多传感器数据采集的实时性和软件易扩展性,采用多线程技术并发处理多传感器数据采集,采用策略设计模式实现采集与显示两部分低耦合,对未设置数据发送频率的传感器采用多媒体定时器实现高精度的定时采样,采用双缓冲技术局部绘图实现采集数据曲线实时更新显示。实验表明,应用该技术开发的多模态生物信息采集软件能实时、可靠地采集与显示多个传感器数据,且软件易扩展更多传感器采集。
1、软件设计方案
多传感器实时数据采集软件设计框图如图1,传感器通过串口、并口、网络等方法与计算机通讯,计算机调用查询、中断、回调函数等方法采集传感器数据。采用面向对象程序设计,将各个传感器采集数据等方法封装成类。采集线程模块对每个传感器对象创建一线程或多媒体定时器,线程或定时器函数调用采集数据方法,并将采集到数据加入各自缓冲队列,实现并发采集多传感器数据。显示线程模块也对每个传感器对象创建一线程,线程函数读取对应缓冲队列中数据并出队,读取的数据写入文件并更新界面显示。
图1 软件设计框图
由于各个传感器类接口都相同,其包括初始化传感器、读取传感器数据、关闭传感器等接口,应用面向对象思想,将接口方法抽象为抽象类,实现传感器类的接口与实现分离,进一步采用策略设计模式实现采集线程模块和显示线程模块低耦合,使软件更易扩展。
2、多媒体定时器的应用与实现
2.1多媒体定时器的应用
某些传感器无法固定频率向计算机发送数据,为实现精确定时采样,采用定时器触发采集程序,在MFC编程中,常见的定时器API函数是Set Timer,其工作原理是由PC的ROM初始化Intel8253定时器芯片产生硬件中断向量08H,该中断向应用程序发送WM_TIMER消息,不过该时间中断每1/18s触发一次,所以采样频率只能达到18Hz,此外,WM_TIMER消息优先级较低,只有等消息队列中其他非WM_TIMER消息处理完之后,才会响应该消息,因此,这个定时函数无法满足采集需求。而Windows还提供了设备驱动程序SYSTEM.DRV来管理8253的异步时钟,它提供的多媒体定时器接口可以按照定时精度要求设置8253定时器芯片的计数初值,在自身的线程中运行,当一定的中断次数达到之后,直接触发预先设置好的回调函数,不必以消息的形式通知应用程序,更加直接可靠地保证中断的实时响应,其定时精度最高可达到1ms,满足采样需求。
2.2多媒体定时器的编程实现
多媒体定时器通过time Set Event函数创建,由于类的普通成员函数不能作为回调函数,故采用全局函数作为回调函数,本文创建媒体定时器时,将创建该定时器类的this指针传入给dwUser形参作为回调函数的实参,在回调函数中使用该指针调用类的成员函数,在成员函数中会调用传感器类读取数据方法,从而每隔uDelay毫秒触发的回调函数会调用传感器类读取数据方法来实现采集,在程序结束前调用timeKillEvent函数释放资源。
3、策略模式设计采集
设计模式是一套代码设计经验的总结,使用设计模式是为可重用代码,使代码更容易被他人理解,并保证代码的可靠性。一个设计模式提供了一个针对某一特定问题的解决方案。策略模式定义了一系列的算法,并将每一个算法封装,而且使它们还可以相互替换,策略模式应用在多类之间的区别仅仅限于它们的行为,既多个类之间的接口是相同的,通过多态在运行时选择需执行的具体行为。多传感器采集使用策略模式就能让代码可重用,同时让程序易扩展更多传感器采集。
4、多线程的应用与实现
4.1多线程机制
由于单线程对多传感器进行数据采集时,需要依次对每个传感器调用采集程序,Windows操作系统以线程为最小单位分配时间片,这导致多个传感器采集过程在同一个时间片依次采集,所以采集的实时性难以保证。而多线程技术是为了同步完成多项任务,通过提高资源的使用效率来提高系统的效率,采用多线程技术可以使每个传感器的采集过程都分到一个时间片,从而多个传感器的采集并行处理,实时性可显著提高。多个线程之间需要共享数据,本文将采集到的数据添加入队列中,这个队列会等待另一个线程来移除数据,这个队列即为共享数据。这是线程中典型的生产者消费者问题,为防止其中一个线程未完成向队列中添加数据就被另外一个线程移除或者一个线程没有移除数据就被另外一个线程覆盖了,需要控制线程的同步,让线程访问共享数据之前,首先要获得该共享数据的拥有权,从而使该线程结束访问之前阻塞其他线程对共享数据的访问。
4.2多线程实现
Win32线程细分为工作线程和界面线程,工作线程只有一个线程函数,没有消息队列和消息循环,而界面线程存在消息队列和消息循环。实现传感器数据的采集,线程只需要调用传感器类的读取函数,不需要消息循环等,所以只需要创建工作线程。工作线程多个函数都可以创建,如Create The rad、A fxBegin Thread,创建线程函数主要需设置线程函数和传入线程函数的参数,线程函数必须声明为如下形式,否则无法成功调用。
本文传递给线程函数的实参为this指针,既指向创建该线程的类,在线程函数中通过该指针调用成员函数,所以线程函数实际执行的是创建该线程类的一个成员函数。在本文中创建线程有两类用途,其一是通过CScope类的m_device指针不间断调用传感器类读取函数采集传感器数据,另一个是更新CScope类中数据缓冲区并刷新数据曲线界面,更新CScope类数据缓冲区使用m_device指针调用RemoveData函数出队数据并将出队的数据加入数据缓冲区,这两类用途的线程流程图如图3,其中两个状态变量m_ThreadActive和m_Active作用分别为标志该线程是否仍在运行和线程函数外部控制该线程是否结束循环的标志,图2中的队列数据即为上文提到的共享数据,控制该数据的访问使用临界区实现,程序中通过定义CCriticalSection类变量表示“临界区”,同时为防止异常时没有释放锁定队列数据或者编程中忘记调用UnLock函数释放锁定而导致队列数据一直被一个线程锁定,使用CSingleLock类管理CCriticalSection类变量,CSingleLock类会在析构函数中调用解锁操作。
5、采集实例
图2 多模态生物信息采集软件界面
应用本文方案开发的多模态生物信息采集软件,其界面显示如图2,实现采集四个传感器的数据,四个传感器获取的信号分别为表面肌电信号、脑电波信号、平衡板信号、姿态仪信号,其表面肌电信号和脑电波信号采样频率为1kHz,将四个信号融合判断患者脑部运动控制功能障碍等级。经过实验表明,软件能实时、可靠地采集各个传感器数据并更新界面显示,采集的实时性得到保证且易扩展更多传感器采集。
参考文献:
[1]张宇飞,基于FPGA和无线传感器网络的水处理监控系统研究,2011,哈尔滨工业大学.
[2]陈家润,基于无线传感器网络的数据采集系统,2010,南京理工大学.
论文作者:李彦哲1,周岩2
论文发表刊物:《电力设备》2018年第27期
论文发表时间:2019/3/13
标签:线程论文; 传感器论文; 函数论文; 数据论文; 定时器论文; 队列论文; 实时论文; 《电力设备》2018年第27期论文;