电子说
LabVIEW的无法直接完成向dll中传入回调函数,需要用其他语言编写包装器来实现。因此,可利用C#编写包装器,编写中间转换的程序,并生成.NET类库,将底层包含回调函数的dll与LabVIEW连接起来。
本文主要是LabVIEW无法调用回调函数dll的问题的解决方法,也介绍了LabVIEW调用C#库的方法。
1)选择“类库(.NET Framework)”(不要选择类库,那个是.NET Core/.NET 5+版本,兼容性有问题)
2)在.cs文件里面,编写程序。
using System;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
public delegate void CallbackFunction(int a, int b, ref int sum);
public class MyCSharpWrapper
{
private Action< int, int, int >? triggerCallback = null;
//从底层dll中,获取相关函数
[DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int Initialize();
[DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void RegisterCallback(CallbackFunction callback);
[DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void TriggerCallback(int a, int b, ref int sum);
[DllImport("MyCallbacks.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void Sum(int a, int b, ref int sum);
public int InitializeWrapper()
{
//查看底层dll的执行状态,正常执行时,返回1
return Initialize();
}
public void SetCallback()
{
// 注册回调函数
RegisterCallback(MyCallback);
triggerCallback = (a, b, result) = > TriggerCallback(a, b, ref result);
}
public int ReadData(int a, int b)
{
//触发设置参数,触发回调函数,获取返回值
int result = 0;
triggerCallback!(a, b, result);
return result;
}
public int TestSum(int a, int b)
{
//用于替代回调函数,测试生成的类库是否可以执行
int result = 0;
Sum(a, b, ref result);
return result;
}
private void MyCallback(int a, int b, ref int sum)
{
// 传入的回调函数
sum = a + b;
}
}
}
3)生成Dll后,在Labview中进行加载。选择构造器节点。
双击构造器节点,选择浏览
4)选择生成的库文件。(注:注意调用的底层dll,要放在同一目录下。此处是为了实现调用底层MyCallback.dll,如果仅为了调用.NET类库,可忽略)
选择要调用的类,此处是MyCSharpWrapper,与代码相对应。
5)在后方连接调用节点,可以选择要执行的方法。
6)编写相关的程序,初始化程序用于判断底层dll的执行情况,SetCallback调用底层的dll并注册回调函数,ReadData中设置相关参数,触发回调函数并获得计算的返回值。
7)测试运算正常
全部0条评论
快来发表一下你的评论吧 !