Matlab与C#混合编程在配电网断线监测软件的应用①

2018-01-11 01:59王士新张慧芬
化工自动化及仪表 2017年12期
关键词:断线调用编程

王士新 张慧芬 徐 斌 孔 平 付 珂

(1.济南大学自动化与电气工程学院;2.国网山东省电力公司济宁供电公司)

Matlab与C#混合编程在配电网断线监测软件的应用①

王士新1张慧芬1徐 斌2孔 平2付 珂2

(1.济南大学自动化与电气工程学院;2.国网山东省电力公司济宁供电公司)

在开发配电网断线监测软件的过程中,提出基于Matlab与C#混合编程的软件开发方法,该方法将Matlab语言编写的数据处理算法源程序编译为.NET程序集以实现两者混编的目的,发挥两者在软件开发上独特的优势,不仅降低了数据处理算法的开发难度,也大幅提升了软件品质。该软件主要提供COMTRADE协议录波文件解析和管理、监测信息管理、电压/电流分析、处理结果可视化展示及处理结果导出等功能。

混合编程 配电网 断线监测 数据处理算法 故障录波器

配电网断线故障是配电网中不可忽视的故障类型,目前在对配电线路故障检测的研究中,主要侧重于发生各类短路故障后的检测与定位,而对于配电网断线故障的研究较少,在目前运行的配电网中还没有专门针对断线故障的保护装置[1,2]。为解决这一现状,笔者结合当前普遍应用的故障录波器开发上位机应用软件,通过对COMTRADE协议录波文件的解析得到录波数据,利用对负序电流的希尔伯特黄变换(HHT)分析结果最终实现故障选线功能[3]。为了达到软件可靠性和实用性的要求,该软件不仅需要对数据快速有效的分析,而且需要良好的交互界面,为此,笔者提出了基于Matlab与C#.NET混合编程的软件开发方法。

Matlab是优秀的数值计算和仿真分析软件,用户只需极少的代码就可以完成十分复杂的计算任务,在大幅提高数据分析算法开发效率的同时也降低了开发难度。但是Matlab在开发应用程序和对系统资源利用性能上表现较差,人机界面开发较为困难,难以满足工程需要[4]。而C#则是一种面向对象的、运行于.NET Framework之上的高级程序设计语言,程序员可以快速编写各种基于.NET平台的应用程序,使开发人机界面和利用系统资源更加方便、快捷。但是用C#语言编写数据分析算法较为困难,需从底层运算编写且容易出错,执行效率较低[5]。因此,运用Matlab与C#混合编程方法,即利用C#编程实现人机界面的开发、系统资源的利用及端口操作等任务,利用Matlab完成数据分析算法,可以极大程度地提高编程效率。

1 C#与Matlab混合编程的实现方法

Matlab与C#通过接口可以实现双向混合编程,但在实际软件开发中通常将Matlab编写的程序编译为COM组件或者.NET程序集供C#调用[6]。笔者采用.NET程序集的方式进行混合编程,.NET程序集通常为.exe或.dll文件,是一种自描述组件,与COM组件相比它不需要向操作系统注册,降低了在客户机安装运行的条件,更便于程序的发布和升级。现以傅里叶变换(FFT)功能模块为例介绍Matlab与C#混合编程的实现方法,调试通过的开发环境为Matlab R2012a和Microsoft Visual Studio 2010。

1.1 Matlab程序编译为.NET程序集

1.1.1编写Matlab源程序

由于软件的源程序较为复杂,为了更有效地说明问题,这里以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;%频率序列

程序中函数fft为Matlab自带,无需重写,这也是用Matlab开发复杂算法的优势之一。保存该程序,文件名为函数名Myfft.m。

1.1.2配置Matlab编译器

在Matlab命令窗口输入mbuild-setup,选择开发本软件所用的Visual开发环境对应的编译器版本,若无对应版本需更换Visual或者Matlab版本使之对应,否则无法完成混编。笔者使用的开发环境为Matlab R2012a和Microsoft Visual Studio 2010并调试通过。配置完成后只要开发环境不改变,此步骤仅执行一次。

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到此工程,此方法可解决目标机没有MCR的问题,但这种方式在编译时耗时长且没有必要。

图2 .NET Assembly窗口

1.1.4编译生成.NET程序集

编译之前需在设置窗口的.NET选项卡中设置Microsoft Framework版本号,Visual Studio 2010的Framework版本为4.0。配置完成后点击Build开始编译工作。编译结束后在工程路径下会生成工程文件夹FFT,子目录distrib文件夹中包含了混编所需要的C#程序集FFT.dll。

1.2 C#调用Matlab生成的.NET程序集

1.2.1添加引用

打开Visual C#的项目,在解决方案资源管理器当前项目下添加两个引用,一个是对生成的程序集FFT.dll的引用,另一个是对MWArray.dll动态链接库的引用,此文件位于Matlab安装目录下。在程序中需要引用两个命名空间:using MathWorks.Matlab.NET.Arrays和using MathWorks.Matlab.NET.Utility。Matlab平台与.NET平台的数据交换是由这两个命名空间下的类和接口实现的,可以使用MathWorks.Matlab.NET.Arrays.MWArray类型变量作为两个平台的中间变量实现数据交换。

1.2.2编写C#代码调用程序集

在编写调用代码之前要查看被调用的程序集的输入输出形式,编译器将Matlab源程序函数编译后以多函数重载的方式存放于类fft下,供用户以不同的方式调用,在解决方案资源管理器中双击FFT引用即可打开对象浏览器,定位到成员fft可查看重载,并根据实际输入输出方式选择合理的重载进行调用。这里选用public MathWorks.Matlab.NET.Arrays.MWArray[]Myfft(int numArgsOut,MathWorks.Matlab.NET.Arrays.MWArray x,MathWorks.Matlab.NET.Arrays.MWArray Fs),如图3所示。

图3 类fft的重载函数成员

可以看出,除输出参数个数numArgsOut变量为int类型外,其他输入/输出参数均为中间类型MWArray。根据上述分析编写的调用函数如下(主要代码和注释):

using MathWorks.Matlab.NET.Arrays;

using MathWorks.Matlab.NET.Utility;

//定义一个函数fft对调用进行二次封装

public static void fft(float[]ia2,float[]T)

{

//创建fft类对象

FFT.fft ft=new FFT.fft();

//利用MWArray提供的接口函数对输入量进行数据类型转换,MWNumericArray类型是MWArray的子类,即向下兼容

MWNumericArray Ia2=new MWNumericArray(ia2);

MWNumericArray t=new MWNumericArray(T);

//调用Myfft方法,返回MWArray[]类型变量resultArray

MWArray[]resultArray=ft.Myfft(3,Ia2,t);

//将输出结果的每一个元素拿出来用ToArray方法强制转换为double型二维数组,即完成了从中间变量到.NET变量的转换

double[,]result0=(double[,])resultArray[0].ToArray();

double[,]result1=(double[,])resultArray[1].ToArray();

double[,]result2=(double[,])resultArray[2].ToArray();

}

至此完成了C#语言调用Matlab生成的.NET程序集的任务,对于其他功能模块的编程均按照这种方式进行混合编程。

2 混合编程存在的问题与优化

Matlab与C#混合编程也有不可避免的劣势,当第1次调用.dll程序集时必然会加载MCR,这个过程根据目标机器性能的不同将耗费10~15s的时间,造成首次进行数据分析时的假死现象。采取在MCR加载前提醒用户的方式无法从根本解决问题,增加线程虽然程序不会假死,但加载的时间是必然存在的。彻底解决这一问题的关键在于如何完全规避加载时间,使之不影响调用时间。

然而,在程序运行后的时间内均有可能调用.dll程序集,在程序运行前加载又会拖慢程序的打开速度。笔者采用增加用户登录界面的方法,在程序真正运行前进行身份验证的同时创建新的后台线程完成MCR的加载,这样既对软件的使用权限加以限制又解决了MCR加载耗时长的问题。

用户登录信息采用本地加密存储方式,C#.NET提供了DESCryptoServiceProvider类可以对用户信息进行加密处理并存储在本地目录,通过这种方式实现了较为可靠的用户登录系统。

在登录界面初始化的过程中创建一个新的线程,该线程通过调用一次.dll间接实现MCR的加载,仍以FFT算法为例,其调用程序如下:

public LoginForm()

{

InitializeComponent();//登录界面初始化

//启用新线程进行加载,防止假死

Thread th=new Thread(Load_MCR);

th.IsBackground=true;

th.Start();

}

private static void Load_MCR()

{

//用创建.dll实例的方法预加载MCR

FFT.fft mcrLoad=new FFT.fft();

}

3 软件的安装和应用

由于采用了自描述.NET程序集实现了Matlab与.NET两个平台的混合编程,目标机器仅需安装.NET Framework 4.0和Matlab Compiler Runtime(MCR)即可脱离特定开发环境运行此软件。程序打包时要将.NET Framework 4.0作为系统必备条件一起打包,这样在软件安装时,安装向导自动检测当前安装环境下是否存在指定版本的.NET Framework,若没有则首先安装.NET Framework 4.0然后再进行应用软件的安装,最后在目标机上安装MCR,其安装文件在开发机Matlab安装目录的MatlabR2012a oolboxcompilerdeploywin32下。

基于笔者所述方法完成的配电网断线监测软件,主要实现了对COMTRADE协议录波文件的解析,并利用对负序电流的HHT分析结果最终实现故障选线的功能,为了增强软件的实用性,还添加了傅里叶分析(FFT)与波形对比等功能,软件功能框图如图4所示,其中FFT分析功能模块、序分量分解功能模块、EMD分解功能模块和希尔伯特变换功能模块均由Matlab编写,软件主界面如图5所示,软件充分考虑人机交互的人性化,在主界面和子界面中均保持了传统软件的界面风格。

图4 配电网断线监测软件功能框图

4 结束语

通过实例介绍了Matlab与C#混合编程的实现方法,将Matlab源程序编译为.NET程序集,用C#语言编写调用方法实现两者的混合编程。利用用户登录界面初始化时添加新线程加载MCR的方式,规避了MCR加载对调用.dll程序集的影响,解决了MCR加载时间过长的缺陷。此方法充分发挥了两种语言的优势,用较少的代码完成了复杂的数据处理算法,而且具有人机界面美观、程序运行稳定及升级维护方便等特点,是算法处理和界面开发极为有效的结合方式,非专业人士也可以完成软件的开发、维护和升级,具有较广的应用范围。

图5 配电网断线监测软件主界面

[1] 张慧芬,桑在中.架空线单相断线接地复故障分析[J].中国电力,2013,46(2):65~71.

[2] 盛方正,陈子聪,陈晓炯.中性点不接地系统单相断线故障分析及对策研究[J].供用电,2011,28(3):43~45.

[3] 肖希凤.配电线路单相断线故障检测技术研究[D].济南:济南大学,2016.

[4] 黄敬涛.基于C#与Matlab混合编程的肝储备功能分析系统研究[D].长春:吉林大学,2013.

[5] 姚光强,陈立平.基于COM技术的C#与Matlab混合编程[J].计算机工程,2008,34(14):87~89.

[6] 侯伟真,李正强,张玉环,等.基于C#和Matlab的HJ-1-CCD气溶胶光学厚度反演系统的开发[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

国家电网公司科技项目。

王士新(1991-),硕士研究生,从事配电网故障检测工作,wangshixin1016@163.com。

TH865; TM769

A

1000-3932(2017)12-1135-05

2017-09-07,

2017-10-18)

(Continued on Page 1163)

猜你喜欢
断线调用编程
断线的珍珠
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
核电项目物项调用管理的应用研究
归来吧!精灵(连载八)
一起10kV开关控制回路断线故障分析及回路完善
断线的风筝
基于系统调用的恶意软件检测技术研究