养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

LabVIEW-生产者消费者

时间:2024-10-12 18:20:48

本文章将讲解使用“多循环”苴煜塑桠来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局部变量,但是酷搭宀玳当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。如前所述,LabVIEW提供了队列操作函数,允许数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步带来的影响。

工具/原料

LabVIEW

队列

双循环

1、循环1进行0~1随机数姗隗肆念采样,循环2读取循环1的随机数局部变量,当两者的采样间隔一样均为1ms的时候,出现了循环次数和总数不一致的现象;1)当循环吭稿荔徊1的次数大于循环2的次数,表示循环2丢掉了一些数据;2)当循环1的次数小于循环2的次数,表示循环2重复读取了一些数据;

LabVIEW-生产者消费者

LabVIEW-生产者消费者

2、循环1进行0~1随机数采样(采用间隔为10ms),循环2读取循环1的随机数(采用间隔为1ms;循环1的循环次数和数据数组大小远小于循环2的循环次数和数组数组大小,说明循环2采样的数据大部分是重复数据;

LabVIEW-生产者消费者

LabVIEW-生产者消费者

3、循环1进行0~1随机数采样(采用间隔为1ms),循环2读取循环1的随机数(采用间隔为10ms;循环1的循环次数和数据数组大小远大于循环2的循环次数和数组数组大小,说明循环2采样的数据大部分被遗漏了;

LabVIEW-生产者消费者

LabVIEW-生产者消费者

生产者消费者(数据模式)

1、将整个生产者和消费者过程与蓄电系统进行类比,在生产者产生数据后,数据不直接送到朔娼沫毓消费者,因为生产者和消费者的速率不同田肖倦娄【供电局并不直接向终端用户供电,因为供电局产生电的速率与用户消耗电的速率并不相同】,此时需要搭建一个放生产者数据的缓冲区域【此时需要建造蓄电池将供电局产生的电输送到蓄电池中】。当消费者需要数据的时候,直接从缓冲区域取【当终端用户需要用电时,直接从蓄电池中获取就可以了】。同理在进行数据显示和分析时直接从数据缓冲区中获取就可以了。

2、生产者与消费者之间传递的数据是一个连续的sine交流电波形,二者蛆绲檠奸靠大小为20个点的缓冲区连接。右下角是“停止”按钮,用户控制程序的滢陈錾饶停止执行。例程提供了操作方式控件控制生产者和消费者的数据传递速率,包含五种状态:不生产,只消费、生成快于消费、生成速率等于消费速率、生成慢于消费、只生产,不消费。

3、LabVIEW代码由3个循环组成,依上而下分别是生产者循环(产生sine数据)、消费者循环(获取sine数据)和状态循环(获得缓存区中数据的数据量)。

4、1)运行该VI,速度选择“生产者=消费者”,从下图中可以看出生产者循环和消费者循环的数据是同步的,此时缓冲区内没有数据,也就是说产生的数据都被实时地消耗了。

LabVIEW-生产者消费者

LabVIEW-生产者消费者

5、2)如果再将操作方式设置为“生成者>消费者”,可以看出数据缓冲区内将逐渐变满并保持为20个元素。此时生产者的波形将会比消费者多20个数据点(这些点保存在数据缓冲区中),如下图所示。

LabVIEW-生产者消费者

LabVIEW-生产者消费者

6、3)当将操作方式变为“不生产,只消费”时,生产者循环将停止生产,而消费者循环将消耗掉缓冲区中的数据直至数据全部消耗完,如下图所示。

LabVIEW-生产者消费者

LabVIEW-生产者消费者

7、4)当将操作方式变为“只消费,不生产”时,生产者循环产生20个数据后将停止生产,如下图所示。

LabVIEW-生产者消费者

LabVIEW-生产者消费者

8、5)当将操作方式变为“生成<消费”时,消费者一直在等待生产者的数据,只要生产者产生了数据消费者立刻消费然后等待下一个生产者数据,如下图所示。

LabVIEW-生产者消费者

LabVIEW-生产者消费者

生产者消费者(事件模式)

1、将生产者的【枚举+条件结构】改成【枚举+事件结构】,即变成了消费者生产者(事件模式);

2、见LabVIEW范例;

LabVIEW-生产者消费者

LabVIEW-生产者消费者

3、生产者消费者(事件模式);

LabVIEW-生产者消费者

LabVIEW-生产者消费者

4、生产者消费者(数据模式,见上蓄电池系统);

LabVIEW-生产者消费者

LabVIEW-生产者消费者

© 一点知识