機泵群智能巡檢系統之數據處理模塊的開(kāi)發(fā)研究
引言
在機泵群智能監測預知維修系統平臺的開(kāi)發(fā)中,需要對旋轉機械設備的運行狀態(tài)進(jìn)行診斷。目前國內外普遍采用的行之有效的方法是共振解調法,又稱(chēng)高頻共振法或包絡(luò )分析法。這就需要將采集的振動(dòng)信號通過(guò)希爾伯特變換進(jìn)行包絡(luò )。其基本原理為,對采集的振動(dòng)信號進(jìn)行解調處理,獲得富含故障信息的解調波,通過(guò)對此解調波的振幅和頻譜的分析,從而確定故障發(fā)生的部位。
整個(gè)的系統開(kāi)發(fā)是在Visual C++平臺上實(shí)現的,然而Visual C++在數據處理上遠不如MATLAB方便、快捷,所以在編寫(xiě)VC++應用程序時(shí),為了利用MATLAB的強大的數值計算和處理功能來(lái)完成信號處理,采用了MATLAB的C++數學(xué)庫來(lái)進(jìn)行計算。
VC++中調用MATLAB函數
MATLAB中的大多數函數都是基于MATLAB的數學(xué)庫函數,若數學(xué)庫中沒(méi)有需要的函數,則通過(guò)編寫(xiě).m文件,并調用數學(xué)庫中相應的函數來(lái)實(shí)現。Matlab的數學(xué)庫可以把大部分.m文件寫(xiě)成應用程序編譯成可執行的exe程序,脫離MATLAB環(huán)境,也可以通過(guò)mcc編譯為C/C++文件。
在使用MATLAB函數過(guò)程中,存在兩種情況,一是數學(xué)庫中有的函數,二是數學(xué)庫中沒(méi)有的函數。下面對這兩種情況進(jìn)行分別介紹。
● 調用數學(xué)庫中的函數
在VC++中調用數學(xué)庫中的函數可以進(jìn)行直接的調用。但是由于MATLAB和C++之間的調用方式不盡相同。在MATLAB中的變量都是數組形式,因而VC++中調用都是通過(guò)MATLAB中的mwArray類(lèi)型變量來(lái)進(jìn)行賦值和傳遞變量的。一般使用的轉換函數有hozcat、row2cat、ExtractScalar和ExtractData等。
在調用MATLAB數學(xué)庫函數的VC++文件中加入頭文件“matlab.hpp”,就可以直接使用MATLAB數學(xué)庫函數,其方式與使用VC++中的函數相同,只是傳遞的參數類(lèi)型不同。還需要對VC++環(huán)境和工程進(jìn)行設置。
● 調用數學(xué)庫沒(méi)有的函數
MATLAB數學(xué)庫中沒(méi)有的函數基本上都是.m文件。調用這些函數時(shí),要使用mcc-t-L Cpp name把.m文件編譯為相應的.hpp和.cpp文件。把生成的相應.hpp和.cpp文件加入到VC++工程中,在工程中使用這個(gè)函數的文件中加入相應的頭文件(.hpp文件)。
在MATLAB中大部分.m文件不是獨立的,有許多一個(gè).m文件中嵌套調用別的.m文件。在這種情況下,需要把在這個(gè).m文件中嵌套調用的其他.m文件代碼復制到這個(gè).m文件??傊?,在這個(gè).m文件沒(méi)有嵌套調用別的.m文件,僅僅只有數學(xué)庫中函數和一些基本算法,是個(gè)獨立的.m文件。有一點(diǎn)需要注意的是,將所需要的函數的在這個(gè).m文件中的部分代碼,一定要放到最前面,即在這個(gè).m文件中可能包括多個(gè)子程序。
如果不知道這個(gè).m文件中是否調用了別的.m文件,通過(guò)mcc編譯即可被發(fā)現。沒(méi)有調用其他.m文件的文件,編譯后只生成以這個(gè)文件命名的.hpp和.cpp文件,而如果調用了其他.m文件,則生成三個(gè)文件,分別是以這個(gè)文件命名的.hpp、.cpp文件和嵌套調用的那個(gè).m文件命名的.hpp文件。
如何脫離MATLAB環(huán)境運行
上面介紹了VC++中調用MATLAB函數的方法,此時(shí)應用程序需要和MATLAB環(huán)境同時(shí)運行,并且通過(guò)MATLAB的執行程序路徑,調用了MATLAB的動(dòng)態(tài)連接庫,實(shí)際上并沒(méi)有完全脫離MATLAB,這是由于mcc功能上的限制。
如何真正脫離MATLAB呢?MATLAB提供了一個(gè)發(fā)行程序包,位于
應用例程
在機泵群智能監測預知維修系統平臺的開(kāi)發(fā)中,利用共振解調技術(shù)對設備振動(dòng)的低頻沖擊所激起的高頻共振波進(jìn)行包絡(luò )檢波和低通濾波,即解調,獲得一個(gè)對應于低頻沖擊的,而又放大并展寬了的共振解調波;通過(guò)此共振解調波的幅值和頻譜分析,就可以在故障特征頻率及其倍頻處看到清晰的譜峰,而不含故障沖擊的信號缺不會(huì )在共振解調波的頻譜圖中出現譜峰,因此很容易確定故障發(fā)生的部位。
由上所述,在系統開(kāi)發(fā)的數據處理模塊中,需要對采集的振動(dòng)信號進(jìn)行包絡(luò )分析,這一數據分析過(guò)程是通過(guò)調用MATLAB中的希爾伯特變換函數來(lái)實(shí)現。
建立的工程文件名為T(mén)est。
(1)在MATLAB的安裝目錄下找到hilbert.m文件和shiftdim.m文件(hilbert.m文件中嵌套調用了shiftdim),然后在shiftm.m文件中的代碼復制到hilbert.m文件中,并另存為hilbert1.m文件。
(2)在MATLAB的Command Window下使用命令mcc -t -L Cpp hilbert1,生成hilbert1.hpp和hilbert1.cpp兩個(gè)文件,編譯完后生成的函數名就是hilbert1(即文件名)。
(3)在VC++中建立工程test,并按照2.1中進(jìn)行相關(guān)設置,使用hibert1函數
#include "stdafx.h"
#include "matlab.hpp"
#include "hilbert1.hpp"
void mccDemo()
{mwArray m3,m1,m2,t1;
double *dd=new double[1024];
double *d2=new double[1024];
for(int i=1;i<=1024;i++)
t[i]=i/1000.0;
t1=row2mat(1,1024,t);//把生成的時(shí)間序列賦給mwArray數組變量
m1=100*sin(50*t1);
m1.ExtractData(dd);
m3=hilbert1(m1,1024);//進(jìn)行希爾伯特變換
m2=abs(m3); //MATLAB數學(xué)庫函數,進(jìn)行求模運算
m2.ExtractData(d2); //把mwArray的數據轉換為double數組中
delete dd;
delete d2;
}
運行結果如圖1所示,軸承振動(dòng)信號的包絡(luò )幅值譜圖。測點(diǎn)的轉速頻率為15Hz,當軸承內圈有故障時(shí),該軸承的采樣信號的時(shí)域波形經(jīng)包絡(luò )分析后,對其進(jìn)行相應的頻譜分析,得出軸承的內圈故障特征頻率。其中,對時(shí)域波形的包絡(luò )分析,就是通過(guò)上述的調用過(guò)程實(shí)現的。
從圖1可以看出最大幅值處的頻率為88.87Hz,而理論上,用特征頻率計算公式求得的故障特征頻率為88.6Hz。因此,可以說(shuō)明此方法是可行的。
結論
利用VC++來(lái)完成智能巡檢系統的界面設計、數據管理、底層I/O等功能,而利用MATLAB來(lái)完成數據處理分析核心算法的設計,兩者的有機結合降低了程序的開(kāi)發(fā)難度和周期,提高了開(kāi)發(fā)效率。該方法對其他領(lǐng)域如系統仿真、圖像處理等專(zhuān)業(yè)領(lǐng)域也有很強的指導意義和推廣價(jià)值。
c++相關(guān)文章:c++教程
評論