多线程技术在土体三轴流变试验机上的应用
2016-06-23陈庆峰宫志清
陈庆峰,宫志清,王 伟
(1.长春机械科学研究院有限公司,吉林 长春 130103;2.吉林省鹏程电器消防设备有限公司,吉林 长春 130062)
多线程技术在土体三轴流变试验机上的应用
陈庆峰1,宫志清2,王伟1
(1.长春机械科学研究院有限公司,吉林 长春 130103;2.吉林省鹏程电器消防设备有限公司,吉林 长春 130062)
摘要:着重论述了多线程技术在土体三轴流变试验机上的应用,详细阐述了多线程程序设计。经过长时试验验证,土体三轴流变试验机性能稳定,符合试验要求。
关键词:多线程;同步;试验机
1引言
土体三轴流变试验机主要用于土体在三轴应力作用下的流变性能测试。可以在恒定围压下进行恒载荷和恒变形控制,即进行蠕变和松弛试验。也可在恒载荷或恒变形控制一段时间后,再施加按一定频率和振幅变化的动态载荷,然后再转为静态,由此不断循环。能够测试在上述三轴加载条件下试样上的力和变形变化,及试样内部的孔隙压力和孔隙水流量,其中的孔隙压力与孔隙水流量由上位机采集数据。
在数据采集系统的程序设计时,一般采用查询法或中断法。查询法就是采用一个循环,依次采集各个通道。中断法是采用硬件中断的形式,先启动A/D转换,在转换结束时发出一个中断信号,CPU响应采集卡的中断时读出所采集的数据。中断法的优点是资源能充分利用,但当系统的硬件中断资源紧张时,容易造成中断冲突。另外,对于某些采集硬件,不支持中断工作方式。当系统需要同时对多个I/O模块控制时,上述2种方法都很难实现。
采用基于多线程的设计方法,不仅可以完成对多个I/O模块的实时控制,并能实现数据采集、存储、显示实时快速更新,方便操作人员进行分析判断。
2多线程技术
基于NT技术的Windows操作系统,采用多线程作为基本调度单位,其应用程序至少包含一个主线程,还可以根据需要创建一个以上工作线程。一个多线程应用程序允许多个任务并发执行,因而可以执行某些实时性或随机性很强的操作,提高对CPU和其它资源的利用率,加快信息处理速度。结合循环缓冲和精确定时技术,利用多线程技术可以实现数据的高速、实时、连续采集以及同步处理。
3多线程的主程序设计
主程序的设计由响应用户控制操作、数据采集显示、数据存储、数据分析、曲线描绘组成。单线程编写的程序容易造成数据分析时影响数据采集与存储,数据的显示长时间没有更新,操作者会认为系统死机,此时如果再进行其它操作,系统会长时无法响应该操作,严重时造成数据丢失,影响试验。
多线程的主程序设计以响应用户控制操作作为进程中的主线程,开辟以数据采集线程和数据分析、数据保存、数据显示、曲线描绘线程作为两个辅助线程。其原理结构如图1所示。
图1 主程序原理结构
采用多线程技术,使响应用户控制操作、数据采集显示、数据存储、数据分析、曲线描绘相独立。子线程在Win32API函数WaitForSingleObject作用下进入睡眠状态,把CPU时间让给数据采集线程。当满足一定条件时,用创建的Win32API函数SetEvent将指定事件消息发送给子线程,子线程即可恢复运行状态,迅速处理,处理结束后再进入睡眠状态。这样,就保证了数据的实时采集显示的及时性。
4子线程的程序设计
4.1数据采集程序
数据采集程序中,当有了AD数据采集卡hDevice设备对象句柄后,便可用InitDeviceProAD函数初始化AD部件。关于采样通道、频率等的参数设置,是由这个函数的pPara参数结构体决定的。只需要对这个pPara参数结构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化。然后用StartDeviceProAD即可启动AD部件,开始AD采样,接着调用GetDevStatusAD_Half函数以查询AD的存储器FIFO的半满状态。如果达到半满状态,即可用ReadDeviceProAD_Half函数一批半满长度(或半满以下)的AD数据,然后再接着再查询FIFO的半满状态,若有效再读取,这样反复查询状态反复读取AD数据即可实现连续不间断采样。当需要暂停设备时,执行StopDeviceProAD,当需要关闭AD设备时,执行ReleaseDeviceProAD便可实现(但设备对象hDevice依然存在)。这部分的主要代码如下:
′读取AD卡孔隙水压力数据
If PCI_ReadDeviceProAD_Half(hDevice,ADBuffer(0),_
nReadSizeWords,nRetSizeWords) = True Then
ADData = (ADBuffer(0)) And 65535
′将原码转换为电压值
fVolt = ADData * (10000# / 65536#)
′1mV=0.2kPa
Sys1DefBCSZ(0) = fVolt * 0.2
Sys1DefB(0) = fVolt * 0.2 - Sys1DefBLing(0)
′ 显示压力值
SSPDEFB(0).Caption = Format(Sys1DefB(0),"#0.0")
End If
4.2数据存储程序
数据存储程序设计中采用了一级缓冲队列和二级缓冲队列的设计方案,避免了数据堵塞造成数据丢失的问题。即便应用程序突然很忙,使数据处理线程没有时间处理已到来的数据,但是由于缓冲区队列的缓冲作用,可以让数据采集线程先将数据连续缓存在这个区域中。由于这个缓冲区可以设计得比较大,因此可以缓冲很长的时间,这样即便是数据处理线程由于系统的偶而繁忙而被堵塞,也很难使数据丢失。这部分的主要代码如下:
WSuccess = PCI_WriteFile(AD_Module.hFileObject,InUserRegion(0,AD_Module.CurrentIndex),AD_Module.ReadSizeWords * 2) ′数据存放在硬盘上
If AD_Module.m_Wrote8KWCounter >= 128 Then)
AD_Module.m_WroteMB = AD_Module.m_WroteMB + 1
AD_Module.m_Wrote8KWCounter = 0
Else
AD_Module.m_Wrote8KWCounter = AD_Module.m_Wrote8KWCounter + 2
End If
4.3曲线描绘程序
曲线的描绘主要通过VB的Picturebox控件实现。在子线程B中,存储数据的同时描绘曲线。这部分的主要代码如下:
Select Case Curve.ListIndex ′选择曲线类型
Case 0
′轴向负荷-时间
NewY1 = UnitNewY * (DATALOADZ(1) - (sngZeroLoad)) + 6800 * YYGauge
NewX1 = UnitNewX * DATATIME(1) + 6000 * XXGauge
For i = 2 To DataNum
NewY2 = UnitNewY * (DATALOADZ(i) - (sngZeroLoad)) + 6800 * YYGauge
NewX2 = UnitNewX * DATATIME(i) + 6000 * XXGauge
PCurveNew.Line (NewX1,6800 - NewY1)-(NewX2,6800 - NewY2),QBColor(12)
NewX1 = NewX2:NewY1 = NewY2
Next
Case 1
′轴向变形-时间
NewY1 = UnitNewY * (DATAPosition(1) - (sngZeroPosition)) + 6800 * YYGauge
NewX1 = UnitNewX * DATATIME(1) + 6000 * XXGauge
For i = 2 To DataNum
NewY2 = UnitNewY * (DATAPosition(i) - (sngZeroPosition)) + 6800 * YYGauge
NewX2 = UnitNewX * DATATIME(i) + 6000 * XXGauge
PCurveNew.Line (NewX1,6800 - NewY1)-(NewX2,6800 - NewY2),QBColor(12)
NewX1 = NewX2:NewY1 = NewY2
Next
Case 2
′轴向负荷-轴向变形
NewY1 = UnitNewY * (DATALOADZ(1) - (sngZeroLoad)) + 6800 * YYGauge
NewX1 = UnitNewX * (DATAPosition(1) - (sngZeroPosition)) + 6000 * XXGauge
For i = 2 To DataNum
NewY2 = UnitNewY * (DATALOADZ(i) - (sngZeroLoad)) + 6800 * YYGauge
NewX2 = UnitNewX * (DATAPosition(i) - (sngZeroPosition)) + 6000 * XXGauge
PCurveNew.Line (NewX1,6800 - NewY1)-(NewX2,6800 - NewY2),QBColor(12)
NewX1 = NewX2:NewY1 = NewY2
Next
Case 3
′围向压力-时间
NewY1 = UnitNewY * (DATADEFA(1) - (sngZeroDefA)) + 6800 * YYGauge
NewX1 = UnitNewX * DATATIME(1) + 6000 * XXGauge
For i = 2 To DataNum
NewY2 = UnitNewY * (DATADEFA(i) - (sngZeroDefA)) + 6800 * YYGauge
NewX2 = UnitNewX * DATATIME(i) + 6000 * XXGauge
PCurveNew.Line (NewX1,6800 - NewY1)-(NewX2,6800 - NewY2),QBColor(12)
NewX1 = NewX2:NewY1 = NewY2
Next
Case 4
′孔隙压力-时间
NewY1 = UnitNewY * (DATADEFB(1) - (sngZeroDefB)) + 6800 * YYGauge
NewX1 = UnitNewX * DATATIME(1) + 6000 * XXGauge
For i = 2 To DataNum
NewY2 = UnitNewY * (DATADEFB(i) - (sngZeroDefB)) + 6800 * YYGauge
NewX2 = UnitNewX * DATATIME(i) + 6000 * XXGauge
PCurveNew.Line (NewX1,6800 - NewY1)-(NewX2,6800 - NewY2),QBColor(12)
NewX1 = NewX2:NewY1 = NewY2
Next
Case 5
′孔隙水流量-时间
NewY1 = UnitNewY * (DATADEFC(1) - (sngZeroDefC)) + 6800 * YYGauge
NewX1 = UnitNewX * DATATIME(1) + 6000 * XXGauge
For i = 2 To DataNum
NewY2 = UnitNewY * (DATADEFC(i) - (sngZeroDefC)) + 6800 * YYGauge
NewX2 = UnitNewX * DATATIME(i) + 6000 * XXGauge
PCurveNew.Line (NewX1,6800 - NewY1)-(NewX2,6800 - NewY2),QBColor(12)
NewX1 = NewX2:NewY1 = NewY2
Next
End Select
5总结
应用多线程编程机制,可以很好地处理数据采集中多任务的同时性问题,实现数据的连续不间断采集、显示、存储。但是,多线程要比普通程序设计复杂很多。由于任一时刻都可能有多个线程同时执行,许多变量、数据都可能被其它线程所修改,因此要注意在多线程程序中开辟线程的数量和线程间的同步控制。该技术在土体三轴流变试验机的程序设计中取得了很好的效果,长时试验证明,数据采集及时、准确,数据存储安全、可靠。
参考文献
[1]骆斌,费翔林.多线程技术的研究与应用[J].计算机研究与发展,2000,37(4):407-412.
[2]潘瑞云.基于PC/104计算机的水声数据采集系统设计与实现[D].哈尔滨工程大学,2009.
[3]李建宏,何玉珠.多线程技术在复杂数据采集系统中的应用[J].电子测量技术,2008,31(5):102-104.
Application of Multithreading Technology to Soil Triaxial Rheological Testing Machine
Chen Qingfeng1,Gong Zhiqing2,WangWei1
(1.Changchun Research Institute for Mechanical Science Co.,Ltd.Changchun 130103,Jilin,China; 2.Jilin Pengcheng Electric Fire Equipment Co.,Ltd.Changchun 130062,Jilin,China)
Abstract:The application of multithreading technology to soil triaxial rheological testing machine is discussed,and the multithreading software design is described in detail.The longtime test shows that the soil triaxial rheological testing machine has stabile performance,which can meet the requirements of the test.
Keywords:multithreading;synchronization;testing machine
[收稿日期]2015-12-03
[作者简介]陈庆峰(1976—),男,本科学历,高级工程师,主要研究方向:计算机控制系统设计与研发。
中图分类号:TH87
文献标识码:B
doi:10.3969/j.issn.1674-3407.2016.01.026