基于多线程技术的测控系统软件设计
2016-09-09宋国堃赵世平
杨 珂,宋国堃,赵世平
(四川大学 制造科学与工程学院,四川 成都 610065)
基于多线程技术的测控系统软件设计
杨 珂,宋国堃,赵世平
(四川大学 制造科学与工程学院,四川 成都610065)
根据某系统软件设计的需要,开发了基于多线程技术的测控系统软件。本文中所介绍的软件是通过微软.Net平台下的C#语言实现的。该语言平台提供强大的线程模型,完整的线程接口能够满足对线程操作的需要。软件核心采用多线程技术,将数据采集、试验控制、UI交互以及安全监测等功能模块放在不同线程内执行。线程同步技术保证了线程之间对象高速传输的准确性。该软件设计方式不仅大幅度提高了软件的稳定性和可靠性,还充分利用了计算机的系统资源从而加快系统工作效率。
多线程;线程同步;测控系统;C#
文中所介绍的系统是集机械、液压、电气以及计算机于一体的工业测控系统。本系统不仅要满足对各部分模拟数字信号采集与输出的需要,同时要实现系统复杂的试验控制功能。系统软件要完成数据采集、试验控制、UI人机交互以及安全监测等功能。传统的测控软件大多使用面向过程的编程模式,根据系统任务的需要自上至下的执行程序[1]。该编程模式显然无法满足本系统多任务同步执行以及高速数据采集控制的需要。
根据系统软件的功能需要,采用多线程作为软件的核心技术。本软件使用微软Visual Studio 2013平台下的C#语言进行开发。该平台的.Net Framework 4.5托管编码环境提供完整并且功能强大的线程模型[2]。
依据该模型将整个程序分成若干功能模块,把每个功能模块放在不同的线程内执行。该方式依托多线程技术旨在把软件功能模块化,从而简化了软件的框架结构,从根本上实现系统的功能要求。
1 多线程技术
1.1多线程介绍
多线程技术就是允许一个复杂的应用程序能够同时执行若干个任务。这里所说的“同时”在计算机发展的不同阶段代表着不同的含义。在计算机内核上只存在一个CPU时,多任务只能是并发执行即多个任务在相同的时间间隔内执行。这里的时间间隔一般由操作系统来分配。由于计算机的执行速度很快,从逻辑上来看多任务是在同时执行。然而当计算机进入多核时代以后,一个CPU拥有多个内核,这里的多任务就是并行执行,每个任务同时在不同的计算机内核上执行,从而实现了真正意义上的同时执行。单核时代使用多线程或者单线程来处理多个任务时,实际上表现出来的处理效果并没有太大差异。然而由于多线程之间任务的相互切换反而会耗费大量的系统资源,从而会使得多线程的执行效率更低[3]。相比之下,在多核计算机上使用多线程可以充分利用计算机的各个内核的硬件资源,远远超过单线程的执行效率。因此,本文所介绍的多线程都是在多核硬件平台下的多线程,实现软件各线程真正意义的并行执行[4]。
1.2线程基本操作和线程同步
.Net平台的C#语言提供了操作线程的丰富接口,其中包括操作线程的方法,例如线程的开启、阻塞、销毁、优先级设置等;也包括获取线程的各种属性,例如获取线程的名称、标识符、当前执行状态等信息。在应用程序中,对线程的常用操作包含以下步骤 (伪代码示例):1)Thread myThread=new Thread()实例化一个线程对象myThread;2)myThead.Start (myMethod())开启一个线程,myMethod()为线程所要执行方法的引用;3)在需要阻塞线程的位置,语句Thread.Sleep (myMillisecond)使线程进入休眠状态,myMillisecond为一个int型参数指定阻塞线程的时间,单位为毫秒;4)线程执行完成myMethod()方法中的所有语句后,程序即会销毁线程并且释放线程所占用的系统资源,或者给myMethod()方法的循环体判断标志置位,并且在调用线程使用Join()方法等待线程终止[5]。
在多线程中,如果允许不同的工作线程对同一个对象进行读写操作,这势必会导致该对象访问出错从而引发程序异常。线程同步技术利用互斥锁以排他方式防止共享对象被同时访问。互斥锁工作的基本原理是在某个线程访问共享对象前,向操作系统申请锁对象,如果锁被其他线程占有,说明其他线程正在访问该共享对象,当前线程则没有访问权限因此阻塞当前线程,直到获取锁才结束阻塞状态;如果互斥锁处于释放状态,则当前线程马上获取锁并访问共享对象,在访问结束后释放互斥锁。使用这种方式,保证了程序在同一时刻只能有一个线程可以访问共享对象[6]。C#语言提供的线程同步有Mutex、Monitor以及Lock等对象,使用方法均通过获取互斥锁、标记访问共享对象的临界区、释放互斥锁等操作组成。
2 多线程在系统软件中的详细设计
2.1软件框架介绍
文中所介绍的软件根据系统的功能要求,人为的把程序各功能模块放在以下多个独立的线程中执行,它们分别是数据采集线程(这里包括低速和高速采集两个线程)、UI交互线程、试验控制线程以及安全监测线程。线程间交互及逻辑关系如图1所示。
图1 程序框架图
2.2线程功能详解
2.2.1数据采集线程
数据采集作为测控系统软件的基础功能,通过在while函数中循环调用采集板卡的系统API函数为显示、控制以及安全判断提供系统模拟和数字信息。本软件根据系统采集和控制的需要,将数据采集分为低速数据采集线程和高速数据采集线程。在本文的测控系统中,一部分模拟信号和数字信号仅作为辅助参考信号使用,例如液压压力、温度、过滤器状态等信号。低速线程采集的数据以触发事件的形式将数据传递给UI显示线程和试验控制线程和安全监测线程。并且保证低速采集线程每采集一次数据睡眠10 ms,从而节约系统资源。相比较于低速采集线程,高速采集线程则负责采集系统需要采集频率较高的拉压力以及位移信号,并且使用线程同步技术保证数据的高速传输。为了满足系统试验控制线程的采样要求,本系统选用Advantech公司的PCI1716数据采集卡。该采集板卡具有16位分辨率的8路差分输入或16路单端输入模拟信号采集功能,采样频率可达250 KS/s。软件实测显示,在线程全速采集无休眠操作的情况下单通道采集时间为160 μs/次,该采集速度可以满足系统需求。
2.2.2UI交互线程
UI交互线程实现显示试验界面以及响应用户操作的功能。该线程一方面把来自数据采集线程数据、试验控制线程的试验状态以及安全监测线程的状态信息通过窗体的显示控件直观的表示出来,例如chart、richtextbox、label等控件;另一方面通过用户触发窗体控件的事件属性来响应其操作,软件中即通过“开始试验”按钮的Click()事件开启试验控制线程。试验界面设计如图2所示。
2.2.3试验控制线程
试验控制线程实现试验过程控制和数据保存的功能。线程同步的方式使得该线程与高速采集线程实现数据共享,从而保证了试验过程数据的高速采集。高速采集的数据一方面用于试验控制的判断依据,另一方面数据被保存到缓存数组中并定期保存到文件当中以供查看历史数据。该线程执行的方法体中集合了整个试验的核心控制算法,依赖采集的实时数据、状态标志以及逻辑判断等实现复杂的试验控制功能。
2.2.4安全监测线程
安全监测线程实时监测整个系统的各项工作参数是否在安全参数范围内,如果参数超标则报警或者紧急停机。该线程在系统软件启动后就开始运行,直至退出软件停止工作。这其中监测的信号包括拉压力、液压压力、温度液位以及急停开关等信号,这些信号同样来自于数据采集线程。该线程也是一个低速线程,每监测一个循环睡眠100 ms。
2.3线程同步实现
软件为满足系统对于实时高速数据采集的要求,在数据采集线程和试验控制线程之间实现数据共享对象的线程同步操作。线程同步具体代码如图3所示。这里选用Monitor对象来实现线程同步,数据共享对象为高速采集线程中的cacheBuf数组。如图程序所示,高速采集线程T1对cacheBuf进行写操作,试验控制线程T2对其进行读操作。线程同步操作步骤:1)T1执行Monitor.Enter()语句,获取锁并将T2线程阻塞在Monitor.Enter()语句处;2)T1执行Monitor.Pulse()语句,通知阻塞在Monitor.Wait()语句处的线程进入就绪状态;3)T1执行Monitor.Wait()语句,释放锁并且进入等待状态;4)此阻塞在Monitor.Entor()处的T2获取锁并执行到Monitor. Pulse()通知阻塞在Monitor.Wait()的T1进入就绪状态;5)T2执行Monitor.Wait()语句,释放锁并且进入等待状态,此时处于就绪状态并阻塞在Monitor.Wait()处的T1重新获取锁,并执行Monitor.Exit()并释放锁;6)由于T2阻塞在Monitor.Wait()处并处于等待状态,此时T1再次执行Monitor.Enter()语句并再次获取锁。依次类推,保证在同一时间只有一个线程获取能够获取对共享对象cacheBuf的独占访问权。
图2 实验界面
图3 线程同步图
3 结 论
本文利用多线程技术,一方面实现了测控系统软件各功能模块的代码分离从而优化了软件框架,保证其可靠性和稳定性;另一方面,多线程的引入大幅度提高系统资源的利用率从而提升软件的整体执行效率。这种基于多线程的测控软件设计方法同时具有很高的复用性。本文软件中的各功能模块已在多个测控软件中实现了充分的代码复用,并且得到满意的效果。
[1]武杰.快速可重组机械工程测控实验平台的研制 [D].南京:南京航空航天大学,2007.
[2]Tobin Titus,Fabio Claudio Ferracchiati.C#线程参考手册[M].北京:清华大学出版社,2003.
[3]眭俊华,刘慧娜,王建鑫,等.多核多线程技术综述[J].计算机应用,2013(33):239-242,261.
[4]刘权盛,杨洪斌,吴悦,等.同时多线程技术[J].计算机工程与设计,2008(4):963-967.
[5]Christian Nagel,Bill Evjen,Jay Glynn,等.C#高级编程[M]. 8版.北京:清华大学出版社,2013.
[6]杨宗德,吕光宏,刘雍.Linux高级程序设计[M].3版.北京:人民邮电出版社,2012.
The software design of measurement and control system based on multi-threading technology
YANG Ke,SONG Guo-kun,ZHAO Shi-ping
(Manufactory Science and Engineering Institute of Sichuan University,Chengdu 610065,China)
We developed a software of measurement and control system based on multi-threading technology according to the design need of a certain measurement and control system.The realization of the software in the article is through the C# language on the.Net platform,which providing with a powerful thread model and complete operation interfaces can meet the needs toward to the operation on threads.The core function of the software,which starts different threads to run the data acquisition,experiment control,UI interaction and safety monitoring functional modules,is multi-threading technology. Thread synchronization technology guaranteed the accuracy of high-speed objects transmission among different threads.On the one hand,this kind of design pattern enhances the stability and reliability of the software significantly,on the other hand,it can also takes full advantage of the computer's system resources to speed up the working efficiency of the system.
multi-threading;data synchronization;measurement and control system;C#
TN98
A
1674-6236(2016)16-0089-03
2015-08-25稿件编号:201508133
杨珂(1991—),男,四川成都人,硕士。研究方向:仪器仪表工程。