王士新 張慧芬 徐 斌 孔 平 付 珂
(1.濟南大學(xué)自動化與電氣工程學(xué)院;2.國網(wǎng)山東省電力公司濟寧供電公司)
Matlab與C#混合編程在配電網(wǎng)斷線監(jiān)測軟件的應(yīng)用①
王士新1張慧芬1徐 斌2孔 平2付 珂2
(1.濟南大學(xué)自動化與電氣工程學(xué)院;2.國網(wǎng)山東省電力公司濟寧供電公司)
在開發(fā)配電網(wǎng)斷線監(jiān)測軟件的過程中,提出基于Matlab與C#混合編程的軟件開發(fā)方法,該方法將Matlab語言編寫的數(shù)據(jù)處理算法源程序編譯為.NET程序集以實現(xiàn)兩者混編的目的,發(fā)揮兩者在軟件開發(fā)上獨特的優(yōu)勢,不僅降低了數(shù)據(jù)處理算法的開發(fā)難度,也大幅提升了軟件品質(zhì)。該軟件主要提供COMTRADE協(xié)議錄波文件解析和管理、監(jiān)測信息管理、電壓/電流分析、處理結(jié)果可視化展示及處理結(jié)果導(dǎo)出等功能。
混合編程 配電網(wǎng) 斷線監(jiān)測 數(shù)據(jù)處理算法 故障錄波器
配電網(wǎng)斷線故障是配電網(wǎng)中不可忽視的故障類型,目前在對配電線路故障檢測的研究中,主要側(cè)重于發(fā)生各類短路故障后的檢測與定位,而對于配電網(wǎng)斷線故障的研究較少,在目前運行的配電網(wǎng)中還沒有專門針對斷線故障的保護裝置[1,2]。為解決這一現(xiàn)狀,筆者結(jié)合當(dāng)前普遍應(yīng)用的故障錄波器開發(fā)上位機應(yīng)用軟件,通過對COMTRADE協(xié)議錄波文件的解析得到錄波數(shù)據(jù),利用對負(fù)序電流的希爾伯特黃變換(HHT)分析結(jié)果最終實現(xiàn)故障選線功能[3]。為了達到軟件可靠性和實用性的要求,該軟件不僅需要對數(shù)據(jù)快速有效的分析,而且需要良好的交互界面,為此,筆者提出了基于Matlab與C#.NET混合編程的軟件開發(fā)方法。
Matlab是優(yōu)秀的數(shù)值計算和仿真分析軟件,用戶只需極少的代碼就可以完成十分復(fù)雜的計算任務(wù),在大幅提高數(shù)據(jù)分析算法開發(fā)效率的同時也降低了開發(fā)難度。但是Matlab在開發(fā)應(yīng)用程序和對系統(tǒng)資源利用性能上表現(xiàn)較差,人機界面開發(fā)較為困難,難以滿足工程需要[4]。而C#則是一種面向?qū)ο蟮?、運行于.NET Framework之上的高級程序設(shè)計語言,程序員可以快速編寫各種基于.NET平臺的應(yīng)用程序,使開發(fā)人機界面和利用系統(tǒng)資源更加方便、快捷。但是用C#語言編寫數(shù)據(jù)分析算法較為困難,需從底層運算編寫且容易出錯,執(zhí)行效率較低[5]。因此,運用Matlab與C#混合編程方法,即利用C#編程實現(xiàn)人機界面的開發(fā)、系統(tǒng)資源的利用及端口操作等任務(wù),利用Matlab完成數(shù)據(jù)分析算法,可以極大程度地提高編程效率。
Matlab與C#通過接口可以實現(xiàn)雙向混合編程,但在實際軟件開發(fā)中通常將Matlab編寫的程序編譯為COM組件或者.NET程序集供C#調(diào)用[6]。筆者采用.NET程序集的方式進行混合編程,.NET程序集通常為.exe或.dll文件,是一種自描述組件,與COM組件相比它不需要向操作系統(tǒng)注冊,降低了在客戶機安裝運行的條件,更便于程序的發(fā)布和升級?,F(xiàn)以傅里葉變換(FFT)功能模塊為例介紹Matlab與C#混合編程的實現(xiàn)方法,調(diào)試通過的開發(fā)環(huán)境為Matlab R2012a和Microsoft Visual Studio 2010。
1.1.1編寫Matlab源程序
由于軟件的源程序較為復(fù)雜,為了更有效地說明問題,這里以FFT算法功能模塊的混編為例來進行介紹,簡化后的Matlab代碼如下:
function[mag,ang,f]=Myfft(x,Fs)%輸入為采樣信號和采樣頻率,輸出為幅值、相位和頻率序列
N=size(x,1);
n=0:N-1;
y=fft(x,N);%對信號進行快速Fourier變換
mag=abs(y)*2/N;%求得Fourier變換后的振幅(頻率譜×2/N為真實振幅)
ang=angle(y);%求得Fourier變換后的相位
f=n*Fs/N;%頻率序列
程序中函數(shù)fft為Matlab自帶,無需重寫,這也是用Matlab開發(fā)復(fù)雜算法的優(yōu)勢之一。保存該程序,文件名為函數(shù)名Myfft.m。
1.1.2配置Matlab編譯器
在Matlab命令窗口輸入mbuild-setup,選擇開發(fā)本軟件所用的Visual開發(fā)環(huán)境對應(yīng)的編譯器版本,若無對應(yīng)版本需更換Visual或者Matlab版本使之對應(yīng),否則無法完成混編。筆者使用的開發(fā)環(huán)境為Matlab R2012a和Microsoft Visual Studio 2010并調(diào)試通過。配置完成后只要開發(fā)環(huán)境不改變,此步驟僅執(zhí)行一次。
1.1.3打開.NET編譯器添加源程序文件
在Matlab中新建Deployment Project(圖1),輸入工程名稱為FFT,選擇工程的保存位置且類型選擇為.NET Assembly。
圖1 新建Deployment Project
在.NET Assembly窗口中選擇Add class并定義類名為fft,在此類下選擇Add files添加Matlab源程序文件Myfft.m(圖2)。在Package選項卡中可查看工程包含的文件,也可添加其他引用的文件或路徑,可選擇添加MCR到此工程,此方法可解決目標(biāo)機沒有MCR的問題,但這種方式在編譯時耗時長且沒有必要。
圖2 .NET Assembly窗口
1.1.4編譯生成.NET程序集
編譯之前需在設(shè)置窗口的.NET選項卡中設(shè)置Microsoft Framework版本號,Visual Studio 2010的Framework版本為4.0。配置完成后點擊Build開始編譯工作。編譯結(jié)束后在工程路徑下會生成工程文件夾FFT,子目錄distrib文件夾中包含了混編所需要的C#程序集FFT.dll。
1.2.1添加引用
打開Visual C#的項目,在解決方案資源管理器當(dāng)前項目下添加兩個引用,一個是對生成的程序集FFT.dll的引用,另一個是對MWArray.dll動態(tài)鏈接庫的引用,此文件位于Matlab安裝目錄下。在程序中需要引用兩個命名空間:using MathWorks.Matlab.NET.Arrays和using MathWorks.Matlab.NET.Utility。Matlab平臺與.NET平臺的數(shù)據(jù)交換是由這兩個命名空間下的類和接口實現(xiàn)的,可以使用MathWorks.Matlab.NET.Arrays.MWArray類型變量作為兩個平臺的中間變量實現(xiàn)數(shù)據(jù)交換。
1.2.2編寫C#代碼調(diào)用程序集
在編寫調(diào)用代碼之前要查看被調(diào)用的程序集的輸入輸出形式,編譯器將Matlab源程序函數(shù)編譯后以多函數(shù)重載的方式存放于類fft下,供用戶以不同的方式調(diào)用,在解決方案資源管理器中雙擊FFT引用即可打開對象瀏覽器,定位到成員fft可查看重載,并根據(jù)實際輸入輸出方式選擇合理的重載進行調(diào)用。這里選用public MathWorks.Matlab.NET.Arrays.MWArray[]Myfft(int numArgsOut,MathWorks.Matlab.NET.Arrays.MWArray x,MathWorks.Matlab.NET.Arrays.MWArray Fs),如圖3所示。
圖3 類fft的重載函數(shù)成員
可以看出,除輸出參數(shù)個數(shù)numArgsOut變量為int類型外,其他輸入/輸出參數(shù)均為中間類型MWArray。根據(jù)上述分析編寫的調(diào)用函數(shù)如下(主要代碼和注釋):
using MathWorks.Matlab.NET.Arrays;
using MathWorks.Matlab.NET.Utility;
//定義一個函數(shù)fft對調(diào)用進行二次封裝
public static void fft(float[]ia2,float[]T)
{
//創(chuàng)建fft類對象
FFT.fft ft=new FFT.fft();
//利用MWArray提供的接口函數(shù)對輸入量進行數(shù)據(jù)類型轉(zhuǎn)換,MWNumericArray類型是MWArray的子類,即向下兼容
MWNumericArray Ia2=new MWNumericArray(ia2);
MWNumericArray t=new MWNumericArray(T);
//調(diào)用Myfft方法,返回MWArray[]類型變量resultArray
MWArray[]resultArray=ft.Myfft(3,Ia2,t);
//將輸出結(jié)果的每一個元素拿出來用ToArray方法強制轉(zhuǎn)換為double型二維數(shù)組,即完成了從中間變量到.NET變量的轉(zhuǎn)換
double[,]result0=(double[,])resultArray[0].ToArray();
double[,]result1=(double[,])resultArray[1].ToArray();
double[,]result2=(double[,])resultArray[2].ToArray();
}
至此完成了C#語言調(diào)用Matlab生成的.NET程序集的任務(wù),對于其他功能模塊的編程均按照這種方式進行混合編程。
Matlab與C#混合編程也有不可避免的劣勢,當(dāng)?shù)?次調(diào)用.dll程序集時必然會加載MCR,這個過程根據(jù)目標(biāo)機器性能的不同將耗費10~15s的時間,造成首次進行數(shù)據(jù)分析時的假死現(xiàn)象。采取在MCR加載前提醒用戶的方式無法從根本解決問題,增加線程雖然程序不會假死,但加載的時間是必然存在的。徹底解決這一問題的關(guān)鍵在于如何完全規(guī)避加載時間,使之不影響調(diào)用時間。
然而,在程序運行后的時間內(nèi)均有可能調(diào)用.dll程序集,在程序運行前加載又會拖慢程序的打開速度。筆者采用增加用戶登錄界面的方法,在程序真正運行前進行身份驗證的同時創(chuàng)建新的后臺線程完成MCR的加載,這樣既對軟件的使用權(quán)限加以限制又解決了MCR加載耗時長的問題。
用戶登錄信息采用本地加密存儲方式,C#.NET提供了DESCryptoServiceProvider類可以對用戶信息進行加密處理并存儲在本地目錄,通過這種方式實現(xiàn)了較為可靠的用戶登錄系統(tǒng)。
在登錄界面初始化的過程中創(chuàng)建一個新的線程,該線程通過調(diào)用一次.dll間接實現(xiàn)MCR的加載,仍以FFT算法為例,其調(diào)用程序如下:
public LoginForm()
{
InitializeComponent();//登錄界面初始化
//啟用新線程進行加載,防止假死
Thread th=new Thread(Load_MCR);
th.IsBackground=true;
th.Start();
}
private static void Load_MCR()
{
//用創(chuàng)建.dll實例的方法預(yù)加載MCR
FFT.fft mcrLoad=new FFT.fft();
}
由于采用了自描述.NET程序集實現(xiàn)了Matlab與.NET兩個平臺的混合編程,目標(biāo)機器僅需安裝.NET Framework 4.0和Matlab Compiler Runtime(MCR)即可脫離特定開發(fā)環(huán)境運行此軟件。程序打包時要將.NET Framework 4.0作為系統(tǒng)必備條件一起打包,這樣在軟件安裝時,安裝向?qū)ё詣訖z測當(dāng)前安裝環(huán)境下是否存在指定版本的.NET Framework,若沒有則首先安裝.NET Framework 4.0然后再進行應(yīng)用軟件的安裝,最后在目標(biāo)機上安裝MCR,其安裝文件在開發(fā)機Matlab安裝目錄的MatlabR2012a oolboxcompilerdeploywin32下。
基于筆者所述方法完成的配電網(wǎng)斷線監(jiān)測軟件,主要實現(xiàn)了對COMTRADE協(xié)議錄波文件的解析,并利用對負(fù)序電流的HHT分析結(jié)果最終實現(xiàn)故障選線的功能,為了增強軟件的實用性,還添加了傅里葉分析(FFT)與波形對比等功能,軟件功能框圖如圖4所示,其中FFT分析功能模塊、序分量分解功能模塊、EMD分解功能模塊和希爾伯特變換功能模塊均由Matlab編寫,軟件主界面如圖5所示,軟件充分考慮人機交互的人性化,在主界面和子界面中均保持了傳統(tǒng)軟件的界面風(fēng)格。
圖4 配電網(wǎng)斷線監(jiān)測軟件功能框圖
通過實例介紹了Matlab與C#混合編程的實現(xiàn)方法,將Matlab源程序編譯為.NET程序集,用C#語言編寫調(diào)用方法實現(xiàn)兩者的混合編程。利用用戶登錄界面初始化時添加新線程加載MCR的方式,規(guī)避了MCR加載對調(diào)用.dll程序集的影響,解決了MCR加載時間過長的缺陷。此方法充分發(fā)揮了兩種語言的優(yōu)勢,用較少的代碼完成了復(fù)雜的數(shù)據(jù)處理算法,而且具有人機界面美觀、程序運行穩(wěn)定及升級維護方便等特點,是算法處理和界面開發(fā)極為有效的結(jié)合方式,非專業(yè)人士也可以完成軟件的開發(fā)、維護和升級,具有較廣的應(yīng)用范圍。
圖5 配電網(wǎng)斷線監(jiān)測軟件主界面
[1] 張慧芬,桑在中.架空線單相斷線接地復(fù)故障分析[J].中國電力,2013,46(2):65~71.
[2] 盛方正,陳子聰,陳曉炯.中性點不接地系統(tǒng)單相斷線故障分析及對策研究[J].供用電,2011,28(3):43~45.
[3] 肖希鳳.配電線路單相斷線故障檢測技術(shù)研究[D].濟南:濟南大學(xué),2016.
[4] 黃敬濤.基于C#與Matlab混合編程的肝儲備功能分析系統(tǒng)研究[D].長春:吉林大學(xué),2013.
[5] 姚光強,陳立平.基于COM技術(shù)的C#與Matlab混合編程[J].計算機工程,2008,34(14):87~89.
[6] 侯偉真,李正強,張玉環(huán),等.基于C#和Matlab的HJ-1-CCD氣溶膠光學(xué)厚度反演系統(tǒng)的開發(fā)[J].遙感信息,2013,28(5):28~31.
ApplicationofProgrammingMixedMatlabandC#inLine-brokenMonitoringSoftwareforDistributionNetwork
WANG Shi-xin1,ZHANG Hui-fen1,XU Bin2,KONG Ping2,FU Ke2
(1.SchoolofAutomationandElectricalEngineering,UniversityofJinan; 2.JiningPowerSupplyCompany,ShandongElectricPowerCompany)
In the process of developing line-broken monitoring software for the power distribution network, a software development method based on programming which mixed Matlab and C# language was proposed, which has the source program of data processing algorithm written in Matlab language compiled as a .NET
國家電網(wǎng)公司科技項目。
王士新(1991-),碩士研究生,從事配電網(wǎng)故障檢測工作,wangshixin1016@163.com。
TH865; TM769
A
1000-3932(2017)12-1135-05
2017-09-07,
2017-10-18)
(Continued on Page 1163)