最近测试了labview调用dll中的回调函数相关功能,遇到了一些问题,现在做一下整理和总结,相关的内容比较多,分多篇来写。
在LabVIEW中,新手经常将所有的程序放在事件结构中来执行,有时还不取消前面板锁定,一个事件触发没有执行完成时,又去执行另外一个事件,导致界面锁死,必须从任务管理器里面关闭程序才行。
进一步优化,会采用生产者-消费者结构,在事件结构中触发,在消费者循环中,处理相关的程序。但如果要处理的程序时间较长,还是会导致队列阻塞,不能及时处理相应的程序。此时,便可以采用事件回调的方式来来解决。
先简单介绍一下回调函数,是一种在编程中常见的概念,它通常用于在特定事件发生时执行预定义的操作。回调函数可以作为参数传递给其他函数,以便在需要时被调用,从而实现定制的事件处理和逻辑分离。详细的概念网上很多,可以感兴趣可以查一下。
在labview中,无法实现将函数的地址指针传递给dll的,实际测试过VI引用是不可以的。可通过包装器的方式来实现,网上这方面的信息很少,个人理解,就是额外做一个中间层,将labview和dll进行连接。更进一步,就用其他语言如c++,编写好相关的函数指针,完全实现既定的功能,之后再打包成中间的dll,在labview中进行调用。
labview本身,是支持回调函数的,只不过,这种机制是在内部进行实现(也许还支持其他的交互方式,本人没有测试出来)。可以利用此功能,编写一些异步的程序,解决一些程序执行时间较长的问题。
1)搜索找到“事件回调注册”,这两个是同样的东西,在不同的文件路径下面,选择一个即可。
2)拖放到程序框图内,这个函数包含了事件、VI引用还有用户参数。
3)这里写一个简单的测试函数,a+b=sum。其中a传入值,b和sum传入引用。
void Add(int a, int& b, int& sum) {
sum = a + b;
}
这几个参数,作为函数的输入,连接到用户参数中上面。
4)选择这个回调函数的触发方式,这里使用A的值改变。将A的引用连接到“事件”接线端,选择相应的事件。
5)在VI引用上,右键选择“创建回调VI”,可以自动生成一个用于执行的VI函数。
这个生成的VI与自己编写的VI静态调用有所区别,界面显示多了个*,右键查看是选择了“严格类型VI的引用”。
6)编程完成相关函数功能,保存VI。
7)编写简单的循环和延时,保证程序一直是执行状态。
8)程序测试。输入A=1,B=1,运行软件。软件运行时,程序没有执行。当用于触发的A达到“值改变”的条件时,程序运行,sum得到数据为2。
9) 后续改变A的数值,发现整个sum没有发生变化,A的数据是以值的类型传入的,后面再改变数据,也无法改变最初传入的数据值。
10)修改B的数据,再修改A触发程序,可以以看到程序运行。说明只需要注册一次,程序可以触发多次。
11)在常规用事件结构处理的事件,在“事件检测窗口”中,都是有记录的。但是利用事件回调是没有记录的,说明这个事件回调和事件结构没有直接关系。
-
LabVIEW
+关注
关注
1962文章
3652浏览量
322295 -
调试
+关注
关注
7文章
572浏览量
33892 -
程序
+关注
关注
116文章
3773浏览量
80830 -
回调函数
+关注
关注
0文章
87浏览量
11543
发布评论请先 登录
相关推荐
评论