LabVIEW调用Matlab生成的dll
LuoBeice
自学时遇到了一个问题整了好几天才弄好。有需要的朋友可以借鉴借鉴。
问题描述:有一段很长的matlab程序,希望拿到LabVIEW里面去运行。通常可以使用LabVIEW自带的“Mathcript节点”和“matlab脚本节点”
(这两个节点可以在“函数”-“数学”-“脚本和公式”里面找到,如果没有,则需要下载LabVIEW相应的工具包).但是可能因为我是新手的原因,这两个
节点用起来很麻烦,“Mathcript节点”我感觉它好像只能识别Matlab里面一些简单的函数,复杂的(我使用的是一些图像处理的函数)就用报错。“matlab脚本节点”
使用效果很好(我感觉这个节点就相当于把代码直接放入Matlab里面去运行),但是缺点是调用这个节点时,LabVIEW会自动启动电脑里面的matlab,
如果电脑里没有Matlab就会报错,而且,使用这个节点还会出现点小问题,比如我matlab程序里面有需要外界输入的函数input,调用公式节点的时候就会没有
这个提示,而且不知道为何,第一次运行程序调用这个节点时,LabVIEW总会崩溃,第二次运行程序才会正常。有知道的大佬欢迎指点。
解决办法:看了一个b站up主“加油小林哥"的视频(很nice的一个up主),知道了LabVIEW可以调用dll(动态连接库),而我又去搜索了下,Matlab是可以将m文件
生成dll文件的。这给了我信心。经过一番搜索,我找到了一个认为可行的方法:首先将一段matlab程序封装成函数,然后将其转换成c代码,在vs中将c代码生成dll文件供
LabVIEW使用,我是照着以下博文操作的:https://blog.csdn.net/rmrgjxeivt/article/details/104521287。这个博主很强,朋友们可以去看看。我会把我自己操作的详细过程
记录下来。
准备工具(我自己的软件版本):LabVIEW2021sp1,VS2019,Matlab2019Ra。
前言:
使用Matlab Coder是可以直接生成dll文件的,但是因为我的Matlab是64位的,生成的dll也是64位的。而我的LabVIEW是32位的,直接调用的话会报错,如下图所示:
因此,怕麻烦的朋友可以将自己的Matlab换成32的,这样就能直接生成32的dll供LabVIEW使用了。我这里就相当于使用vs这个”中转站“来解决这个32位64位不兼容的问题。
方法:
1.在Matlab中新建Function
注意:这里的m文件保存时,保存的文件名要和函数名一致。
2.在matlab里面再新建一个m文件,运行刚才的fuction
运行一下,调用刚才的Function,没有问题。
3.打开coder
Matlab自带的工具箱,在”App“里可以找到。
4.按照coder的指示一步一步来
输入函数名,然后点击右下角的“next”
下面这个页面不用管,直接next
接下来按照要求定义数据类型,我们可以输入一个m文件,coder会自动定义每个数据的类型,我这里输入的就是上面那个名为test的m文件。当然也可以自己点击下面那个
”let me enter..."来自定义输入输出的类型。
定义好后按回车,显示下面这个界面就是coder自己定义好的。(如果是自定义的话可能会不一样,不过不影响)
点击next,再点击“check for issues",显示如下界面。
注意:我这里全部都是绿色的勾,朋友们如果有的像下图一样最后一个不是绿色而是报错,可以直接忽略,直接点击”next“,这个不影响。
这个错误是因为有的matlab里面没有MGW-w64编译器,但重申一遍这个不要紧。有需要的朋友可以自己去安装一个。具体做法参考:
https://blog.csdn.net/weixin_46428351/article/details/116237962。这样的话就都是绿色了。
接着点击next,到了如下界面时,直接点击”Generate"。
编译成功
5.打开vs2019,生成win32项目,生成dll文件。
打开之后点击“新建项目”,找到“window桌面向导”。
配置新项目时选择默认即可,然后点击“创建”
新项目这里,将“应用程序类型”这里选择为”动态连接库“,”其他选项“这里选择”空项目“,这样win32项目就新建好了。
注意:接下来找到”tmwtypes.h"文件,这一步很重要,是那个博主没有提到的。我找了好久才摸索出来的(本人也不会vs),
这里搞不好就会报错“找不到tmwtypes.h"或者”无法打开tmwtypes.h"。找到自己的matlab安装路径(我自己是通过右击matlab快捷方式
,点击”在文件夹中显示“找到的)下的“extern\include"文件夹,里面就有tmwtypes.h文件。复制,粘贴到matlab生成的c代码文件夹下,添加好后
如下图所示。
接着打开新建的vs项目,在项目名这里右键-”添加“-”现有项“,添加上面的"Add.c"文件。
接着添加新项目,新建一个def文件,如下图所示。
添加好之后,显示如下界面,里面也有”tmwtype.h"头文件,也是可以打开的状态。
接着在def文件中写入以下内容,注意:
第一行双引号内随意填写,第二行写"EXPORTS",第三行写入函数名“Add”。
再点击生成解决方案即可。
6.在LabVIEW里面引用dll。
打开LabVIEW2021,新建项目,新建vi,在程序框图中右击,“函数”-“互接接口”-“库与可执行程序”-"调用库函数节点“。路径和函数选择好。
参数设置方面:按照实际情况设置就行。
这样就设置好调用库函数节点了,接下来调试一下。输入和在matlab的test.m里面一样的参数。注意:注意:在节点输入的时候,在这个例子中,输出是2*3的数组,
所以,必须给输出初始化一个同维度的常量,初始化的值可以随便给,但不能为空。为空的话,LabVIEW会直接崩溃。点击运行,结果如下。算是大功告成了。
虽然看起来没多少工作量,但是这对于我一个初学者来说,属实不易,这才是一个简单的函数,而我实际需要封装的是一大段稀奇古怪的代码,不知道能否成功,
LabVIEW,MatLab接触不久,coder,vs没接触过。这点东西琢磨了快5天才东拼西凑弄出来。希望对有需要的朋友能提供帮助,也希望大佬们能给出好的建议。