C#应用程序与MATLAB联合编程

本文主要结合C#编写应用程序方便强大和MATLAB在工业科学界的广泛应用,结合两者的优点,利用C#编写的windows桌面应用程序作为UI交互接收用户配置,并根据用户在前端应用界面的操作自动控制MATLAB运行,并将MATLAB计算的结果返回桌面应用程序进行显示。

文章目录

    • 1 C#介绍和学习
    • 2 MATLAB介绍
    • 3 C#应用程序与MATLAB混合编程方式
    • 4 XML传递参数
    • 5 交互实验小例子
    • 6 小例子源码地址
    • 7 推荐学习资源
        • C#与MATLAB交互
        • XML的学习

1 C#介绍和学习

C#对于windows系统的桌面应用程序编写非常方便,visual studio已经提供了非常人性化的设计界面和交互。上手速度快,学习成本很低。MATLAB是数值计算、系统仿真与控制等广泛应用。然而MATLAB提供的设计本身GUI功能较少,而且控件很简单,全都基于回调的形式来进行UI交互的,对于简单的MATLAB程序,可以直接用MATLAB提供的GUI进行设计。
C#学习可以参考书籍:

  1. C#开发实战1200例
  2. C#入门经典第六版
  3. 明日科技C#开发入门及项目实战

C#可以开发桌面应用程序,Web,移动端APP、平板电脑等一些列微软应用。C#是一种面向对象的编程语言,对于学过C语言的基础,变量定义、If、For、while语法完全相同,对于学过面向过程Python或Java语言的基础,类的定义基本相似,而且有大量的系统类库可以进行调用,学习成本很低。
C#主要用于windows开发的应用程序分为以下三种:

类型 特点 优点 缺点
Console 自动化 跨平台、自动化、速度快 命令行方式、没有UI交互
WinForm windows原生UI 上手快、文档多使用广泛 CPU-bound、hard to scale
WPF 丰富的UI设计 程序与界面设计完全独立 需要编写XAML、配置过多

其中CPU-bound指的是仅能利用CPU,而不能利用GPU用于显示和计算。Hard to scale指的是难以适应多种尺寸大小和分辨率的屏幕,缩放容易失真或者出现问题。

2 MATLAB介绍

想必点这个博客的同学已经不需要MATLAB介绍了吧,当然需要说明的一点:MATLAB可以通过m语言实现自动化控制SImulink运行、自动化建模等各种使用方法。而C#能够控制MATLAB运行command的各种命令、函数、脚本等等,因此原则上 C#可以控制MATLAB完成其所有功能。

3 C#应用程序与MATLAB混合编程方式

主要有以下两种方式实现C#对MATLAB的调用,其中第一种方式为C#函数调用由MATLAB中内建或者用户定义函数编译的动态链接库(dll)。如下图所示,即自定义的函数通过编译器得到dll文件,然后C#调用dll文件实现函数的调用。
C#应用程序与MATLAB联合编程_第1张图片
如上图所示,该种方式不依靠MATLAB即可单独运行,然而仅能够调用部分MATLAB函数,例如无法完成Simulink仿真,功能受到限制。
第二种方式为C#函数利用COM自动控制接口直接控制MATLAB工作空间内的变量、运行命令或者函数,并且取出MATLAB返回运算结果,如下图所示。
在这里插入图片描述
C#应用程序直接控制MATLAB运行,理论上能够实现MATLAB的所有功能,然而第一次需要启动MATLAB Server(相当于打开一次MATLAB),耗时长。
COM是Component Object Module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。MATLAB把其下的关键运行程序做成COM组件,供其他语言调用。C#、C++、VB、Excel等可以基于COM可实现自动化调用MATLAB,控制MATLAB运行。
MATLAB提供了很多基于COM的调用函数,可以完成很多MATLAB的基本常规运行命令。下图展示的是MATLAB作为服务器可以用到的COM接口函数。
在MATLAB帮助文档中可以看到:Call COM Objects;MATLAB API for Other Languages;MATLAB API for COM Automation Server
C#应用程序与MATLAB联合编程_第2张图片
在上图中可以看出,其中Execute是最主要的函数,用于执行MATLAB command,根据执行函数或者命令行 ,利用脚本自动化控制Simulink的建模与运行等任务。同时COM自动化广泛应用于windows软件中,例如C#应用程序自动化控制word、excel等软件,实现文档的自动化读、写、改。

// 启动MATLAB并运行runTest()函数
            MLApp.MLApp matlab = null;
            Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Desktop.Application");
            matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.MLApp;
            string path_project = Directory.GetCurrentDirectory();   //工程文件的路径,如bin下面的debug
            string path_matlab = "cd('" + path_project + "')";     //自定义matlab工作路径    这里我注释调用 
            matlab.Execute(path_matlab);
            matlab.Execute("clear all");
            matlab.Execute("close all");
            string command;
            command = @"runTest()";
            matlab.Execute(command);

(注意runTest是一个自定义函数,并放置在项目的debug文件夹下,MATLAB才能找到该文件)
可以将runTest换成MATLAB的任何命令语句,例如 a = 1,这样在MATLAB变量空间里就会得到变量a,其大小为1
具体关于COM接口可参考MATLAB帮助文档:MATLAB COM Automation Server Interface(直接在MATLAB的help中搜索这个短语就能找到帮助),另外还能控制启动MATLAB的版本,启动方式,启动类型等。(看帮助文档)。这里经常用到的一个配置是:启动命令窗还是整个MATLAB,即通过控制GetTypeFromProgID方法传入的字符串参数对应以下两种选择:

  1. Matlab.Application:打开MATLAB 命令窗口
  2. Matlab.Desktop.Application :打开整个桌面应用MATLAB窗口

出自MATLAB C# Book书中的一段话,概括了C#与MATLAB交互的主要方式:

  1. C# functions call MATLAB built-in functions in the mathematical library created from MATLAB M-files to solve the mathematical problems.
  2. C# functions call the MATLAB Workspace to perform particular tasks then transfer results from the MATLAB Workspace to C# functions
  3. C# functions use COM that is created from MATLAB M-files by using MATLAB COM Builder.

4 XML传递参数

由于仿真需要很多用户配置参数和仿真配置参数,因此对于C#与MATLAB进行用户配置而言,不能靠MATLAB提供的COM来取或者读参数,而需要利用XML文件来传递参数。eXtensible Markup Language,可扩展标记语言,是一种标记语言。 通常,XML被用于信息的记录和传递,不同语言针对XML文件都有统一的解析函数,可以用于不同平台或者不同语言之间的信息的交互。 XML经常被用于充当配置文件。
我们可以通过C#程序改写原有的XML文件。然后控制MATLAB解析该XML文件,以达到传递参数的目的。下图为XML文件的展示,可以看出XML是通过节点和子节点的结构。、
XML概念:可扩展标记语言(英语:Extensible Markup Language,简称:XML),是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。主要包括以下部分
1、文档声明
2、元素=标签
3、属性
4、注释
5、CDATA区、特殊字符<![CDATA[不想解析的内容]]>
特点便捷性:不同的语言C#和Java、不同的平台win和linux之间,进行数据传递
标记语言,不是编程语言

C#应用程序与MATLAB联合编程_第3张图片

如上图所示,XML根据节点和节点内包含是信息属性等方式,对不同的参数和配置进行保存。当保存完成后,C#和MATLAB都需要读和写XML文件的功能。才能完成C#与MATLAB的信息交互过程。如下图所示。
C#应用程序与MATLAB联合编程_第4张图片

5 交互实验小例子

根据上述的基于COM的控制方式和基于XML文件的信息交互方式,在桌面应用程序中输入两个数值型参数,并调用MATLAB程序完成相关的计算。

C#应用程序与MATLAB联合编程_第5张图片
软件界面如上图所示,用户输入参数然后通过输入按钮生成XML文件,点击MATLAB执行会控制MATLAB读取该文件并读取信息,然后根据信息自动调用不同的函数来实现功能,最后将运算结果保存为XML文件。当用户点击取回时,程序读取MATLAB生成的XML文件并显示到返回结果。
C#应用程序与MATLAB联合编程_第6张图片
软件运行流程
具体的运行流程如上图所示,主要是通过用户操作用户界面来完成的。
1、在参数1和参数2对话框输入两个参数,然后在函数选择下拉框选择对应的计算方式,有add和mul两个函数选择项;
2、通过点击MATLAB输入按键生成XML输入文件,然后点击MATLAB执行按键用以自动化控制MATLAB执行编写的函数
3、该函数读取了XML文件并解析出用户的输入,然后得到运算结果,并写入XML结果文件
4、C#读取XML结果文件并展示
下图分别展示了C#传递给MATLAB的XML文件和MATLAB保存的结果XML文件。
C#应用程序与MATLAB联合编程_第7张图片

C#传递给MATLAB的XML文件

在这里插入图片描述

MATLAB传递给C#的XML文件

MATLAB 所用到的m文件如下所示:
mulTest.m:用以完成乘法运算函数,输入为两个参数,输入结果
Xmlread,m:用以完成XML文件的读取操作
Xmlwrite.m:用以完成XML文件的写操作
runTest.m:C#调用MATLAB运行的主函数,根据XML制定的数据规则来解析用户输入,并根据输入计算,得到结果根据数据规则写入XML文件
注意所有函数需要放置在vs项目的debug文件夹下,MATLAB才能找到这些文件
C#程序分别进行读取用户参数输入、利用COM控制MATLAB运行、写XML函数、读XML函数和控制文本框显示。

6 小例子源码地址

这里所用到MATLAB的读xml和写xml函数不是官方的,而是有位老哥在官方的基础上进一步进行封装的,使得在使用时非常的简单和方便。下载该读写xml的工具包如下所示:
XML读写交互工具下载地址
源程序打包下载地址如下:
小例子源程序下载

7 推荐学习资源

C#与MATLAB交互

两本英文书,第一本主要是介绍C#编写应用程序结合嵌入式硬件开发的小案例,第二本是专门针对C#和MATLAB交互的,我感觉不如直接看MATLAB的帮助文档,但是帮助文档对于C#和MATLAB交互都是基于COM实现的,因此文档中介绍的并不是特别详细。

  1. Integrating C# .Net with Embedded System
  2. MATLAB C# Book

XML的学习

学习XML的语法和结构的可以去bilibili或者学习网站等,然后学习C#控制XML读写改等操作,同时学习MATLAB对XML读写改的操作。

联系作者 QQ 2807073834,邮件:[email protected],拒绝伸手党

你可能感兴趣的:(编程语言,visual,studio,code,windows,c#)