最近测试了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)在常规用事件结构处理的事件,在“事件检测窗口”中,都是有记录的。但是利用事件回调是没有记录的,说明这个事件回调和事件结构没有直接关系。
区块链技术如何化解征信市场难题
华为智能体“5机”协同,推动行业知识生产范式革命
线材加工UL认证 电子线UL认证
中国自主研制的AES100涡轴发动机完成整机结冰适航试验
硅-碳复合锂电池负极材料制备方法解析
labview中事件回调的使用
为何说智能家居是伪智能
随着设计技术和处理工艺改进 集成厂商正研究满足市场需求的运算放大器
区块链能解决DAG有向图数据结构的扩展问题吗
快讯:工信部与广电总局携手:2G、3G加速退网5G提速
区块链和数字货币行业的商业格局探讨
TikTok正面临四面楚歌的困境,未来该去何处?
了解6层PCB结构及其优势
PCBA上电容开裂短路,是什么原因导致的
特斯拉将与第三方合作,为其Semi电动半挂卡车提供充电服务
苹果努力控制其产生的热量后,就放弃了AirPower
恩瑞普推出性能稳定强大的超高频R2000系列固定式读卡机
OUFU欧孚光纤光缆生产厂家:矿用光缆颜色为什么是蓝色
学校空调集中监控管理解决方案
MAX9597 业内首款集成3.3V、单SCART方案,用于