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