labview中事件回调的使用

电子说

1.2w人已加入

描述

最近测试了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)在常规用事件结构处理的事件,在“事件检测窗口”中,都是有记录的。但是利用事件回调是没有记录的,说明这个事件回调和事件结构没有直接关系。

调试
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分