LabVIEW的Channel Wire通道线操作步骤

工业控制

1133人已加入

描述

今天和大家谈谈Channel Wire,中文译作“通道线”。 Wire,我们是熟悉的——自我们接触LabVIEW起就在使用Wire,程序框图里那些VI、子VI、控件、变量等都是通过Wire连接起来的。 但是Channel Wire与Wire是完全不一样的东西,功能也比Wire丰富和强大太多。   初识Channel Wire(通道线)

在《Labview多线程编程(二) 并列的代码框图》里我们说过,并列的while循环是LabVIEW里基本的多线程形式,但是while循环之间不能够有连线连接。例如下面这个代码,while loop2在while loop1结束后才会被执行。

单通道线

现在我们先看看下面这个代码。这两个循环是并行执行还是串行执行?

单通道线

这里面有两个While循环,通过一根 Channel Wire连接着。串行执行?不对,它们是并行的。

为什么它们是并行的?因为连接它们的线更粗——路子粗了么就不按规则来了——开个玩笑。真正的原因是:这个粗线是channel wire(通道线),通道线不定义执行顺序。

Wire and Channel Wire线与通道线

线(wire),LabVIEW里鼠标拖拽,连接不同控件、VI、变量等图形化编程元素的线,表示数据流的流向(从左到右),可以通过线设定代码执行顺序,一般称之为“数据流线”。 通道线(channel wire),一种“与众不同”的连线: 1)不建立数据流向; 2)必须结合端点(EndPoint)使用; 3)不能通过通道线设定代码执行顺序; 4)方便表达数据流的来源和去向。 在《LabVIEW常见变量类型及使用注意事项》里,我们提到过变量的一些使用注意事项,相较于变量而言通道线是一种更简单的、图形化表达的数据传输机制。 通道线简化了并行循环之间数据传输所涉及的编程,例如常见的生产者和消费者模式中两个生产者和消费者之间的数据传输。 通道线有助于减少局部变量、全局变量、队列和通知器等现有数据传输机制的使用。从长远来看,通道线还有助于减少大多数引用句柄和变量编程的使用。

通道线类型

1)串流Stream Channel

FIFO、不允许分叉,只能有一个写入方和一个读取方。

2)消息器Messenger Channel

多对多,可以有多个写入方和多个读取方。

3)Tag

类似于变量,可以有多个读取方和写入方,仅最新的数据有效。 换句话说,存在写入数据未被读取即被覆盖的风险。所以,Tag是不能消除多线程竞争带来的数据“变脏”的风险的。

4)累加器Tag

类似于一个可以把多个写入值累计求和的变量,可以有多个写入方和读取方。

5)高速串流

6)有损串流

7)单元素串流

8)事件消息器

我们先以串流通道(Strem Channel)为入口,大致了解一下通道线到底是什么、怎么用、有什么优点。

怎么创建通道线?

在程序框图函数面板里是找不到通道线相关VI的。 要创建通道线,我们只需在需要传递的数据上单击鼠标右键、选择Create->Channel Writer...,就会弹出这个选择通道线(Channel Wire)及其端点(Endpoint)类型的对话框。

单通道线

例如选择Stream通道线的Write,单击OK后就产生了一个通道线写入端点(Endpoint),在输出的channel上单击右键还可以创建读取端点等。

使用通道线的优点 1)图形化表达,更加直观,方便直接查看数据连接。 2)与引用句柄和变量相比,通道线所需节点更少。 3)通道线支持停止、超时等元数据信令。

下图,串流通道线与队列的对比。图中上下两部分的代码实现的功能是一样的,上半部分代码是使用队列实现的,下半部分代码是使用串流通道实现的。很明显,串流通道线需要的节点更少,代码更简洁。

单通道线

通道线在生产者消费者中的应用

生产者消费者Producer Consumer是一个常用的设计模式,我们看看通道线在其中的应用及其带来的益处。 下图是基于队列实现的生产者消费者模式。为了使消费者线程能够及时退出,采用了一个队列传送生产者发出的退出请求。下图中生产者线程中特地加入了100ms延时,消费者处理数据的速度相比更快,能够保证生产者产生的数据被处理完。如果没有这个延时或者生产者产生数据的速度比消费者处理数据的速度快,在生产者发出退出请求时队列中是会有数据尚未被处理的。如果要确保消费者线程终止前队列中的数据被处理完,我们需要额外编程。  

单通道线

小结一下通过队列实现生产者消费者的缺点: 1)退出需要自己编程实现。 2)不能简易实现生产者退出、消费者处理完数据后退出。

下图是基于串流通道(Channel Stream)实现的生产者消费者设计模式。一个生产者、一个消费者,不涉及到竞争问题,使用串流通道Write With Abort端点写入数据,使用串流通道Read With Abort读取数据。

单通道线

通过Stream Channel在两个线程之间传递数据。 通过channel的last element、abort参数可以快速实现不同的退出: 1)紧急退出。立即退出,放弃对数据的处理。 2)生产者退出、消费者处理完数据后退出。 3)生产者、消费者都可以发起退出并快速得到响应。 以上退出功能的快速实现,得益于lastelement和abort参数。

单通道线

单通道线

这些功能,如果用队列实现,是需要不少额外编程工作量的,而且代码节点会增加很多,影响代码可读性和可维护性。   

Stream With Replicate示例

1个写入端点、1个读取端点的串流通道我们看过了。下面是1个写入端点、2个读取端点的串流通道示例。

单通道线

这个代码第一印象非常简洁,数据的来源和去向也很清晰。 Replicate的通道线(Insert->Replicate),写入的数据被复制成2份,两个消费者线程按照各自的处理速度访问数据,完全没有影响。如果是用队列,我们可能需要考虑使用两个队列实现。   通道线是一种适合图形化编程的、简洁的、高效的数据传送机制。了解、熟悉通道线,合理利用通道线,可以帮助我们更高效、高可靠地设计软件。  

编辑:黄飞

 

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

全部0条评论

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

×
20
完善资料,
赚取积分