問題條件:
1.每隔5秒擷取資料一次,每小時共計紀錄720筆秒記錄資料
2.每隔1小時將那720筆秒記錄資料做計算,算出平均值後記錄,每日共記錄24筆時記錄資料
3.每日將那24筆時記錄資料做計算,算出平均值後記錄成日記錄資料
4.每隔30日將日記錄資料自動存檔,並重新開始記錄
5.按下"停止"鈕關閉程式時,先將目前的日記錄資料存檔再關閉
問題條件清楚,但要怎麼寫很傷腦筋,所以先畫了個流程圖來分析整個動作流程(下圖)
從流程圖來看不是順序控制結構,而是有條件的跳躍控制結構。因為沒有指明資料擷取的硬體類型,為了儘量避免資料擷取的程式影響,決定把資料擷取的程式排除在控制結構程式之外
整個程式決定要採用所謂"狀態機"這類較高階的寫法,資料擷取的程式也決定丟給控制結構程式間接控制,找一找LabVIEW內有個範本適合這個題目,就用那個範本來修改
在LabVIEW開新檔時,選擇Master/Slave Design Pattern(主從架構)這個範本來開新檔
這個範本的特點是:主架構迴圈若沒有訊號給從架構迴圈,則從架構迴圈為待機狀態;關閉主架構迴圈則從架構迴圈也自動關閉
完成的整個程式架構如下:上半的主架構迴圈是條件控制結構,下半的從架構迴圈是資料擷取,所有狀態的初始化全放到最左邊
初始化分成幾個區塊:
最上方:預先規劃好秒日時記錄資料的陣列大小還有計次的初始值,使用移位暫存器傳遞資料
中間:時間控制程式和動作控制程式的初始值,動作控制是用狀態字串加上移位暫存器加上Case元件來達成;自動存檔部分使用系統時間格式化成年月日時分的字串輸出為檔名
最下面:設定主架構送出的控制訊號類型為布林狀態,當上面的動作控制迴圈有送出訊號時,底下資料取樣迴圈才會動作,並在動作完畢後自動待機
資料擷取的傳遞資料類型為數值,這裡使用隊列架構傳遞資料,這裡也可使用區域或全域變數取代。使用隊列架構的目的是要確保有擷取到資料
程式最下方資料取樣迴圈:設定上接收主架構迴圈的訊號動作,主架構迴圈沒有訊號時不會動作,有訊號時會先判斷有沒有錯誤?有錯誤則停止從架構迴圈,沒有則繼續執行後續程式
當主架構迴圈停止時則會送出一個錯誤訊號,藉著這個訊號關閉從架構迴圈
資料擷取是透過DAQ寫入隊列架構,上方的主架構迴圈若沒有收到訊號則處於等待狀態
這樣的寫法有一定的風險:好處是確保一定有資料被擷取,壞處是若沒有擷取到資料或程式沒處理好,會變成主架構迴圈一直在等待資料使程式當機,這部分的錯誤訊息有硬體可試時再另外處理
上方動作控制迴圈:
首先依初始化資料進入秒記錄狀態(默認狀態):
迴圈中下方是計時部分,每5秒送出一個訊號,使用Boolean Crossing PtByPt.vi元件是要避免訊號連續觸發
下方的Case元件控制送出一個訊號給資料取樣迴圈擷取資料,上方的Case元件則等待資料取樣迴圈送回資料記錄。上方若不使用Case元件會變成動作控制迴圈一開始就在等待資料取樣迴圈送回資料,這樣會造成上下兩個迴圈資料流互鎖而當機
中央動作控制使用兩個判斷條件:第一有優先權的是Stop按鈕狀態,當Stop按鈕按下時,先進入存檔狀態存檔後,再進入關機狀態停止程式。第二是判斷秒記錄資料是否已達720筆?是的話就進入時記錄狀態,否的話就保持秒記錄狀態
第二是時記錄狀態:
程式上方是將秒記錄算出平均值後寫入到時記錄內,同時將秒記錄資料再初始化還原
中央判斷時記錄資料是否已達24筆?是的話就進入日記錄狀態,否的話就跳回到秒記錄狀態
第三是日記錄狀態:
程式上方是將時記錄算出平均值後寫入到日記錄內,同時將時記錄資料再初始化還原
中央判斷時日記錄資料是否已達30筆?是的話就進入存檔狀態,否的話就跳回到秒記錄狀態
第四是存檔狀態:
以系統時間為檔名自動將日記錄存檔,同時將日記錄資料再初始化還原
再來就是判斷是否有關機訊號,是的話就進入關機狀態,否的話就跳回到秒記錄狀態
最後是關機狀態:
送出訊號停止迴圈,當動作控制迴圈停止後,資料取樣迴圈跟著停止
留言列表