becoll 发表于 2009-4-18 09:31:48

如何用嵌套的生产-消费者循环达到实时存储目的?

描述一下我的问题:如图所示(图太大,数据生产者循环未给出):我用一个数据生产者循环产生数据,比如每隔一个触发周期产生2000点数据,送到数据处理循环,将前1000个点取出,送入第二个队列给数据存储循环存储。我的目的是要达到实时存储,并且存储的数据是一维的。
图中程序的问题是:假设我数据生产者循环循环了三次,共产生6000点数据,最后处理存储成的是3*1000的二维数组,不是我想要的1*3000的一维数组!虽然这样是实时存储
为了存储为一维数组,我在数组处理循环中用了数组插入VI将每次送来的1000个数据串成一串,再由右边的移位寄存器输出存储,这种方式虽然可以满足存储的数据是一维的,但要等到数据处理循环处理完所有数据才会送出去存储,不是实时的!数据量一大根本行不通!
请问谁能有办法既能让我实现实时存储,又能让存储的数据是一维的?万分感谢!!

becoll 发表于 2009-4-18 09:46:33

本帖最后由 becoll 于 2009-4-18 09:50 编辑

图好像看不清,再来一张

foolooo 发表于 2009-4-18 10:10:48

楼主你好,我在别处也看过你的帖子,谢谢你发的截图。我在你那篇也说过,用对array进行操作的方法(虽然有很多种方法)在这里是没必要的,放在生产者中的话会消耗时间和内存。由于我现在手边没有lv,所以抱歉不能试,我认为应该是你写文件的操作里有的设置不正确。你试试用express vi存为lvm文件,看看问题还存在不,我晚些时候有lv时试试你的程序。
能否再上传个lv 8.5/8.2版本的vi文件?谢谢。

becoll 发表于 2009-4-18 17:16:23

3# foolooo
感谢你的热心讨论!
存为二进制文件的方法我试过了,只要数据是分段过来的,就会存为二维数组。我改用TDMS的格式存储已经解决实时的和一维的存储了!但是还是有老问题:每次触发存2000个点的量能存,而改成存500或其他较小的值反而提示缓冲区溢出,不知是何原因

foolooo 发表于 2009-4-18 18:25:29

那么你现在的情况是,改为tdms格式存储了?你的结构其实可以去掉中间的“生产——消费”loop,只要在最后存储文件的loop里取subset就好,基本不会降低你的存储速度的。
你试试
1 简化结构,只用一个生产消费,因为中间的那个看着没什么必要
2 用array subset来提取前2000/500个点,看是否还有内存溢出问题。
页: [1]
查看完整版本: 如何用嵌套的生产-消费者循环达到实时存储目的?