小弟是LabView新手,感謝各位先進不吝指教!!
我目前做的東西是要連續擷取八個Channel的電壓值,擷取完畢時將之以Waveform Graph 輸出。可是當我將擷取到的值傳到迴圈外的Array時,發現所抓到的電壓點數,跟我所設定的不合。例如:Scan of sample 設為8k,照理應是一秒可以抓到八千個點不是麼??可是傳到外面的Aarry時,可能剩幾十個點或幾百個點而己。跟我所設定的Sample Rate 實在差太多了。不知是我設定上有問題,還是我的認知上有問題?還望各位先進指導。
所使用的DAQ Card 為 PCI-6036E
以下附上我寫的vi
Test2.vi
我知道了,原來是迴圈的速度就只能這麼快,剛抓了迴圈執行的次數,跟array的裡的元素的數目是一樣的。可是接下來我有另一個問題,我想用所設定的sample rate連續抓一整段波型的電壓,例如: sample rate 設 8k 那麼一秒鐘就會有 8000筆的data。兩秒就有1600筆data,並把所有的Data記錄到一array裡,可是我該怎麼做呢?還請各位先進不吝指教。
你得先搞清楚 sample rate 跟 number of sample 這兩個參數的定義
前者是 daq卡對信號的採樣頻率,也就是wavefrom 裡的 dt
後者才是你這一次取樣總共要採樣幾點
例: sample rate = 10000 , number of sample = 1000
即為取樣率 10k 共採樣 1000點,單次採樣執行時間為 0.1秒
如果把上面兩個數字交換,則變成取樣率 1000 共採樣 10k點
單次採樣執行時間為 10秒
以上
這個小弟也是一知半解,原來是這麼個定義阿...
關於迴圈速度問題可參考
http://www.labview.com.tw/forum/forum_posts.asp?TID=4153&KW=%B0j%B0%E9+%B3t%AB%D7
看來如何將盡量把多餘程式部份移出loop是個關鍵
對了,小弟之前有看到一篇(忘了哪篇了)也有討論到sample rate
有前輩提到也要注意DAQ之最大sample rate
假如是8通道都用的話,那每個通道之最大sample rate還要除以8
(除非每個通道都有一顆Amp才能衝到max,不過好像只有S-series有)
謝謝各位的指導,現在已弄懂sample rate 及 number of sample 的意思,但程式卻卡在迴圈執行速度太慢。目前迴圈裡只有daq (AI Acquire waveforms) 讀取外部電壓資料,然後用一個collector 將讀到的資料收集起來,資料一次可能到幾十萬筆,甚至百萬筆。然後資料擷取結束後,再將之shift到迴圈外,然後畫圖。可是執行速度會隨著資料量越來越大而變慢,苦惱中,請問各位先進有更好方法麼???感謝各位的指導 !
你的數十萬筆資料是指,數十萬個波型嗎或是十萬個取樣點?
因為我的電腦上沒有灌DAQ DRIVER 所看無法看你的程式怎麼寫,不過以你的敍述來看可能其中有些部份的邏輯調整一下應該能解決你的問題,若是你需要的是連結的點,哪麼你可以一次把number of sample 設高一點,只要你的PC 的等級不要太低哪麼應該都是來得及送回完整的資料的.
我所說的資料量指的是採樣點的數量,例如:我在while 迴圈裡讀取資料,若是我的number of sample 設為5000來說,DAQ在完成5000個採樣點時,資料會送到collector (collector 是在迴圈裡) 收集起來,這樣算是完成一次迴圈。若迴圈跑兩次,就會有一萬個筆採樣點的資料在collector裡,三次就是一萬五千點,以此類推。而當我採樣點越存越多的時候,迴圈就越跑越慢了。請問有什麼別的辨法可以改善嗎??再次感激各位的指導~!!
[QUOTE=KENLIN]
你的數十萬筆資料是指,數十萬個波型嗎或是十萬個取樣點?
因為我的電腦上沒有灌DAQ DRIVER 所看無法看你的程式怎麼寫,不過以你的敍述來看可能其中有些部份的邏輯調整一下應該能解決你的問題,若是你需要的是連結的點,哪麼你可以一次把number of sample 設高一點,只要你的PC 的等級不要太低哪麼應該都是來得及送回完整的資料的.
[/QUOTE]
請問,number of sample的值要怎麼取決呢?
(比如說Sample rate可以依Nyquist定理來當作參考)
設太大時轉換時間會很久,那最少要設多少有沒有依據?還是只能Try and error?
[QUOTE=ying525][QUOTE=KENLIN]
你的數十萬筆資料是指,數十萬個波型嗎或是十萬個取樣點?
因為我的電腦上沒有灌DAQ DRIVER 所看無法看你的程式怎麼寫,不過以你的敍述來看可能其中有些部份的邏輯調整一下應該能解決你的問題,若是你需要的是連結的點,哪麼你可以一次把number of sample 設高一點,只要你的PC 的等級不要太低哪麼應該都是來得及送回完整的資料的.
[/QUOTE]
請問,number of sample的值要怎麼取決呢?
(比如說Sample rate可以依Nyquist定理來當作參考)
設太大時轉換時間會很久,那最少要設多少有沒有依據?還是只能Try and error?
[/QUOTE]
number of sample 可以決定你要取多長的時間,假如你的 Sample rate 是 10KS/s 哪麼,如果你取 10K 的點數,哪就正好是 1 秒.
坦白說,程式構想有點奇怪。
FOR LOOP應該是可以去除掉的?
除非原作有意做其他的處理。
在小弟資料擷取的經驗中,重要的大致上分為兩個方向,
控制與資料儲存分析。
若是重視控制,如儀器控制等,那麼通常回授(擷取)回來的資料量少,經過判斷與運算後做控制手段的應用。
若是重視資料儲存,那麼在回授(擷取)回來的資料量根據資料分析需求成比例,如溫度資料每秒鐘10筆算大量,但是心電圖資料每秒中可能需要1K的資料筆數。且在擷取過程中移除需要大量運算的元件,留到後端來處理,以保持資料擷取的穩定性。
若是重視即時演算,則需要簡化演算法後,將演算部分獨立為子VI後,利用多個VI共同處理,避免浪費擷取迴圈的時間,以增加擷取迴圈的速度。
至於資料量大的問題,可建議將資料分開存檔,並於整體程式完成後再行合併。
不過就經驗而言,LabVIEW似乎對於處理過大的檔案不擅長,因為讀檔時必須將大型檔案整個載入系統,會有一定的困擾。因此長時間檔案分開存也是解決方案之一。
同樣的在回圈中的暫存器也是無法放太多資料,否則回圈速度依舊會因為資料量增加而降低。增加回圈速度的方式記得在之前的文章有提到過,請去爬一下吧。
以上拙見,請指教。
to 艾爾:
您的分析真是不賴,小弟獲益良多
1. 此外您提到"若是重視即時演算,則需要簡化演算法後,將演算部分獨立為子VI後,利用多個VI共同處理,避免浪費擷取迴圈的時間,以增加擷取迴圈的速度。"
紅色部分小弟不太懂~不也是要等sub-vi執行完才能繼續順著data flow執行下去嗎?這樣會有差阿?
2.資料量大的話,除了您提的分開儲存方法,小弟爬過文,好像大部分前輩都使用data base方式進行存取,小弟最近也在學習中
懇請解惑,剛溫~
在這邊提到的REAL TIME,應用時其實有些實用性上的差距,端看使用者需求而定。
所謂的REAL TIME指的是即時性,意味著從資料輸入到資料輸出所需要的時間。
以個人接觸過擷取人體訊號而言,
理所當然0秒的REAL TIME是不可能做到的(沒有資料數據),
而計算心跳的REAL TIME與計算心率變異的REAL TIME與ECG波形資料分析的REAL TIME又不盡相同,
心跳的REAL TIME只需要穩定的3-5秒即可(過快沒有意義),心率變異則是1-2秒,ECG波形的分析則需要到100ms-250ms才能及時反應相當訊息。
因此一樣都是REAL TIME,所需要的定義時間不同,端看使用者需要多快知道輸出資料,與輸出資料重要性來決定。
又如工業上,監控系統從溫度控制的10秒更新到生產線的0.5秒鐘中斷處理都是屬於REAL TIME。
舉個誇張的例子,
在程式上:


這樣設計是常見的,但是無論中間是否有使用SUBVI,都會因為流程而延遲整體擷取與計算的動作,使程式週期為3.25秒。
若改成:


如此使用兩個VI,則使程式週期縮短為2秒,
這例子是誇張化,但是使用兩個VI同步作業,則可使擷取的VI專注於擷取,而將擷取所耗費的時間來用作計算,這是重要的。
最後,使用者可以調整擷取與運算相互配合的時間,使他們能夠變成可接受的REAL TIME,而非重複性的資料儲存與運算的程式。
以上拙見,請指教。
感謝艾爾的說明,還畫了區塊圖解釋,讓人一目了然
但小弟又出現新的問題了,就是使用兩個VI同步作業,是指
同時開啟並執行兩個主程式,然後再將第一主程式量測到的資料,傳送給第二主程式進行分析嗎?
如果是的話,那應該是利用global variable即可達到目的,
此外,在第一主vi執行時自動call出第二主vi並執行之方法可參考彈跳視窗
可參考這裡 又學到了一招了
對了,小弟爬文有找到Calling a VI by Reference的技術
是第一期電子報呢~http://www.labview.com.tw/forum/forum_posts.asp?TID=1244&PN=1
也是可以提高系統性能的好方法,但是比較偏記憶體最佳化方式而非程式同步執行之觀念
chansam38867.0670949074給你一個小建議
你可以試著朝資料存檔的方向去找問題
最近也是遇到這問題
但發覺是存檔的方式出錯了
修正過後就有得到改善
試看看,加油