LabVIEW Channel Wire通道线应用和注意点

测量仪表

1484人已加入

描述

了解了Channel Wire后,我们来看看关于Channel Wire的一些应用和注意点。 

  1、Channel Messenger Handler

操作者通过用户界面上不同的按钮,把需要不同的消息发送给消息处理线程;消息处理线程按照接收到消息的先后顺序处理这些消息。这也是一个经典的设计模式,它的实现路径就是messenger类型的channel wire。

线程

线程

注意:上面三个循环是并行的三个线程。channel wire不定义代码执行顺序。 这是一个非常实用的设计模式,可以把需要处理的子任务做成subVI,在Message Handling Loop里调用。 2、正确使用stream channel,避免死锁 这个示例的名称是“channel-tag”,演示的功能是A、B、C三个工作站的温度一旦超过Threshold Setting设置的值就显示“Too hot!”予以警示。

线程

下图是初始代码。这个代码仔细看看是存在两个bug的。第一,有两个写通道操作(下图标记1和2的两处),但是执行顺序不确定。第二,右边三个线程可能以threshold的值为0运行,因为读通道操作可能未读到数据(右边三个线程之一或者全部在通道写入完成前开始运行了)。

线程

针对上述bug,下图代码做了改进。 第一,1初特意加了一根连接线,明确两个写通道操作的执行顺序。第二,通过移位寄存器(2和3)让读通道操作第一次执行时无限等待,直到读到数据了再往下执行,以确保threshold至少被写入了一次。

线程

3、准确理解含有channel wire的程序执行顺序 Parallel Channels Problem,这个示例,演示了多个channel wire并用的时候,可能出现的死锁问题。程序界面上有三个Stop按钮,有可能可以正常退出这个程序,也极有可能无法正常退出。常见的结果应该是,A、B、C三部分都停止更新数据了,但是主程序无法退出。

线程

出现这个问题的原因在于通道的Read操作,默认是无限等待的——没有读到数据就一直等待。Producer A停止后,ConsumerA可能无数据可读,就会一直等下去,从而主程序就无法正常退出。 Producer B和Consumer B通过给Read设置20ms超时时间来解决这个问题。 Producer C和Consumer C通过Write和Read操作的last element属性来解决这个问题。

线程

以上几个示例,都是LabVIEW自带的。LabVIEW里还有很多有关channel的示例,建议大家去看看,对开阔思路、加深理解、熟练运用channel wire都大有裨益。

编辑:黄飞

 

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

全部0条评论

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

×
20
完善资料,
赚取积分