兩個DAQ assistant(輸出/輸入)如何同步

在下labview新手請教…

我想利用兩個DAQ assistant(一個類比輸出, 一個類比輸入), 將一段有限訊號在DAQ卡上藉由ao port傳給ai port
不過兩邊的圖顯示的會不太一樣, 接收端有某程度的延遲, 甚至有時候是"超前"
想請問要怎麼將兩個DAQ assistant做同步呢?




以下是我的vi :
https://drive.google.com/file/d/0B0aTaSz31u9dZzI2aFF2UGdCUVk/view?usp=sharing

謝謝
ak082142950.9000694444

1

如果實驗室或公司有買版權,直接向NI應用工程師詢問polymorphic的同步sample

2
硬體層級的較高精確度同步,如果要自己網路上找,大致上關鍵字就是SSI這一類的字樣

3
如果自己只要做到軟體同步的層級,可以試試看Timed Sequence structure
但是每一顆Express VI本身都要吃掉一堆不定的時間,所以軟體層級同步了也不夠
4
另一種方法是打訊號的用連續方式N-Samples, Continuous,收訊號用連續的或單次抓完的
然後搭配Timed Sequence structure去小小的挪他的時間。但這通通都不是好方法。

5
最正確的還是找NI工程師要Polymorphic Sample,才是正確的DAQ控制方式

請問Polymorphic Sample是指labview help裡面那些範例嗎?

我有看到裡面有synchronization(同步), 不過他不是用daq assistant做的

請參考這個連結
http://www.edn.com/design/test-and-measurement/4333631/Polymorphic-VIs-in-NI-DAQmx-Simplify-LabVIEW-Graphical-Programming

的這段文字
The above shows the equivalent function implemented as an NI-DAQmx polymorphic VI, whereas the below shows the graphical LabVIEW code you need to produce a pulse train of finite length using traditional NI-DAQ VIs. (Click either image for a full-size image.)


的下面那張圖

那張圖就是NI-DAQmx polymorphic VI,然後要有兩組這樣的東西,設定在同一個時間一起開始(Start Task)。
這樣就可以擁有軟體層級(Software-level)的同步程度。
要達到硬體層級(Hardware-level)的同步程度,就是要SSI。建議這些東西都找台灣NI的應用工程師詢問。NI卡片的售價都是包含技術支援的,尤其是LabVIEW軟體的部分。


MingYen42951.8121759259
請問您指的是像下面這樣的寫法嗎

另外想請問一下, 對於我要做類比輸出和輸入同步, 軟體同步和硬體同步需要做到哪個程度
謝謝

沒錯 這個就是軟體層級同步的範例


你可以看出這個例子中Dev1/ai0還是早了那麼一點開始,然後再運行Dev1/ao0。
這兩個都是以Continuous運作,所以想法上是讓AI先開始,然後再讓AO慢一點開始。
這種同步方式,大致上會相差個2~20ms。

系統狀況差不多時,這個數值不會變太多,但不同電腦以及不同的CPU loading狀態,這個時間差是會變的。
唯一可以確定的是,這樣子的寫法AI會比AO早開始。可以讓你控制AO的資料能落在AI第一輪的範圍裡,並且可以看出delay了多少。但卻無法直接修正這個Delay。
要修正這個Delay,可以把AO輸出的資料稍作Phase Shift等。但是因為這個時間差隨著系統而不同,所以這個Phase Shfit也必須要能被微調(Tune)。


這邊直接跳到你需要的東西來說明。

硬體同步的關鍵兩點在於:[1]同時鳴槍起跑,但是隨著時間會越差越多。[2]以同樣的Clock節奏運作,才不會隨著時間越差越多。
因為是同一張版卡的AIAO通常是吃同一個on-board clock,所以硬體同步的兩大特點中的[2]通常都已輕易地滿足。
剩下的[1],
你只要將AI/AO都改為External Digital Trigger,然後讓他們一起吃一個External Digital Trigger同時起跑即可!
基本上你上面的例子中只要幫AI與AO都加上外部數位觸發設定,開始後他們就都會進入等待Trigger的狀態,然後一起吃Trigger鳴槍起跑。

請使用差不多同樣長度的電線,避免ns等級左右的時間誤差。
怎麼做到外部數位觸發設定一樣詢問NI的應用工程師,關鍵字是AI+AO External DIgital Trigger,單張卡片不需要提及SSI。
你的例子大概可以保證做到10~100ns的起跑誤差,然後同步誤差會是0.1~1.0ns的等級。

比較熟NI卡片的版友甚至有可能可以參考你的卡片型號,設定好External Digital Trigger後,直接給出一個可以跑給你看的模擬卡片結果。
*********************************************
想做類比輸出和輸入同步,尤其是一些聲音或電訊的檢測
就要做到硬體等級的同步。
硬體層級的同步,一般容易做到的是[1],一起吃外部數位觸發起跑。可以吃同一個External Digital Trigger,也可以從SSI的路線傳遞,都是一種選擇。
如果是不同張的板卡,要做到Clock同步的[2],就會比較困難。SSI是一種選擇。
MingYen42955.7752546296

先謝謝您的詳細解說
依您所說的External Digital Trigger, 想請問寫法改成像下面這樣正確嗎?
DAQ卡上除了AO接到AI腳位之外, 在觸發部分是把PFI0和+5V相接
不過執行之後似乎沒有接到輸入訊號 (如下面的front panel圖)



關於這樣的接法我是看NI網站的trigger教學, PFI和+5V相接可達到觸發效果,
不過這裡我很疑惑, 因為+5V不是是一個定值的訊號嗎, 怎麼會有rising或falling去做trigger呢?
還是說我使用的daq卡 NI USB-6341沒有數位觸發的功能呢?


P.S. 我的VI  https://drive.google.com/file/d/0B0aTaSz31u9dQWtxbWdmSFRVX1E/view?usp=sharing

資訊很齊全 方向應該是對的,但是我沒很多時間看,建議可以試試PFI0先接觸AIGND,然後再碰觸5V

如果有其他方式可以把AO -> AI的訊號中間用示波器什麼的拉出來看,就可以先知道有沒有打出AO了

[1] 通常這時候有問題,我們會回歸到AI External Digital Trigger與AO External Digital Trigger
[2] AI External Digital Trigger預定讓他接收個弦波或方波,有觸發沒觸發立即就會知道 不動->動
如果你在程式運行過程中,看看AI Read那個眼鏡,有沒有回傳資料還是停著不動,就會知道AI有沒有被觸發,或是卡在更前面的哪裡,或是早就有Error Code出現。

[3] 5V那個你也可以用示波器去了解他的行為。這些都是需要確認的。比直接從大統合程式去找還方便切割問題。
如果這個5V被叫做"觸發電源",那麼可能有個軟體開關方式可以去控制他的High/Low

各別使用單項功能去嘗試是不是都有工作 (也就是說上面的[1][2][3])
然後再回到同時控制AI/AO的程式裡面

程式方面,我建議把你的waveform的波形生成迴圈,利用資料流的順序控制先準備好以後,再開始各種的開卡/設定/寫入

以避免你的AI的Start Task (綠三角形)都已經開始了,但是AO的Analog Wfm 1Chan NSamp都還沒等到有資料可以寫入。

但如果是這種情況,“在正確的觸發後”,AI還是會正確抓完資料,AO還是有打出資料(示波器會觀察到),只是AI與AO之間的時間差會比較大。不能是沒打出AO資料。



另外,你的程式若使用軟體觸發Software Trigger,這代表通常AI與AO會在Start Task (綠三角形)就會被開始了
這時候你的程式可以正常工作嗎?
正常工作是指有接收AI,例如你把5V給他他就秀5V,AIGND給他他就秀0V;有打出AO示波器可以看到,只是時間序上相差的比較多。

[1]確認觸發電源5V的行為或怎麼控制,通常在Pin腳上面找到的,很可能真的就是DC 5V,所以如你所顧慮的,可以用AIGND -> 觸發電源5V 來造出Rising Edge。
[2]確認AI External Digital Trigger能不能以正常的Rising Edge TTL訊號觸發才啟動AI
[3]確認AO External Digital Trigger能不能以正常的Rising Edge TTL訊號觸發才啟動AO,示波器要能看到。如果不行要回去看AO Software Trigger
[4]確認組起來後的這個程式,Software Trigger下,AO到底有沒有被打出來(給示波器看),AI到底有沒有正常收(任何訊號都可包含DC 5V或Sync TTL)。

程式面,波型生成迴圈可能要10~100ms左右,要留意光是Software Trigger下,非常可能發生AO還在波型生成迴圈,AI已經被Start Task
如果加入等待External Digital Trigger,就更不清楚了,因此測試過程務必讓波型生成發生在開卡之前,未來再去優化程式這個部分。

所謂的資料流控制可以用單禎的Flat Sequence Structure把開卡與這個迴圈框在一起,那麼AI開卡,AO開卡,與資料生成會互相等待一起結束,再往後繼續進行。
MingYen42965.4902662037

先謝謝您的回覆

後來我將程式執行後再將PFI0碰觸+5V, 嘗試製造出rising後AI就可收到資料
那我猜之前的問題可能是出在+5V只有DC, 無法啟動觸發
不過AI和AO也還是有一筆資料的延遲(如下面front panel圖), 不知道這是不是因為如您之前所說的AI會比AO稍微早一些開始所造成? (下圖紅圈處)
如果是的話這樣該如何修改呢?  (下圖是舊圖, 波型生成迴圈和剩餘其它部分已分別放於兩個Sequence Structure內)
   我有嘗試將AI的start task往後移或AI/AO的trigger移到start task後, 不過都會有ERROR
   


  graph2是波型生成迴圈產生的圖形(即AO將輸出的資料, 共五筆資料點), Acquired data為AI取得的資料
  反覆測試後Acquired data每次的結果皆是後四點不會改變, 第一筆資料隨意跳動的情況 (看起來是波形被往右shift一筆資料)



真的不得不稱讚一下,你很適合做DAQ這方面的事情,包含資訊的蒐集,實際的執行效率,以及測試問題的方式。


說明幾個項目
[1] 我先前提及AI比AO早開始,應該是建立在「AI與AO都是Software Trigger」(而非使用External Digital Trigger的情形)。我的文章有時候不夠精簡。
因為AI Start Task的三角形一執行,就同時進行了「所有的設定+Software Trigger」了,然後才傳出Error Line。
緊接著才輪到AO Start Task。這時候的時間差距最短會是AI Start Task=>AO Start Task的LabVIEW工作時間,最長則隨著電腦CPU不同而不一樣。

[2] 測試項目
這個程式在External Digital Trigger後,AO有沒有正確到達+1V,並且停止在+1V? 這是一個雖然簡單但必須要測試的關鍵。
建議在Read.vi執行後,AI Clear Task與AO Clear Task之前,加一個空的等待while迴圈,直到User按下一個stop按鈕。

因為Read.vi原本在等待Trigger,一被Trigger之後,抓滿AI[0]~AI[4],傳出Error Line,會立即去執行AO Clear Task。
AO被Clear Task之後,有可能停在最後的電壓0.8V or 1.0V,也可能被拉到接近0V。

[3] 上述內容也可改用另一種方法達成。承[2]觀念,
「單獨」增加AI的Sample per channel到5->6或5->10,雖然AO硬體的5個點應該已經打完了,但AI硬體還會繼續多抓幾個點。
DAQ卡片自然會等到AI抓完,才讓Read.vi送出Error Line並進行後面AO Clear Task這些事。
這也是一個觀察AO到底後來有沒有達到1.0V的方式。


[4] (試一下)嘗試同時增加AI與AO Sample per channel,例如增加到10000或上限,看看是不是如你所觀察的,始終只有第一個點會浮動。
這些結果已經暗示著,硬體設計上,同樣一個外部數位觸發進來,AO很可能就是慢一個Sample點開始。但是不知道為什麼硬體上他要等這麼一下。

[5] (試一下)逐步(大量)增加Sampling Rate,應該可以觀察出誤差量是一個固定時距(Hardware時間誤差),還是一律是一個採樣點 (Firmware與Driver的控制行為)。
目前看起來,很可能是後者,也就是也許即便Firmware知道AO吃了Trigger,「如果同時有AI的任務在進行」,AO就是愛晚一個Sample的時間才送資訊。

正常的DAQ卡片設計AI與AO頂多相差幾個On-Board Clock for FPGA(Firmware)。
以80MHz on-board clock為例,FPGA的一個指令度過的clock才1.25ns,同樣接到觸發後,AI與AO的處理頂多相差幾個指令的時間。而不該是1個Sample的時距。


[6] 把你的Trigger訊號送給AI看,同時比對AO0/AI0/AI1(Trigger時間)
增開一個AI1通道,方法應該是修改 ai0 => ai0:1。把你的Trigger訊號同時接給ai1去給他顯示。
注意單通道改成多通道,可能有幾個地方要留意。例如Analog Wfm 1Chan NSamp可能需要改成NChan。

這個目前預期會看到AI0第一個點是隨機電壓,第二個點拉下來是0V。
AI1第一個點應該是已經過rising edge觸發後的TTL High,
這樣比對起來,就可以指出rising edge都已經發生之後,還要隔一個採樣點,AO0=>AI0才真正看到AO輸出。

[7]
可以嘗試把你的AI設定回Software Trigger,2個通道
(AI0與AI1,然後採樣時間長一點,例如3倍於AO採樣點數,甚至可以久到夠等你的手動外部數位觸發完成,或是用連續擷取的AI)。
AI的採樣率可以考慮高一些,這個測試可以在AI盡可能最大化採樣率的條件下做。

這個測試可以確認前面一直暗示的某個假設:
「同一張卡片的AI與AO都吃到外部數位觸發的情況下,這張DAQ卡片的設計,會發生某個偏長的時間延遲(遠長於幾個板卡Clock)。」
因為這時候AI已經不跟著AO一起等外部數位觸發了,AO應該要有自己的主見,吃了觸發,就該辦事。沒理由有偏長的時間延遲。

2通道AI會因為是Software Trigger,所以會先跑,這時候要做的目標是觀察「吃了Trigger後,觀察到底AO0跟Trigger訊號,會相差多少」。
也說不定會意外發現AO其實是吃Falling Edge什麼的特殊硬體規格。


[8]
最後,是連我也還有些不確定的部分。一般說來,為了符合Nyquist定理,在同一張卡片上做AI與AO觸發同動,可能得把AI的Sampling Rate提高為AO Updating Rate的兩倍或以上。雖然這個對於觸發了AI後,為什麼AO硬是要慢1 sample = 0.001s,不一定能有所幫助,但這個部分是後續需要找人討論且注意的。


MingYen42968.7668287037

如果你有還不錯的觸發源(TTL Pulse with both rising edge and falling edge),也可以採取AI吃rising edge與AO吃falling edge等設定方式。


目前的情況,AO真的就是愛比AI慢那麼一點,也許在這個程式中看起來是差1個Sample,但事實上是Firmware處理上AO就只慢一點點的結果。
只是AI做完後,可能10ns~10us的時間,AO才動作
如果是這樣,AI吃rising edge與AO吃falling edge或AI吃falling edge與AO吃rising edge可以提供你做一點時間差上的控制。

否則,就只能採用自己讓AI多抓一些些,然後一律移掉AI第一點的方法了。
在試過前一篇的方法去了解他的行為之後,就可以選定適合的策略。

額外的,AI擷取資料,也需要硬體電路的充放電時間。雖然這個時間通常很短,但有時也是設計者要注意的。
MingYen42968.7659953704

您過獎了, 我只是做一些簡單測試而已, DAQ背後的資料流和各種觸發概念等等還不是很有頭緒…

非常謝謝您這麼仔細的解答

我試著讓AI多取一倍多的點, 結果如下圖 : 
看起來真的是晚一個點才開始動作 , 另外我也發現第一點的值不是隨意出現的數值, 只會出現資料產生迴圈出現的那五種數值

另外"同時增加AI與AO Sample per channel"和"增加Sampling Rate"的結果也都是只延遲一個sample點
這樣是不是代表是由DAQ的控制行為所造成的呢?
這樣感覺解決方法如您所說只能讓它多取一點後再刪掉第一點

另外想再請教, 所謂Software Trigger是把我程式碼中那兩個 DAQmx Trigger 刪掉就是了嗎?
反之加上去就叫External Digital Trigger嗎?

*** 假設不是FW層級問題 ***
[1] LabVIEW層級沒有正確AO Clear Task。試試看在AO Clear Task前面加一個Stop Task。

試著確認在AO Clear Task前後用while+stop button迴圈等待時,AO停在哪一個點。或意外地呈現0V->1V的週期性輸出(Continous)。

[2] 試試看AI的點數增加,但是AO不要增加。這個目的也是要看清楚AO的最終行為。
[3] 如果AO會停在1V或特定的點,觀察這個電壓值跟下一輪開始的浮動電壓是不是一樣。這個目的是考量AO最後的殘存電荷停留在AO0與AI0的Pin上。然後AO又偏偏慢半拍。這些測試往電壓殘留但不一定的方向去考慮。

*** 假設是FW層級問題 ***
[1] AO保留Finite。單獨把AI改成Software trigger且是Continuous,同時擷取AO訊號與Trigger訊號。
需要參考其他Sample,把AI Trigger設定移除。讀取的Read.vi部分需要增加迴圈框起來。
[2] 想辦法確認AO吃的是Falling Edge還是Rising Edge。

其實測試到這邊,已經快要可以確定這是韌體Firmware的設計bug了。
一些小確認只是要把握之後AI要捨棄第一個點的資料,並且把這些資訊加註在程式中。