2008-07-28 4 Band DC 程式, 檔案格式及監控協定
黎煥欣 Li Huan Hsin
這次的 DC 因為四個 band 一起作, 而且最後決定是由一台單獨的 PC 做資料收集的動作. 所以 DAQ 程式有大幅的修改, 而且根據前一個版本的經驗, 會有丟資料的情形. 而且 DAQ 的負擔非常重, UI 部份不能再放在 DAQ 內, 而用另外一個電腦在跑另外一個程式來監看 real time 的 DATA. 程式名稱將再修訂. 目前 (07-28) 定出來的版本
FPGA_Program_Panel -> 寫入及監看 FPGA 狀態的程式
DAQ_Srv -> 資料收集主程式
DAQ_Moni -> 即時監看程式
-------------------------------------------------------------------------------------------------------------------------
FPGA_Program_Panel 為寫入各 FPGA bits 檔的程式, 它的 UI 已經說明操作的方法.
DAQ_Srv 是資料收集的主程式, 它執行後可以分辦出那些 FPGA 有否上線. 但若是開始收集資料, 則會產生一個固定大小的 binary 檔. 以供後來的分析程式使用.
DAQ_Moni 則是由 DAQ_Srv 處提供的一小部份資料, 顯示在 GUI 上, 讓操作者對當時觀測到資料有初步的概念. 也可發現明顯的操作問題.
------------------------------------------------------------------------------------------------------------------------
DAQ_Srv 輸出檔案格式
在它的 10Hz Sampling 選項勾起來了, 由單晶片硬體產生的 10Hz pulse 就會進入系統, 驅動所有的 Correlator 板送出資料, 每隔 0.1024 sec 每個板子會送出 264 bytes 的資料. 當系統 4 個 band 都在的時候, 有 16 個 Correlator 板, 每秒送約 10 次資料.
理論上, 照上面的計算, 每一次取樣, 只要 128(DAQ 程式加的 HEADER) + 264 x 16 = 4352 bytes 的資料. 一秒鐘就是 43520 bytes 存到硬碟就好了. 但以前的經驗, 因為我們的資料是用 USB-Sserial port 傳送回來的. 雖然它是保證傳送, 但資料到達的時間及多少卻不一定, 所以在 0.1 sec 的操作時間中, 不一定都能收到完整的資料. 或是要到下一次收資料時, 它才同時拿到這一筆和上一筆的資料. 所以解決的辦法就開更大的緩衝區, 以空間換取時間. 方法 (也就 DAQ dump 出來的檔案格式) 整個操作流程如下:
一, 當硬體產生單一的取樣脈衝 (每隔 0.1024 秒就有一個就是了)
二, 這個脈衝會經由硬體分佈線路, 送至所有的 Correlator 板 (後稱 Co 板), 通知它們把那一個瞬時的資料備妥並傳出來.
三, 同時這個脈衝會送到一個單晶片, 並由它經過 USB-Serial 界面通知 DAQ PC 現在有取樣脈衝. 因為它只有一個位元組, 而且它的佈置 topology 在 USB layer 中比較上層. 原則上它會先送到 DAQ PC.
四, DAQ 程式就以這個信號為註記, 將這一次的時間定為取樣時間, 順便將 DAQ time tag 算出來. 它應該要與 Co 板送出的 Time Tag 要一樣. 同時也建立這一筆 Recoder Header 的前半部. 主要的資訊就是如 2008-07-26 13:45:23 56779.345 00003A4 000560 .... 共 96 位元組的記錄, 都是與時間相關的, 後面有一堆空白, 預留未來的用途.
五, 在經過 0.05 秒後, DAQ 程式會監看所有 Co 板資料埠的緩衝區內的資料數目. 就大部份的情形來說, 每個緩衝區會有 264 位元組的資料. 但有時會沒有或少於 264. 此時沒傳到的資料就會留到在下一次傳送, 所以下一次緩衝區的資料就不是 264 而會更大了. 我們預留了 512 位元組的緩衝區, 若有一次沒有傳到, 則經過三次的接收, 它就可以回到一次接收 264 位元組的情況了. 所以不管資料是多是少, 它都將資料讀入預先準備的 512 bytes 的程式緩衝區內. 當然最多只讀 512 位元組, 留下的下次再讀.
六, 有 16 個 Co 板, 所以就有 16 個目前緩衝區內可讀取的的位元組數目, 這些數字就存放在 Recoder Header 的後端, 共 32 個位元組. 連前面的 96 位元組, 總共 128 位元組. 就是一個完整的 Recoder Header. 連同 16 個 Co 板的 512 bytes 的緩衝區 8192 bytes + 128 = 8320 bytes/record. 以每秒 10 次的速率寫到硬碟中. 至於資料的重組則讓後置程式處理...
--------------------------------------------------------------------------------------------------------------------------------------
DAQ_Moni 程式. 原則上在另外一台電腦上跑 GUI, 顯現出當時的畫面.
本來是希望 DAQ 程式的 83K/sec 的資料用 UDP dump 出來, DAQ moni 程式就可以擷取必要的資料來呈現. 但發現網路的即時性及資料量似乎是沒有那麼好. 所以挑資料的工作決定給 DAQ_Srv 做, 而且還是使用 TCP 連線. 它們之間的互傳資料格式大抵如下:
1. DAQ_Moni -> DAQ_Srv "XB03 006 B11 010"
表示現在要監看的是 Co 3號板 index 6,7 的兩組資料 (實部與虛部一對) 及 Co 11 號板的 index 10,11 的一對資料.
2. DAQ_Srv -> DAQ_Moni 在 10Hz 取樣被打開, 而在連線狀態下時, 每一次的 Co 資料取樣, 則會送出如下的字串給 DAQ_Moni
"XB03 006 B11 010 34456.612 0001456 05432 61043 00093 00971"
前面一堆與 Moni 設定的字串一樣, 與 Moni 表示後面傳送的資料確實就是這些. 再來是 Timer 值, 表示取樣的時間 (以秒計至當天午夜至取樣的時間), time tag, 四組十進位資料. That's all. UI 靠這些資訊就可以畫圖了....
------------------------------------------------------------------------------------------------------------------------------------