多线程技术在1000MW水轮发电机推力轴承试验上的应用
2011-07-02李淑钰祖宇聪
孙 凯,李淑钰,祖宇聪
(1.哈尔滨大电机研究所,哈尔滨 150040;2.东北林业大学,哈尔滨 150040)
1 引言
对于大型发电机,推力轴承的设计和制造技术是非常重要的。进行推力轴承试验是优化大型水轮发电机组推力轴承的结构、参数,提高其运行可靠性的关键研究工作。
为了能够准确可靠的获得推力轴承试验的各项数据,采用了先进的微机测控系统,使用交互式编程语言LabWindows/CVI作为平台来进行测控软件的开发,并在软件开发过程中采用了多线程的编程技术。
2 推力轴承试验中的测控系统
在1000MW水轮发电机推力轴承试验中,测控系统以先进的工业控制计算机为核心,其硬件系统由多种传感器、信号调理模块、接口转换模块、多功能数据采集卡、VXI总线数采系统、单片机、巡检仪等多种硬件系统组成,需要测试的数据点包括转速、载荷、温度、压力、位移等多达254个,为了及时准确的测得数据,硬件系统中采用了多种测试设备,设备与计算机之间采用了不同的通讯方式,这些通讯方式包括计算机与VXI数采系统之间的MXI-2、RS-232、无线485、以太网等技术(见图1)。
软件系统以 LabWindows/CVI为开发平台,为了合理利用硬件资源,安全可靠的进行测试,软件系统中多处使用了多线程技术。
图1 硬件系统基本组成框图
3 多线程技术
多线程技术是指计算机的操作系统在同一时间内可以允许多个程序同时执行的能力,也就是让CPU同时执行多个线程。
3.1 线程
进程通常被定义为一个正在运行的程序的实例,若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,线程是进程内部的可独立执行的单元,负责执行包含在进程的地址空间中的代码,是操作系统对系统资源的调度单位。
3.2 CPU如何完成多线程任务
目前主流的Windows操作系统都是基于多任务机制的,即可同时运行多个应用程序,这需要有多个线程同时执行代码,操作系统会为每一个线程安排一定的CPU时间,称为时间片,让每个线程只在自己时间片内运行,时间片结束之后中断该线程的运行,启动另外的线程执行,这被称为线程切换。操作系统通过循环方式为线程提供时间片,采用时间片轮换的方式来执行多个任务。
多线程技术的优势在于将任务分解为多个线程,可以在主线程外产生一个或几个辅助线程,每个线程独立的执行自己的代码,用于完成如数据采集、网络访问、数据存储等后台工作,这些线程可以共享进程中的数据。
由上述介绍可以知道,对于单个CPU计算机来说,宏观上可以实现多线程并行运行,进而提高CPU的工作效率,对于多CPU的计算机,可以将不同的任务分配给不同CPU内核来执行,从而可以真正达到多个线程同时运行。这种多线程机制为单个计算机同时管理多个外围设备提供了一种很好的解决方案。
3.3 LabWindows/CVI中多线程程序的实现方式
LabWindows/CVI是美国 NI公司开发的面向计算机测控领域的软件开发平台,它以ANSI C为核心,采用交互式编程方法,提供了大量的功能函数。
该软件提供了四种多线程机制的实现方式:线程池方式、异步定时器方式、Timer控件定时器方式和使用Windows SDK函数的方式。
(1)线程池方式
线程池可以理解为线程的容器,程序开发人员可以使用CmtNewThreadPool( )函数来创建新的线程池,通过调用线程调度函数将需要执行的函数传递到线程池,这个被传递的函数称为线程函数,线程函数可以起任何名字,并且函数原型也没有限制。
在线程结束时,必须调用线程注销函数来释放线程池的资源,否则系统资源会逐渐消耗殆尽。
(2)异步定时器方式
此方式适用于等时间间隔执行任务,异步定时器是利用Windows多媒体定时器在指定的时间间隔点调用线程函数,此种方式下需要调用工具库中的函数以创建异步定时器,函数原型如下:
int CVICALLBACK NewAsyncTimer(double
interval,int count, int initialState,void*callbackFunction,void *callbackDat);异步定时器创建好以后把需要执行的线程函数传递给NewAsync Timer函数,并设定执行的时间间隔。异步定时器的时间间隔精确,可以用来对一些采集设备进行精确的软件定时。
(3)timer定时器方式
这种多线程实现方式是调用一个timer定时器,它是 LabWindows/CVI提供的一个控件,能够等间隔循环启动它的回调函数,独立于主线程之外,其执行效果与异步定时器接近,但是timer控件执行线程的优先级低,受主线程的影响严重,不适合做时间间隔要求非常严格的工作,因此这种多线程实现方式常常被程序开发者忽略。
(4)使用Windows SDK中提供的函数
Windows SDK提供了进行多线程编程的相关函数,这些函数定义在winbase.h文件中,导入库为kernel.lib文件,在使用的时候需要在源文件中添加windows.h文件,编程时调用CreateThread函数可以创建新的线程,函数SuspendThread和函数ResumeThread分别用来暂停和继续执行独立线程,函数TeminateThread用来终止独立的线程。
此方式下,有些函数在windows SDK和LabWindows/CVI中都有定义,这些函数使用不当会出现编译错误,因此要注意使用正确的头文件。
3.4 线程的优先级
线程的优先级会影响线程从CPU获得时间的长短,系统不会允许优先级低的线程先执行,因此在程序设计时,应该尽量将不重要的任务设成较低的优先级。
设置线程优先级的函数如下:
BOOL SetThreadPriority(HANDLE hThread,int nPriority)
4 多线程技术在测控系统中的应用方案
在1000MW水轮发电机推力轴承测控系统中,由计算机发送采集指令,送入VXI数据采集系统、单片机、巡检仪等设备,测量结果返回到计算机中,然后进行数据显示和保存。需要实现的功能有:
(1)系统时间显示;
(2)VXI数采系统对转速、载荷的监测;
(3)VXI数采系统测量温度数据;
(4)数据采集卡对位移的测量;
(5)采用无线485通讯对温度巡检仪和单片机采集系统进行控制;
(6)RS-232中断程序,用于位移测试仪;
(7)TCP/IP通讯用于下位机数据显示。
在测控系统软件的开发调试过程中,采用了多线程的编程方案。本系统中使用了线程池方式来实现多线程的程序开发。经过对系统任务的分析,考虑了实际应用的过程,既要保证得到真实可靠的测试数据,又要保证系统的安全,把测控软件所要完成的功能划分给不同的线程函数。在创建好的线程池内调用这些线程函数。
(1)系统时间显示线程,在主函数中创建一个只有一个线程的线程池,在线城池中只放一个线程函数,循环进行时间调用与显示。虽然线程池中只有一个线程,但这是独立于主函数进程之外的,不影响主函数的运行,不会造成程序失去响应的问题。
(2)转速、载荷的监测及温度数据采集线程,创建一个新线程池,放入两个线程函数,一个用来测量转速和载荷,另一个用来测量温度数据,由于此任务分配给VXI数采系统,该设备中的选用的模块不支持并行采集,所以为了完成不同的测量任务,这里设置了硬件占用和硬件释放标志。
(3)创建第三个线程池,将PCI数据采集卡测量程序、无线485通信程序、RS-232中断程序、以太网通信程序这四个函数放在这个线程池中,这四个函数分别使用不同的设备,相互之间不会干扰,所以在同一个线程池内不会影响程序运行。
至此,软件系统的主要测试任务被分配到了多个线程中,在主函数中对这些线程函数进行启动和终止等控制,并在用户界面上设置相应的入口。用多线程的编程方案开发测控系统软件,提高了系统并行处理问题的能力。
将任务分配给不同线程后,提高了硬件系统的利用效率,但是也存在风险,因为在不同的线程内,会出现两个线程同时访问数据的情况,甚至会出现数据访问时被改写的问题,因此必须保护全局变量、静态局部变量和动态分配的变量,否则可能会造成逻辑错误。LabWindows/CVI通用库提供了三种不同的机制来保护数据:线程锁,线程变量和线程队列。本系统软件采用了线程队列机制,线程队列函数允许线程之间安全地传递数据,保证读数据和写数据线程不会彼此阻塞。
另外需要注意的是,在线程函数执行完成后要释放其所占用的硬件资源,系统运行结束前要关闭线程池,否则会导致操作系统资源消耗过大。
5 应用该技术后的系统测试结果
使用多线程技术开发的测控系统软件在白鹤滩1000MW 水轮发电机推力轴承试验中成功地完成了塑料瓦、钨金瓦的试验,为百万千瓦机组推力轴承研究提供了大量真实可靠的数据,圆满地完成了对各种工况的控制和大量的数据采集任务。
在以往的单线程测控系统中,所有的测控任务都是按顺序执行的,在数据采集的时候,每一项功能都需要一定的执行时间,这样完成所有项目的采集需要的时间比较长,当某一任务无法完成时,测控软件会不停的等待,造成软件无法结束的问题。另外,在试验过程中,顺序执行的任务结束前,软件无法响应操作者的任何指令,这是严重的安全隐患。推力轴承试验测控系统中使用了多线程的编程技术以后,解决了上述问题,温度采集、压力采集、油膜厚度采集等都是相互独立的,互不干涉,软件可以随时对操作者的指令做出响应,从而保证了试验台的安全运行。
通过使用多线程的编程方案,测控软件的程序结构更加合理,由于多个线程同时执行,大大缩短了程序的执行时间,多台设备同时运行,一个测试循环时间由5分钟缩短到了3分钟,充分利用了硬件资源,提高了试验的效率。
6 结束语
采用多线程技术进行测控软件开发,能够提高CPU的工作效率,充分利用系统资源,进而提高了程序的实时性,增强了CPU对外围设备的控制能力,使测控系统软件的工作效率大大提高。目前,多核心处理器逐渐普及,从而使得测控软件能够真正做到多线程同时执行,该技术也日趋成熟。多线程技术的应用,不仅缩短了测控软件的开发周期,也大大提高了系统的可靠性,为科学试验提供大量真实可靠的数据。
[1](美)Jeffrey Richter .Windows核心编程.北京:机械工业出版社, 2000.
[2]宋宇峰.LabWindows/CVI逐步深入与开发实例.北京:机械工业出版社, 2003.
[3]白鹏.虚拟仪器编程语言 LabWindows/CVI教程.北京: 电子工业出版社, 2001.