新聞中心

EEPW首頁(yè) > 設(shè)計(jì)應(yīng)用 > 機(jī)泵群智能巡檢系統(tǒng)之?dāng)?shù)據(jù)處理模塊的開(kāi)發(fā)研究

機(jī)泵群智能巡檢系統(tǒng)之?dāng)?shù)據(jù)處理模塊的開(kāi)發(fā)研究

——
作者:作者:徐春林 馬波 時(shí)間:2007-01-26 來(lái)源:《今日電子》 收藏

引言

在機(jī)泵群智能監(jiān)測(cè)預(yù)知維修系統(tǒng)平臺(tái)的開(kāi)發(fā)中,需要對(duì)旋轉(zhuǎn)機(jī)械設(shè)備的運(yùn)行狀態(tài)進(jìn)行診斷。目前國(guó)內(nèi)外普遍采用的行之有效的方法是共振解調(diào)法,又稱高頻共振法或包絡(luò)分析法。這就需要將采集的振動(dòng)信號(hào)通過(guò)希爾伯特變換進(jìn)行包絡(luò)。其基本原理為,對(duì)采集的振動(dòng)信號(hào)進(jìn)行解調(diào)處理,獲得富含故障信息的解調(diào)波,通過(guò)對(duì)此解調(diào)波的振幅和頻譜的分析,從而確定故障發(fā)生的部位。
整個(gè)的系統(tǒng)開(kāi)發(fā)是在Visual C++平臺(tái)上實(shí)現(xiàn)的,然而Visual C++在數(shù)據(jù)處理上遠(yuǎn)不如MATLAB方便、快捷,所以在編寫VC++應(yīng)用程序時(shí),為了利用MATLAB的強(qiáng)大的數(shù)值計(jì)算和處理功能來(lái)完成信號(hào)處理,采用了MATLAB的C++數(shù)學(xué)庫(kù)來(lái)進(jìn)行計(jì)算。

VC++中調(diào)用MATLAB函數(shù)

MATLAB中的大多數(shù)函數(shù)都是基于MATLAB的數(shù)學(xué)庫(kù)函數(shù),若數(shù)學(xué)庫(kù)中沒(méi)有需要的函數(shù),則通過(guò)編寫.m文件,并調(diào)用數(shù)學(xué)庫(kù)中相應(yīng)的函數(shù)來(lái)實(shí)現(xiàn)。Matlab的數(shù)學(xué)庫(kù)可以把大部分.m文件寫成應(yīng)用程序編譯成可執(zhí)行的exe程序,脫離MATLAB環(huán)境,也可以通過(guò)mcc編譯為C/C++文件。

在使用MATLAB函數(shù)過(guò)程中,存在兩種情況,一是數(shù)學(xué)庫(kù)中有的函數(shù),二是數(shù)學(xué)庫(kù)中沒(méi)有的函數(shù)。下面對(duì)這兩種情況進(jìn)行分別介紹。

● 調(diào)用數(shù)學(xué)庫(kù)中的函數(shù)

在VC++中調(diào)用數(shù)學(xué)庫(kù)中的函數(shù)可以進(jìn)行直接的調(diào)用。但是由于MATLAB和C++之間的調(diào)用方式不盡相同。在MATLAB中的變量都是數(shù)組形式,因而VC++中調(diào)用都是通過(guò)MATLAB中的mwArray類型變量來(lái)進(jìn)行賦值和傳遞變量的。一般使用的轉(zhuǎn)換函數(shù)有hozcat、row2cat、ExtractScalar和ExtractData等。

在調(diào)用MATLAB數(shù)學(xué)庫(kù)函數(shù)的VC++文件中加入頭文件“matlab.hpp”,就可以直接使用MATLAB數(shù)學(xué)庫(kù)函數(shù),其方式與使用VC++中的函數(shù)相同,只是傳遞的參數(shù)類型不同。還需要對(duì)VC++環(huán)境和工程進(jìn)行設(shè)置。

● 調(diào)用數(shù)學(xué)庫(kù)沒(méi)有的函數(shù)

MATLAB數(shù)學(xué)庫(kù)中沒(méi)有的函數(shù)基本上都是.m文件。調(diào)用這些函數(shù)時(shí),要使用mcc-t-L Cpp name把.m文件編譯為相應(yīng)的.hpp和.cpp文件。把生成的相應(yīng).hpp和.cpp文件加入到VC++工程中,在工程中使用這個(gè)函數(shù)的文件中加入相應(yīng)的頭文件(.hpp文件)。

在MATLAB中大部分.m文件不是獨(dú)立的,有許多一個(gè).m文件中嵌套調(diào)用別的.m文件。在這種情況下,需要把在這個(gè).m文件中嵌套調(diào)用的其他.m文件代碼復(fù)制到這個(gè).m文件??傊?,在這個(gè).m文件沒(méi)有嵌套調(diào)用別的.m文件,僅僅只有數(shù)學(xué)庫(kù)中函數(shù)和一些基本算法,是個(gè)獨(dú)立的.m文件。有一點(diǎn)需要注意的是,將所需要的函數(shù)的在這個(gè).m文件中的部分代碼,一定要放到最前面,即在這個(gè).m文件中可能包括多個(gè)子程序。

如果不知道這個(gè).m文件中是否調(diào)用了別的.m文件,通過(guò)mcc編譯即可被發(fā)現(xiàn)。沒(méi)有調(diào)用其他.m文件的文件,編譯后只生成以這個(gè)文件命名的.hpp和.cpp文件,而如果調(diào)用了其他.m文件,則生成三個(gè)文件,分別是以這個(gè)文件命名的.hpp、.cpp文件和嵌套調(diào)用的那個(gè).m文件命名的.hpp文件。

本文引用地址:http://butianyuan.cn/article/20943.htm

如何脫離MATLAB環(huán)境運(yùn)行

上面介紹了VC++中調(diào)用MATLAB函數(shù)的方法,此時(shí)應(yīng)用程序需要和MATLAB環(huán)境同時(shí)運(yùn)行,并且通過(guò)MATLAB的執(zhí)行程序路徑,調(diào)用了MATLAB的動(dòng)態(tài)連接庫(kù),實(shí)際上并沒(méi)有完全脫離MATLAB,這是由于mcc功能上的限制。

如何真正脫離MATLAB呢?MATLAB提供了一個(gè)發(fā)行程序包,位于externlibwin32 mglinstaller.exe,執(zhí)行它后將在指定目錄下解壓縮出bin和toolbox兩個(gè)子目錄,其中在binwin32目錄下就是數(shù)學(xué)庫(kù)和圖形庫(kù)脫離MATLAB運(yùn)行所需的所有動(dòng)態(tài)連接庫(kù),共有37個(gè)。重新啟動(dòng)之后,應(yīng)用程序就可以在沒(méi)有安裝MATLAB的環(huán)境下運(yùn)行了。

應(yīng)用例程

在機(jī)泵群智能監(jiān)測(cè)預(yù)知維修系統(tǒng)平臺(tái)的開(kāi)發(fā)中,利用共振解調(diào)技術(shù)對(duì)設(shè)備振動(dòng)的低頻沖擊所激起的高頻共振波進(jìn)行包絡(luò)檢波和低通濾波,即解調(diào),獲得一個(gè)對(duì)應(yīng)于低頻沖擊的,而又放大并展寬了的共振解調(diào)波;通過(guò)此共振解調(diào)波的幅值和頻譜分析,就可以在故障特征頻率及其倍頻處看到清晰的譜峰,而不含故障沖擊的信號(hào)缺不會(huì)在共振解調(diào)波的頻譜圖中出現(xiàn)譜峰,因此很容易確定故障發(fā)生的部位。

由上所述,在系統(tǒng)開(kāi)發(fā)的數(shù)據(jù)處理中,需要對(duì)采集的振動(dòng)信號(hào)進(jìn)行包絡(luò)分析,這一數(shù)據(jù)分析過(guò)程是通過(guò)調(diào)用MATLAB中的希爾伯特變換函數(shù)來(lái)實(shí)現(xiàn)。
建立的工程文件名為Test。

(1)在MATLAB的安裝目錄下找到hilbert.m文件和shiftdim.m文件(hilbert.m文件中嵌套調(diào)用了shiftdim),然后在shiftm.m文件中的代碼復(fù)制到hilbert.m文件中,并另存為hilbert1.m文件。

(2)在MATLAB的Command Window下使用命令mcc -t -L Cpp hilbert1,生成hilbert1.hpp和hilbert1.cpp兩個(gè)文件,編譯完后生成的函數(shù)名就是hilbert1(即文件名)。

(3)在VC++中建立工程test,并按照2.1中進(jìn)行相關(guān)設(shè)置,使用hibert1函數(shù)
#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數(shù)組變量
m1=100*sin(50*t1);
m1.ExtractData(dd);
m3=hilbert1(m1,1024);//進(jìn)行希爾伯特變換
m2=abs(m3); //MATLAB數(shù)學(xué)庫(kù)函數(shù),進(jìn)行求模運(yùn)算
m2.ExtractData(d2); //把mwArray的數(shù)據(jù)轉(zhuǎn)換為double數(shù)組中
delete dd;
delete d2;
}

運(yùn)行結(jié)果如圖1所示,軸承振動(dòng)信號(hào)的包絡(luò)幅值譜圖。測(cè)點(diǎn)的轉(zhuǎn)速頻率為15Hz,當(dāng)軸承內(nèi)圈有故障時(shí),該軸承的采樣信號(hào)的時(shí)域波形經(jīng)包絡(luò)分析后,對(duì)其進(jìn)行相應(yīng)的頻譜分析,得出軸承的內(nèi)圈故障特征頻率。其中,對(duì)時(shí)域波形的包絡(luò)分析,就是通過(guò)上述的調(diào)用過(guò)程實(shí)現(xiàn)的。

從圖1可以看出最大幅值處的頻率為88.87Hz,而理論上,用特征頻率計(jì)算公式求得的故障特征頻率為88.6Hz。因此,可以說(shuō)明此方法是可行的。

結(jié)論

利用VC++來(lái)完成智能巡檢系統(tǒng)的界面設(shè)計(jì)、數(shù)據(jù)管理、底層I/O等功能,而利用MATLAB來(lái)完成數(shù)據(jù)處理分析核心算法的設(shè)計(jì),兩者的有機(jī)結(jié)合降低了程序的開(kāi)發(fā)難度和周期,提高了開(kāi)發(fā)效率。該方法對(duì)其他領(lǐng)域如系統(tǒng)仿真、圖像處理等專業(yè)領(lǐng)域也有很強(qiáng)的指導(dǎo)意義和推廣價(jià)值。

c++相關(guān)文章:c++教程




關(guān)鍵詞: 模塊

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉