陳慶峰,宮志清,王 偉
(1.長(zhǎng)春機(jī)械科學(xué)研究院有限公司,吉林 長(zhǎng)春 130103;2.吉林省鵬程電器消防設(shè)備有限公司,吉林 長(zhǎng)春 130062)
多線程技術(shù)在土體三軸流變?cè)囼?yàn)機(jī)上的應(yīng)用
陳慶峰1,宮志清2,王偉1
(1.長(zhǎng)春機(jī)械科學(xué)研究院有限公司,吉林 長(zhǎng)春 130103;2.吉林省鵬程電器消防設(shè)備有限公司,吉林 長(zhǎng)春 130062)
摘要:著重論述了多線程技術(shù)在土體三軸流變?cè)囼?yàn)機(jī)上的應(yīng)用,詳細(xì)闡述了多線程程序設(shè)計(jì)。經(jīng)過(guò)長(zhǎng)時(shí)試驗(yàn)驗(yàn)證,土體三軸流變?cè)囼?yàn)機(jī)性能穩(wěn)定,符合試驗(yàn)要求。
關(guān)鍵詞:多線程;同步;試驗(yàn)機(jī)
1引言
土體三軸流變?cè)囼?yàn)機(jī)主要用于土體在三軸應(yīng)力作用下的流變性能測(cè)試。可以在恒定圍壓下進(jìn)行恒載荷和恒變形控制,即進(jìn)行蠕變和松弛試驗(yàn)。也可在恒載荷或恒變形控制一段時(shí)間后,再施加按一定頻率和振幅變化的動(dòng)態(tài)載荷,然后再轉(zhuǎn)為靜態(tài),由此不斷循環(huán)。能夠測(cè)試在上述三軸加載條件下試樣上的力和變形變化,及試樣內(nèi)部的孔隙壓力和孔隙水流量,其中的孔隙壓力與孔隙水流量由上位機(jī)采集數(shù)據(jù)。
在數(shù)據(jù)采集系統(tǒng)的程序設(shè)計(jì)時(shí),一般采用查詢法或中斷法。查詢法就是采用一個(gè)循環(huán),依次采集各個(gè)通道。中斷法是采用硬件中斷的形式,先啟動(dòng)A/D轉(zhuǎn)換,在轉(zhuǎn)換結(jié)束時(shí)發(fā)出一個(gè)中斷信號(hào),CPU響應(yīng)采集卡的中斷時(shí)讀出所采集的數(shù)據(jù)。中斷法的優(yōu)點(diǎn)是資源能充分利用,但當(dāng)系統(tǒng)的硬件中斷資源緊張時(shí),容易造成中斷沖突。另外,對(duì)于某些采集硬件,不支持中斷工作方式。當(dāng)系統(tǒng)需要同時(shí)對(duì)多個(gè)I/O模塊控制時(shí),上述2種方法都很難實(shí)現(xiàn)。
采用基于多線程的設(shè)計(jì)方法,不僅可以完成對(duì)多個(gè)I/O模塊的實(shí)時(shí)控制,并能實(shí)現(xiàn)數(shù)據(jù)采集、存儲(chǔ)、顯示實(shí)時(shí)快速更新,方便操作人員進(jìn)行分析判斷。
2多線程技術(shù)
基于NT技術(shù)的Windows操作系統(tǒng),采用多線程作為基本調(diào)度單位,其應(yīng)用程序至少包含一個(gè)主線程,還可以根據(jù)需要?jiǎng)?chuàng)建一個(gè)以上工作線程。一個(gè)多線程應(yīng)用程序允許多個(gè)任務(wù)并發(fā)執(zhí)行,因而可以執(zhí)行某些實(shí)時(shí)性或隨機(jī)性很強(qiáng)的操作,提高對(duì)CPU和其它資源的利用率,加快信息處理速度。結(jié)合循環(huán)緩沖和精確定時(shí)技術(shù),利用多線程技術(shù)可以實(shí)現(xiàn)數(shù)據(jù)的高速、實(shí)時(shí)、連續(xù)采集以及同步處理。
3多線程的主程序設(shè)計(jì)
主程序的設(shè)計(jì)由響應(yīng)用戶控制操作、數(shù)據(jù)采集顯示、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析、曲線描繪組成。單線程編寫(xiě)的程序容易造成數(shù)據(jù)分析時(shí)影響數(shù)據(jù)采集與存儲(chǔ),數(shù)據(jù)的顯示長(zhǎng)時(shí)間沒(méi)有更新,操作者會(huì)認(rèn)為系統(tǒng)死機(jī),此時(shí)如果再進(jìn)行其它操作,系統(tǒng)會(huì)長(zhǎng)時(shí)無(wú)法響應(yīng)該操作,嚴(yán)重時(shí)造成數(shù)據(jù)丟失,影響試驗(yàn)。
多線程的主程序設(shè)計(jì)以響應(yīng)用戶控制操作作為進(jìn)程中的主線程,開(kāi)辟以數(shù)據(jù)采集線程和數(shù)據(jù)分析、數(shù)據(jù)保存、數(shù)據(jù)顯示、曲線描繪線程作為兩個(gè)輔助線程。其原理結(jié)構(gòu)如圖1所示。
圖1 主程序原理結(jié)構(gòu)
采用多線程技術(shù),使響應(yīng)用戶控制操作、數(shù)據(jù)采集顯示、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析、曲線描繪相獨(dú)立。子線程在Win32API函數(shù)WaitForSingleObject作用下進(jìn)入睡眠狀態(tài),把CPU時(shí)間讓給數(shù)據(jù)采集線程。當(dāng)滿足一定條件時(shí),用創(chuàng)建的Win32API函數(shù)SetEvent將指定事件消息發(fā)送給子線程,子線程即可恢復(fù)運(yùn)行狀態(tài),迅速處理,處理結(jié)束后再進(jìn)入睡眠狀態(tài)。這樣,就保證了數(shù)據(jù)的實(shí)時(shí)采集顯示的及時(shí)性。
4子線程的程序設(shè)計(jì)
4.1數(shù)據(jù)采集程序
數(shù)據(jù)采集程序中,當(dāng)有了AD數(shù)據(jù)采集卡hDevice設(shè)備對(duì)象句柄后,便可用InitDeviceProAD函數(shù)初始化AD部件。關(guān)于采樣通道、頻率等的參數(shù)設(shè)置,是由這個(gè)函數(shù)的pPara參數(shù)結(jié)構(gòu)體決定的。只需要對(duì)這個(gè)pPara參數(shù)結(jié)構(gòu)體的各個(gè)成員簡(jiǎn)單賦值即可實(shí)現(xiàn)所有硬件參數(shù)和設(shè)備狀態(tài)的初始化。然后用StartDeviceProAD即可啟動(dòng)AD部件,開(kāi)始AD采樣,接著調(diào)用GetDevStatusAD_Half函數(shù)以查詢AD的存儲(chǔ)器FIFO的半滿狀態(tài)。如果達(dá)到半滿狀態(tài),即可用ReadDeviceProAD_Half函數(shù)一批半滿長(zhǎng)度(或半滿以下)的AD數(shù)據(jù),然后再接著再查詢FIFO的半滿狀態(tài),若有效再讀取,這樣反復(fù)查詢狀態(tài)反復(fù)讀取AD數(shù)據(jù)即可實(shí)現(xiàn)連續(xù)不間斷采樣。當(dāng)需要暫停設(shè)備時(shí),執(zhí)行StopDeviceProAD,當(dāng)需要關(guān)閉AD設(shè)備時(shí),執(zhí)行ReleaseDeviceProAD便可實(shí)現(xiàn)(但設(shè)備對(duì)象hDevice依然存在)。這部分的主要代碼如下:
′讀取AD卡孔隙水壓力數(shù)據(jù)
If PCI_ReadDeviceProAD_Half(hDevice,ADBuffer(0),_
nReadSizeWords,nRetSizeWords) = True Then
ADData = (ADBuffer(0)) And 65535
′將原碼轉(zhuǎn)換為電壓值
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數(shù)據(jù)存儲(chǔ)程序
數(shù)據(jù)存儲(chǔ)程序設(shè)計(jì)中采用了一級(jí)緩沖隊(duì)列和二級(jí)緩沖隊(duì)列的設(shè)計(jì)方案,避免了數(shù)據(jù)堵塞造成數(shù)據(jù)丟失的問(wèn)題。即便應(yīng)用程序突然很忙,使數(shù)據(jù)處理線程沒(méi)有時(shí)間處理已到來(lái)的數(shù)據(jù),但是由于緩沖區(qū)隊(duì)列的緩沖作用,可以讓數(shù)據(jù)采集線程先將數(shù)據(jù)連續(xù)緩存在這個(gè)區(qū)域中。由于這個(gè)緩沖區(qū)可以設(shè)計(jì)得比較大,因此可以緩沖很長(zhǎng)的時(shí)間,這樣即便是數(shù)據(jù)處理線程由于系統(tǒng)的偶而繁忙而被堵塞,也很難使數(shù)據(jù)丟失。這部分的主要代碼如下:
WSuccess = PCI_WriteFile(AD_Module.hFileObject,InUserRegion(0,AD_Module.CurrentIndex),AD_Module.ReadSizeWords * 2) ′數(shù)據(jù)存放在硬盤(pán)上
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曲線描繪程序
曲線的描繪主要通過(guò)VB的Picturebox控件實(shí)現(xiàn)。在子線程B中,存儲(chǔ)數(shù)據(jù)的同時(shí)描繪曲線。這部分的主要代碼如下:
Select Case Curve.ListIndex ′選擇曲線類型
Case 0
′軸向負(fù)荷-時(shí)間
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
′軸向變形-時(shí)間
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
′軸向負(fù)荷-軸向變形
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
′圍向壓力-時(shí)間
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
′孔隙壓力-時(shí)間
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
′孔隙水流量-時(shí)間
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總結(jié)
應(yīng)用多線程編程機(jī)制,可以很好地處理數(shù)據(jù)采集中多任務(wù)的同時(shí)性問(wèn)題,實(shí)現(xiàn)數(shù)據(jù)的連續(xù)不間斷采集、顯示、存儲(chǔ)。但是,多線程要比普通程序設(shè)計(jì)復(fù)雜很多。由于任一時(shí)刻都可能有多個(gè)線程同時(shí)執(zhí)行,許多變量、數(shù)據(jù)都可能被其它線程所修改,因此要注意在多線程程序中開(kāi)辟線程的數(shù)量和線程間的同步控制。該技術(shù)在土體三軸流變?cè)囼?yàn)機(jī)的程序設(shè)計(jì)中取得了很好的效果,長(zhǎng)時(shí)試驗(yàn)證明,數(shù)據(jù)采集及時(shí)、準(zhǔn)確,數(shù)據(jù)存儲(chǔ)安全、可靠。
參考文獻(xiàn)
[1]駱斌,費(fèi)翔林.多線程技術(shù)的研究與應(yīng)用[J].計(jì)算機(jī)研究與發(fā)展,2000,37(4):407-412.
[2]潘瑞云.基于PC/104計(jì)算機(jī)的水聲數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].哈爾濱工程大學(xué),2009.
[3]李建宏,何玉珠.多線程技術(shù)在復(fù)雜數(shù)據(jù)采集系統(tǒng)中的應(yīng)用[J].電子測(cè)量技術(shù),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
[作者簡(jiǎn)介]陳慶峰(1976—),男,本科學(xué)歷,高級(jí)工程師,主要研究方向:計(jì)算機(jī)控制系統(tǒng)設(shè)計(jì)與研發(fā)。
中圖分類號(hào):TH87
文獻(xiàn)標(biāo)識(shí)碼:B
doi:10.3969/j.issn.1674-3407.2016.01.026