王曉丹 姚舜才 杜飛
關(guān)鍵詞: 超聲電機; 數(shù)據(jù)采集; 上位機軟件; MFC; 多線程技術(shù); 串口監(jiān)控
中圖分類號: TN919?34 ? ? ? ? ? ? ? ? ? ?文獻標識碼: A ? ? ? ? ? ? ? ? ? ? ? ? ? ?文章編號: 1004?373X(2019)06?0105?04
Abstract: In order to improve the current situation that the existing ultrasonic motor data acquisition system cannot process large amounts of data and its data acquisition accuracy is not high, a method that the Microsoft Foundation Classes (MFC) and multithreading technology are applied to the data acquisition system of the ultrasonic motor is proposed. The programming method using the multi?threading technology on the Visual Studio 2012 development platform is emphatically introduced, and applied to the design of the upper computer software program that performs real?time data transceiving and serial port monitoring for the ultrasonic motor controller, which can test the real?time variation of the ultrasonic motor′s rotating speed and torque versus with time at different drive voltages and duty ratios. The software can realize real?time monitoring and operation functions of the ultrasonic motor, which has been successfully applied in the ultrasonic motor data acquisition system in the laboratory. The practical results show that the data acquisition software can effectively control the start and stop of the motor, has a fast speed and high accuracy in data processing, can draw clear and accurate curves, and run smoothly and reliably.
Keywords: ultrasonic motor; data acquisition; upper computer software; MFC; multi?threading technology; serial port monitoring
隨著當今時代電力電子技術(shù)的不斷進步,超聲波電動機作為一種新概念的新型電動機于20世紀80 年代中期逐漸走進人們的視野。它集電子學、摩擦力學、波動學等眾多學科技術(shù)于一體,擁有比傳統(tǒng)的電磁式電機更小的體積,更快的響應(yīng)速度,幾乎不受電磁干擾等獨特優(yōu)勢而被廣泛應(yīng)用在航空航天和軍事、汽車領(lǐng)域[1]。也正是因為其具有獨一無二且不可替代的優(yōu)點,深入研究超聲電機的各種性能和應(yīng)用技術(shù)才顯得格外有意義。
文獻[2]提出在Matlab平臺下,應(yīng)用Matlab內(nèi)部特有的函數(shù)功能實現(xiàn)信號的接收和輸出,該方法雖然編程簡單,易于實現(xiàn),但其通用性不高,應(yīng)用范圍小,不能夠靈活;文獻[3]詳細敘述了應(yīng)用循環(huán)緩沖技術(shù)與多線程技術(shù)共同實現(xiàn)遠程采集數(shù)據(jù),該方法很難達到數(shù)據(jù)的精確度要求,不適用于微型電機的數(shù)據(jù)采集。目前,國外尤其是日本對超聲電機的研究及應(yīng)用非常廣泛,處于世界領(lǐng)先地位,我國對于超聲電機的研究比較落后,對超聲電機的應(yīng)用領(lǐng)域也非常狹隘,在超聲電機數(shù)據(jù)采集領(lǐng)域更是迄今沒有一套完整的解決方案。
為了推進超聲電機在我國的研究與發(fā)展,本文針對超聲電機的數(shù)據(jù)采集做了詳細的研究與大量的試驗,提出將MFC(Microsoft Foundation Classes)結(jié)合多線程技術(shù)應(yīng)用于超聲電機數(shù)據(jù)采集系統(tǒng),實現(xiàn)對超聲電機進行實時控制和數(shù)據(jù)采集。該方法易于實現(xiàn)且能夠處理大量數(shù)據(jù),充分利用了Visual Studio 2012豐富的數(shù)據(jù)庫和支持更多新技術(shù)架構(gòu)的特點。應(yīng)用多線程能夠避免某任務(wù)長時間占用CPU,是個很好的選擇,且MFC與多線程技術(shù)在其他領(lǐng)域的應(yīng)用已較為成熟。
數(shù)據(jù)采集在通信與信息技術(shù)領(lǐng)域的地位十分重要。當前對超聲電機的數(shù)據(jù)采集在精度和采集數(shù)據(jù)量上提出了更高標準和要求[4]。本文提出將MFC多線程串口通信技術(shù)應(yīng)用于對超聲電機的動態(tài)數(shù)據(jù)采集,從而實現(xiàn)對超聲電機的實時控制、診斷和監(jiān)測等功能,進而改進電機的性能。超聲電機數(shù)據(jù)采集模塊設(shè)計如圖1所示。
從圖中可以看到,該數(shù)據(jù)采集軟件可實時控制超聲波電動機的啟動和停止,根據(jù)用戶的需要,選擇不同的占空比和超聲電機的工作電壓,測試超聲電機在相同的占空比不同的工作電壓或者相同的工作電壓不同的占空比的條件下超聲電機的工作性能,并將得到的數(shù)據(jù)存為文件。不僅可以顯示當前采集的數(shù)據(jù)曲線,還可以選擇以往采集到的數(shù)據(jù)文件并顯示信號,大大增強了軟件的實用性而且提高了數(shù)據(jù)采集量。
2.1 ?多線程技術(shù)
程序在計算機上的一個運轉(zhuǎn)實例稱為進程,程序中的一條運行分支稱為線程,同一個程序在相同的時間運行多個任務(wù)稱為多線程[5]。而由計算機主動建立的線程稱為主線程,用戶還可以依據(jù)自身需求在程序中建立多個線程,它們可以在同一個進程中一起運作。一個進程的虛擬地址空間中存放著該進程的所有線程,這里的系統(tǒng)空間和全局變量等資源被這些線程共同分享[6]。為了實現(xiàn)就緒態(tài)線程和執(zhí)行態(tài)線程之間的快速轉(zhuǎn)換,還需要硬件對多線程的支持,比如:程序計數(shù)器PC、程序狀態(tài)寄存器SR。本文應(yīng)用多線程技術(shù)實現(xiàn)超聲電機數(shù)據(jù)采集系統(tǒng)邊接收信號邊發(fā)送命令的功能,提高了系統(tǒng)整體運行效率。
Visual Studio 2012中包含了MFC類庫,在MFC中,用AfxBeginThread()來創(chuàng)建并初始化一個線程的運行,工作者線程和用戶界面線程分別由AfxBeginThread()的兩種重載函數(shù)來建立[7]。
SuspendThread()和ResumeThread()分別用于掛起線程和恢復(fù)使用掛起的線程。當前被停止的線程不會消耗處理器的時間,并且不允許主動調(diào)用ResumeThread()來恢復(fù)自己,其他未掛起的線程可以為自己也可以為別的線程調(diào)用SuspendThread()。
線程同步:多線程提高了程序執(zhí)行效率,各線程經(jīng)常在相同的時間內(nèi)訪問它們共有的資源,這樣就會造成各線程之間競爭資源的問題[8]。Win32API所包含的臨界區(qū)域、互斥對象、信號量和事件等可控對象有效地解決了這個問題。如果某一個操作必須要等到另外一個操作執(zhí)行完之后才可以執(zhí)行,則建議使用事件對象;如果在相同的時間,同一個應(yīng)用程序中指定個數(shù)的線程需要訪問同一個資源,建議使用信號量對象;不同的應(yīng)用程序在相同的時間訪問同一個資源,建議使用互斥對象;其他的使用臨界區(qū)域[9]。
2.2 ?串口通信技術(shù)
Windows下使用下列三種串口通信方法進行編寫程序:
1) MSComm控件設(shè)計;
2) 用Windows API函數(shù)設(shè)計;
3) 采用由第三方供給的串口通信類進行編寫程序。
MSComm是一種Windows下串口通信編寫程序的ActiveX控件[10],其優(yōu)點是使用簡單方便快捷,缺點是封裝性比較大,容易對程序編寫的可操作性和可控性造成很大的影響。Windows API對程序員的操作技術(shù)和編程技術(shù)要求非常高,其長處是運行穩(wěn)定[11]。第三方串口通信類融合了前兩種方法的優(yōu)點,不僅編程效率高而且可控性強[12],因此第三方串口通信類的應(yīng)用要比前兩種廣泛。由于本程序用于實際項目工作中,對運行的穩(wěn)定性要求比較高,所以選用Windows API函數(shù)編寫。
打開Visual Studio 2012,建立一個基于會話框的MFC應(yīng)用程序并命名,其他步驟保持缺省狀態(tài)。在已有的對話框中設(shè)置菜單欄,分別有設(shè)置、開關(guān)、保存數(shù)據(jù)、清空數(shù)據(jù)和退出等菜單項,相應(yīng)的編輯工具欄、接收和發(fā)送數(shù)據(jù)模塊以及串口設(shè)置模塊,更改各個控件的ID名稱。根據(jù)MFC中的消息循環(huán)機制和規(guī)則,按照串口通信協(xié)議中的要求,就可以完成本串口通信部分的編寫。串口通信流程如圖2所示。
串口通信協(xié)議的通信方式為主、從方式,采用串行異步通信協(xié)議;數(shù)據(jù)格式含有起始位:1位;數(shù)據(jù)位:8位;停止位:1位;偶校驗位:1位;數(shù)據(jù)傳輸速率為9 600 b/s。通信過程為,當主機發(fā)出命令后,等待從機回復(fù)命令,從機務(wù)必在接收到主機命令后20 ms內(nèi)響應(yīng)主機,倘若主機發(fā)出命令后在20 ms內(nèi)沒有收到從機發(fā)出的響應(yīng)信息或收到從機響應(yīng)信息不正確,則重發(fā)該命令;從機收到主機命令后要判斷本次通信是否正確,并設(shè)置相應(yīng)的狀態(tài)位給主機應(yīng)答。
通過對超聲波電動機數(shù)據(jù)采集系統(tǒng)的分析,將實現(xiàn)程序分成如下幾個線程:
1) 主線程。負責處理用戶界面的消息,同時調(diào)度其他線程執(zhí)行數(shù)據(jù)處理。
2) 串口監(jiān)視線程。負責監(jiān)視線程并采集數(shù)據(jù)同時將數(shù)據(jù)保存。
3) 入庫線程。將采集到的數(shù)據(jù)按規(guī)則計算分析并將處理好的數(shù)據(jù)保存。
4) 顯示線程。在上位機界面顯示出讀取到的數(shù)據(jù),這些數(shù)據(jù)反映了超聲電機轉(zhuǎn)速大小,便于操作人員依據(jù)這些數(shù)據(jù)來判斷超聲電機的工作狀態(tài),從而實現(xiàn)對超聲電機的控制,實時監(jiān)控和故障診斷[13]。
下面介紹將多線程技術(shù)應(yīng)用于超聲電機數(shù)據(jù)采集系統(tǒng)上位機軟件關(guān)鍵程序。
1) 初始化串口
m_hComm = NULL;
// 初始化異步操作成員變量
m_ov.Offset = 0;
m_ov.OffsetHigh = 0;
// 創(chuàng)建異步操作的事件成員變量
m_ov.hEvent = NULL;
// 初始化發(fā)送及關(guān)閉事件
m_hWriteEvent = NULL;
m_hShutdownEvent = NULL;
//初始化發(fā)送變量
m_szWriteBuffer = NULL;
m_nWriteSize=1;
// 串口監(jiān)控線程處于非激活狀態(tài)
m_bThreadAlive = FALSE;
2) 啟動監(jiān)視串口事件的工作線程
boolCMyserial::StartMonitoring()
{
If
(?。╩_Thread = AfxBeginThread(CommThread, this)))
return FALSE;
TRACE("Thread started\n");
return TRUE;
}
UINT CMyserial::CommThread(LPVOID pParam)
{
CMyserial *port = (CMyserial*)pParam;
port?>m_bThreadAlive = TRUE;
DWORDBytesTransfered = 0;
DWORD Event = 0;
DWORD CommEvent = 0;
DWORD dwError = 0;
COMSTAT comstat;
BOOL ?bResult = TRUE;
if (port?>m_hComm) ? ? ? ? ? ? ? ? ? ? ? ? //檢查串口是否打開
PurgeComm(port?>m_hComm, PURGE_RXCLEAR | PURGE_
TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
bResult = WaitCommEvent(port?>m_hComm, &Event, &port?>
m_ov);
3) 發(fā)送和接收數(shù)據(jù)模塊
if (port <= 0 || port > 4)
return ?1;
m_RCount++; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//接收的字節(jié)計數(shù)
m_ctrlRCount.SetWindowText(strTemp);
//顯示接收計數(shù)
//如果選擇了“十六進制顯示”,則顯示十六進制值
CStringstr;
if(m_bRHex)
str.Format("%02X",ch);
else
str.Format("%c",ch);
lpsStr = (LPCTSTR)m_strData;
m_Port.WriteToPort(lpsStr); ? ? ? ? ? ? ? ? ? ? ? ? ?//發(fā)送數(shù)據(jù)
m_SCount+=m_strData.GetLength();
4) 關(guān)閉事件線程和串口
// 創(chuàng)建關(guān)閉串口事件
if (m_hShutdownEvent != NULL)
ResetEvent(m_hShutdownEvent);
else
m_hShutdownEvent=CreateEvent(NULL, TRUE, FALSE,
NULL);
SetEvent(m_hShutdownEvent); ? ? ? ? ? ? ? ? ? //關(guān)閉串口
if(m_hShutdownEvent!=NULL)
CloseHandle(m_hShutdownEvent);
if(m_ov.hEvent!=NULL)
CloseHandle(m_ov.hEvent );
if(m_hWriteEvent!=NULL)
CloseHandle(m_hWriteEvent );
TRACE("Thread ended\n");
delete [] m_szWriteBuffer; ? ? ? ? ? ? ? ? ? ? //刪除發(fā)送緩沖區(qū)
本設(shè)計在超聲電機數(shù)據(jù)采集主動控制系統(tǒng)的實驗平臺上,對超聲電機進行了數(shù)據(jù)采集試驗并測試了超聲電機在不同的電壓和占空比的條件下,轉(zhuǎn)速隨時間變化規(guī)律,結(jié)果如圖3所示。
實驗結(jié)果表明,該方法對超聲電機的數(shù)據(jù)采集與測試非常有效,且該軟件能達到實時監(jiān)控超聲電機的目的,運行穩(wěn)定,能夠?qū)崟r控制超聲電機的啟動停止,數(shù)據(jù)處理速度快,繪制曲線清晰、準確。
超聲電機作為一種新概念的微型電動機,在精密機械儀表、自動化裝備、車輛專用器件、工農(nóng)業(yè)控制系統(tǒng)、計算機、航空航天、智能機器人等領(lǐng)域有著廣闊的應(yīng)用前景。而將基于MFC的多線程技術(shù)應(yīng)用于超聲電機數(shù)據(jù)采集系統(tǒng),大大改善了系統(tǒng)各方面性能,不僅有效地解決了因串口長時間占用CPU導(dǎo)致的線程堵塞問題,而且能夠處理大量數(shù)據(jù)并且保證了數(shù)據(jù)的精確度,也使超聲電機在應(yīng)用過程中更加穩(wěn)定地發(fā)揮性能,滿足了用戶多路數(shù)據(jù)并發(fā)的需求,為超聲電機的應(yīng)用提供了全方位服務(wù)。該數(shù)據(jù)采集軟件具有實際應(yīng)用價值,可為相關(guān)專業(yè)人員進一步研究和應(yīng)用提供參考。
參考文獻
[1] 李顏鑫.超聲波發(fā)電機的發(fā)展現(xiàn)狀及應(yīng)用[J].科技展望,2016,26(28):112.
LI Yanxin. Development and application of ultrasonic generator [J]. Technology outlook, 2016, 26(28): 112.
[2] 吳侃,于明禮,李明.基于Matlab GUI的超聲電機控制系統(tǒng)串口通信研究[J].機電工程,2015,32(11):1471?1476.
WU Kan, YU Mingli, LI Ming. Study on serial communication of ultrasonic motor control system based on Matlab GUI [J]. Journal of mechanical & electrical engineering, 2015, 32(11): 1471?1476.
[3] 艾紅,鄧大偉,鄺野.遠程數(shù)據(jù)采集與監(jiān)測系統(tǒng)研究[J].自動化儀表,2012,33(8):31?33.
AI Hong, DENG Dawei, KUANG Ye. Research on remote data acquisition and monitoring system [J]. Process automation instrumentation, 2012, 33(8): 31?33.
[4] 熊飛.高速數(shù)據(jù)采集系統(tǒng)實現(xiàn)及其應(yīng)用[D].南京:南京理工大學,2017.
XIONG Fei. Implementation and application of high?speed data acquisition system [D]. Nanjing: Nanjing University of Science and Technology, 2017.
[5] CHANG X C, ZHANG C H, SUN L. A data collecting and caching mechanism for gateway middleware in the web of things [J]. Advanced materials research, 2013, 756: 2157?2162.
[6] 張超.多線程串口通信技術(shù)在GPS導(dǎo)航中的應(yīng)用[J].電子制作,2016(17):38?39.
ZHANG Chao. Application of multithreaded serial communication technology in GPS navigation [J]. Practical electronics, 2016(17): 38?39.
[7] 龔寄,何雅槐.永磁同步電機控制器串口通信上位機軟件設(shè)計[J].自動化應(yīng)用,2016(8):21?23.
GONG Ji, HE Yahuai. Design of serial communication upper computer software for permanent magnet synchronous motor controller [J]. Automation application, 2016(8): 21?23.
[8] KIM J W, PARK C H, JEONG S S, et al. Driving characteristics of a simple square?frame ultrasonic motor [J]. Applied mechanics and materials, 2011, 110: 210?216.
[9] 歐如月.MFC多線程技術(shù)在串口通信中的應(yīng)用[J].信息與電腦(理論版),2017(15):171?172.
OU Ruyue. Application of multi?thread technology in serial communication [J]. China computer & communication (theoretical edition), 2017(15): 171?172.
[10] 趙淳生,朱華.超聲電機技術(shù)的發(fā)展和應(yīng)用[J].機械制造與自動化,2008,37(3):1?9.
ZHAO Chunsheng, ZHU Hua. Development and application of ultrasonic motors technologies [J]. Machine building & automation, 2008, 37(3): 1?9.
[11] 范筱朔.多線程技術(shù)在數(shù)據(jù)通信中的應(yīng)用探究[J].電腦迷,2017(11):81.
FAN Xiaoshuo. Application of multithreading technology in data communication [J]. PC fan, 2017(11): 81.
[12] 陳讓琛.多線程串口通信技術(shù)在北斗導(dǎo)航中的運用分析[J].無線互聯(lián)科技,2017(15):8?9.
CHEN Rangchen. Analysis on the use of multi?threaded serial communication technology in Beidou navigation [J]. Wireless Internet technology, 2017(15): 8?9.
[13] 劉浩,李榮冰,劉建業(yè),等.基于串口通信的DSP在線燒寫技術(shù)研究[J].電子測量技術(shù),2017,40(7):184?187.
LIU Hao, LI Rongbing, LIU Jianye, et al. Research on online programming techniques for DSP based on serial communication [J]. Electronic measurement technology, 2017, 40(7): 184?187.