您的位置 首页 发布

LabVIEW程序设计形式(五)—生产者/顾客形式(4)

本节将使用多循环来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局域变量,但是

本节将运用“多循环”来处理程序并行运转的问题,那么程序中的两个循环怎么进行数据交互和同享呢?最一般的方法是选用全局变量或局域变量,可是当两个循环履行的速率不相等时,必然会形成数据的丢掉或重复。如前所述,LabVIEW供给了行列操作函数,答应数据的发送者和接受者之间树立一条缓冲通道,这样就避免了循环不同步带来的影响。
如图 37所示,将整个进程与供水系统进行类比,在数据发生/收集端(供水局)发生数据后,并不直接向终端用户供水,因为前者发生水的速率与后者耗费水的速率并不相同。此刻需求制作蓄水池将供水局发生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。当终端用户需求用水时,直接从蓄水池中获取就能够了,同理在进行数据显现和剖析时直接从数据缓冲区中获取就能够了。


图 37 出产者/顾客模型
当然,上面的模型也会存在一个问题:数据缓冲区/蓄水池的容量?假定供水局不停地发生自来水,而终端用户却不耗费水,这样便会导致蓄水池装满而溢出。反之当终端用户耗水量太大时,导致没有水可用。LabVIEW中的行列函数供给了一种很好的方法规避了这个问题,因为行列中的元素是“先进先出”的,因而保证了接纳到的数据是有序的。在LabVIEW的行列操作中(入列和出列函数),供给了timeout选项以处理数据缓冲区的溢出或缺乏。当数据溢出时,入列函数(数据进入行列)将中止发送数据(处于等候状况),直到缓冲区存在数据空间或许达到了timeout设置的时刻;而当数据缺乏时,出列函数(数据流出行列)将中止接纳数据(处于比及状况),直到缓冲区进入了新的数据或许达到了timeout设置的时刻。
【使用6】

本例将演示出产者/顾客循环的一些根本特性和行列操作的特色。如图 38所示,出产者与顾客之间传递的数据是一个接连的sine波形,二者靠巨细为20个点的缓冲区衔接。右下角是“中止”按钮,用户操控程序的中止履行。例程供给了操作方法控件操控出产者和顾客的数据传递速率,包括五种状况:不出产,只消费、生成快于消费、生成速率等于消费速率、生成慢于消费、只出产,不消费。


图 38 出产者/顾客例程的前面板
图 39所示为出产者/顾客例程的背面板,代码由3个循环组成,依上而下分别是出产者循环(发生sine数据)、顾客循环(获取sine数据)和状况循环(取得缓存区中数据的数据量)。例程假定正常的数据发送和接纳的速率是延时50ms,当需求某一段的速率减慢时需求将循环的延时设置为100ms。
例程将入列和出列函数的timeout设置为-1,表明假如没有满意条件进行入列和出列操作,循环将处于继续等候状况。在新建行列时,设置了缓冲区的巨细是20个元素(图中的赤色圆圈内)。最下面的循环是为了实时检查行列缓冲区中存储的元素数量。


图 39 出产者/顾客例程的背面板
运转该VI,默许的操作方法是“出产速率等于消费速率”,从图 40中能够看出出产者循环和顾客循环的数据是同步的,此刻缓冲区内没有数据,也就是说发生的数据都被实时地耗费了。


图 40 出产速率等于消费速率
假如再将操作方法设置为“生成快于消费”,能够看出数据缓冲区内将逐突变满并坚持为20个元素。此刻出产者的波形将会比顾客多20个数据点(这些点保存在数据缓冲区中),如图 41所示。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/212328.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部