王曉丹 姚舜才 杜飛
關(guān)鍵詞: 超聲電機(jī); 數(shù)據(jù)采集; 上位機(jī)軟件; MFC; 多線程技術(shù); 串口監(jiān)控
中圖分類號: TN919?34 ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識碼: 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
隨著當(dāng)今時(shí)代電力電子技術(shù)的不斷進(jìn)步,超聲波電動(dòng)機(jī)作為一種新概念的新型電動(dòng)機(jī)于20世紀(jì)80 年代中期逐漸走進(jìn)人們的視野。它集電子學(xué)、摩擦力學(xué)、波動(dòng)學(xué)等眾多學(xué)科技術(shù)于一體,擁有比傳統(tǒng)的電磁式電機(jī)更小的體積,更快的響應(yīng)速度,幾乎不受電磁干擾等獨(dú)特優(yōu)勢而被廣泛應(yīng)用在航空航天和軍事、汽車領(lǐng)域[1]。也正是因?yàn)槠渚哂歇?dú)一無二且不可替代的優(yōu)點(diǎn),深入研究超聲電機(jī)的各種性能和應(yīng)用技術(shù)才顯得格外有意義。
文獻(xiàn)[2]提出在Matlab平臺下,應(yīng)用Matlab內(nèi)部特有的函數(shù)功能實(shí)現(xiàn)信號的接收和輸出,該方法雖然編程簡單,易于實(shí)現(xiàn),但其通用性不高,應(yīng)用范圍小,不能夠靈活;文獻(xiàn)[3]詳細(xì)敘述了應(yīng)用循環(huán)緩沖技術(shù)與多線程技術(shù)共同實(shí)現(xiàn)遠(yuǎn)程采集數(shù)據(jù),該方法很難達(dá)到數(shù)據(jù)的精確度要求,不適用于微型電機(jī)的數(shù)據(jù)采集。目前,國外尤其是日本對超聲電機(jī)的研究及應(yīng)用非常廣泛,處于世界領(lǐng)先地位,我國對于超聲電機(jī)的研究比較落后,對超聲電機(jī)的應(yīng)用領(lǐng)域也非常狹隘,在超聲電機(jī)數(shù)據(jù)采集領(lǐng)域更是迄今沒有一套完整的解決方案。
為了推進(jìn)超聲電機(jī)在我國的研究與發(fā)展,本文針對超聲電機(jī)的數(shù)據(jù)采集做了詳細(xì)的研究與大量的試驗(yàn),提出將MFC(Microsoft Foundation Classes)結(jié)合多線程技術(shù)應(yīng)用于超聲電機(jī)數(shù)據(jù)采集系統(tǒng),實(shí)現(xiàn)對超聲電機(jī)進(jìn)行實(shí)時(shí)控制和數(shù)據(jù)采集。該方法易于實(shí)現(xiàn)且能夠處理大量數(shù)據(jù),充分利用了Visual Studio 2012豐富的數(shù)據(jù)庫和支持更多新技術(shù)架構(gòu)的特點(diǎn)。應(yīng)用多線程能夠避免某任務(wù)長時(shí)間占用CPU,是個(gè)很好的選擇,且MFC與多線程技術(shù)在其他領(lǐng)域的應(yīng)用已較為成熟。
數(shù)據(jù)采集在通信與信息技術(shù)領(lǐng)域的地位十分重要。當(dāng)前對超聲電機(jī)的數(shù)據(jù)采集在精度和采集數(shù)據(jù)量上提出了更高標(biāo)準(zhǔn)和要求[4]。本文提出將MFC多線程串口通信技術(shù)應(yīng)用于對超聲電機(jī)的動(dòng)態(tài)數(shù)據(jù)采集,從而實(shí)現(xiàn)對超聲電機(jī)的實(shí)時(shí)控制、診斷和監(jiān)測等功能,進(jìn)而改進(jìn)電機(jī)的性能。超聲電機(jī)數(shù)據(jù)采集模塊設(shè)計(jì)如圖1所示。
從圖中可以看到,該數(shù)據(jù)采集軟件可實(shí)時(shí)控制超聲波電動(dòng)機(jī)的啟動(dòng)和停止,根據(jù)用戶的需要,選擇不同的占空比和超聲電機(jī)的工作電壓,測試超聲電機(jī)在相同的占空比不同的工作電壓或者相同的工作電壓不同的占空比的條件下超聲電機(jī)的工作性能,并將得到的數(shù)據(jù)存為文件。不僅可以顯示當(dāng)前采集的數(shù)據(jù)曲線,還可以選擇以往采集到的數(shù)據(jù)文件并顯示信號,大大增強(qiáng)了軟件的實(shí)用性而且提高了數(shù)據(jù)采集量。
2.1 ?多線程技術(shù)
程序在計(jì)算機(jī)上的一個(gè)運(yùn)轉(zhuǎn)實(shí)例稱為進(jìn)程,程序中的一條運(yùn)行分支稱為線程,同一個(gè)程序在相同的時(shí)間運(yùn)行多個(gè)任務(wù)稱為多線程[5]。而由計(jì)算機(jī)主動(dòng)建立的線程稱為主線程,用戶還可以依據(jù)自身需求在程序中建立多個(gè)線程,它們可以在同一個(gè)進(jìn)程中一起運(yùn)作。一個(gè)進(jìn)程的虛擬地址空間中存放著該進(jìn)程的所有線程,這里的系統(tǒng)空間和全局變量等資源被這些線程共同分享[6]。為了實(shí)現(xiàn)就緒態(tài)線程和執(zhí)行態(tài)線程之間的快速轉(zhuǎn)換,還需要硬件對多線程的支持,比如:程序計(jì)數(shù)器PC、程序狀態(tài)寄存器SR。本文應(yīng)用多線程技術(shù)實(shí)現(xiàn)超聲電機(jī)數(shù)據(jù)采集系統(tǒng)邊接收信號邊發(fā)送命令的功能,提高了系統(tǒng)整體運(yùn)行效率。
Visual Studio 2012中包含了MFC類庫,在MFC中,用AfxBeginThread()來創(chuàng)建并初始化一個(gè)線程的運(yùn)行,工作者線程和用戶界面線程分別由AfxBeginThread()的兩種重載函數(shù)來建立[7]。
SuspendThread()和ResumeThread()分別用于掛起線程和恢復(fù)使用掛起的線程。當(dāng)前被停止的線程不會(huì)消耗處理器的時(shí)間,并且不允許主動(dòng)調(diào)用ResumeThread()來恢復(fù)自己,其他未掛起的線程可以為自己也可以為別的線程調(diào)用SuspendThread()。
線程同步:多線程提高了程序執(zhí)行效率,各線程經(jīng)常在相同的時(shí)間內(nèi)訪問它們共有的資源,這樣就會(huì)造成各線程之間競爭資源的問題[8]。Win32API所包含的臨界區(qū)域、互斥對象、信號量和事件等可控對象有效地解決了這個(gè)問題。如果某一個(gè)操作必須要等到另外一個(gè)操作執(zhí)行完之后才可以執(zhí)行,則建議使用事件對象;如果在相同的時(shí)間,同一個(gè)應(yīng)用程序中指定個(gè)數(shù)的線程需要訪問同一個(gè)資源,建議使用信號量對象;不同的應(yīng)用程序在相同的時(shí)間訪問同一個(gè)資源,建議使用互斥對象;其他的使用臨界區(qū)域[9]。
2.2 ?串口通信技術(shù)
Windows下使用下列三種串口通信方法進(jìn)行編寫程序:
1) MSComm控件設(shè)計(jì);
2) 用Windows API函數(shù)設(shè)計(jì);
3) 采用由第三方供給的串口通信類進(jìn)行編寫程序。
MSComm是一種Windows下串口通信編寫程序的ActiveX控件[10],其優(yōu)點(diǎn)是使用簡單方便快捷,缺點(diǎn)是封裝性比較大,容易對程序編寫的可操作性和可控性造成很大的影響。Windows API對程序員的操作技術(shù)和編程技術(shù)要求非常高,其長處是運(yùn)行穩(wěn)定[11]。第三方串口通信類融合了前兩種方法的優(yōu)點(diǎn),不僅編程效率高而且可控性強(qiáng)[12],因此第三方串口通信類的應(yīng)用要比前兩種廣泛。由于本程序用于實(shí)際項(xiàng)目工作中,對運(yùn)行的穩(wěn)定性要求比較高,所以選用Windows API函數(shù)編寫。
打開Visual Studio 2012,建立一個(gè)基于會(huì)話框的MFC應(yīng)用程序并命名,其他步驟保持缺省狀態(tài)。在已有的對話框中設(shè)置菜單欄,分別有設(shè)置、開關(guān)、保存數(shù)據(jù)、清空數(shù)據(jù)和退出等菜單項(xiàng),相應(yīng)的編輯工具欄、接收和發(fā)送數(shù)據(jù)模塊以及串口設(shè)置模塊,更改各個(gè)控件的ID名稱。根據(jù)MFC中的消息循環(huán)機(jī)制和規(guī)則,按照串口通信協(xié)議中的要求,就可以完成本串口通信部分的編寫。串口通信流程如圖2所示。
串口通信協(xié)議的通信方式為主、從方式,采用串行異步通信協(xié)議;數(shù)據(jù)格式含有起始位:1位;數(shù)據(jù)位:8位;停止位:1位;偶校驗(yàn)位:1位;數(shù)據(jù)傳輸速率為9 600 b/s。通信過程為,當(dāng)主機(jī)發(fā)出命令后,等待從機(jī)回復(fù)命令,從機(jī)務(wù)必在接收到主機(jī)命令后20 ms內(nèi)響應(yīng)主機(jī),倘若主機(jī)發(fā)出命令后在20 ms內(nèi)沒有收到從機(jī)發(fā)出的響應(yīng)信息或收到從機(jī)響應(yīng)信息不正確,則重發(fā)該命令;從機(jī)收到主機(jī)命令后要判斷本次通信是否正確,并設(shè)置相應(yīng)的狀態(tài)位給主機(jī)應(yīng)答。
通過對超聲波電動(dòng)機(jī)數(shù)據(jù)采集系統(tǒng)的分析,將實(shí)現(xiàn)程序分成如下幾個(gè)線程:
1) 主線程。負(fù)責(zé)處理用戶界面的消息,同時(shí)調(diào)度其他線程執(zhí)行數(shù)據(jù)處理。
2) 串口監(jiān)視線程。負(fù)責(zé)監(jiān)視線程并采集數(shù)據(jù)同時(shí)將數(shù)據(jù)保存。
3) 入庫線程。將采集到的數(shù)據(jù)按規(guī)則計(jì)算分析并將處理好的數(shù)據(jù)保存。
4) 顯示線程。在上位機(jī)界面顯示出讀取到的數(shù)據(jù),這些數(shù)據(jù)反映了超聲電機(jī)轉(zhuǎn)速大小,便于操作人員依據(jù)這些數(shù)據(jù)來判斷超聲電機(jī)的工作狀態(tài),從而實(shí)現(xiàn)對超聲電機(jī)的控制,實(shí)時(shí)監(jiān)控和故障診斷[13]。
下面介紹將多線程技術(shù)應(yīng)用于超聲電機(jī)數(shù)據(jù)采集系統(tǒng)上位機(jī)軟件關(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) 啟動(dòng)監(jiān)視串口事件的工作線程
boolCMyserial::StartMonitoring()
{
If
(!(m_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é)計(jì)數(shù)
m_ctrlRCount.SetWindowText(strTemp);
//顯示接收計(jì)數(shù)
//如果選擇了“十六進(jìn)制顯示”,則顯示十六進(jìn)制值
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è)計(jì)在超聲電機(jī)數(shù)據(jù)采集主動(dòng)控制系統(tǒng)的實(shí)驗(yàn)平臺上,對超聲電機(jī)進(jìn)行了數(shù)據(jù)采集試驗(yàn)并測試了超聲電機(jī)在不同的電壓和占空比的條件下,轉(zhuǎn)速隨時(shí)間變化規(guī)律,結(jié)果如圖3所示。
實(shí)驗(yàn)結(jié)果表明,該方法對超聲電機(jī)的數(shù)據(jù)采集與測試非常有效,且該軟件能達(dá)到實(shí)時(shí)監(jiān)控超聲電機(jī)的目的,運(yùn)行穩(wěn)定,能夠?qū)崟r(shí)控制超聲電機(jī)的啟動(dòng)停止,數(shù)據(jù)處理速度快,繪制曲線清晰、準(zhǔn)確。
超聲電機(jī)作為一種新概念的微型電動(dòng)機(jī),在精密機(jī)械儀表、自動(dòng)化裝備、車輛專用器件、工農(nóng)業(yè)控制系統(tǒng)、計(jì)算機(jī)、航空航天、智能機(jī)器人等領(lǐng)域有著廣闊的應(yīng)用前景。而將基于MFC的多線程技術(shù)應(yīng)用于超聲電機(jī)數(shù)據(jù)采集系統(tǒng),大大改善了系統(tǒng)各方面性能,不僅有效地解決了因串口長時(shí)間占用CPU導(dǎo)致的線程堵塞問題,而且能夠處理大量數(shù)據(jù)并且保證了數(shù)據(jù)的精確度,也使超聲電機(jī)在應(yīng)用過程中更加穩(wěn)定地發(fā)揮性能,滿足了用戶多路數(shù)據(jù)并發(fā)的需求,為超聲電機(jī)的應(yīng)用提供了全方位服務(wù)。該數(shù)據(jù)采集軟件具有實(shí)際應(yīng)用價(jià)值,可為相關(guān)專業(yè)人員進(jìn)一步研究和應(yīng)用提供參考。
參考文獻(xiàn)
[1] 李顏鑫.超聲波發(fā)電機(jī)的發(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的超聲電機(jī)控制系統(tǒng)串口通信研究[J].機(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] 艾紅,鄧大偉,鄺野.遠(yuǎn)程數(shù)據(jù)采集與監(jiān)測系統(tǒng)研究[J].自動(dòng)化儀表,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)實(shí)現(xiàn)及其應(yīng)用[D].南京:南京理工大學(xué),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] 龔寄,何雅槐.永磁同步電機(jī)控制器串口通信上位機(jī)軟件設(shè)計(jì)[J].自動(dòng)化應(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] 趙淳生,朱華.超聲電機(jī)技術(shù)的發(fā)展和應(yīng)用[J].機(jī)械制造與自動(dòng)化,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)航中的運(yùn)用分析[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.