close

問題條件:


1.每隔5秒擷取資料一次,每小時共計紀錄720筆秒記錄資料


2.每隔1小時將那720筆秒記錄資料做計算,算出平均值後記錄,每日共記錄24筆時記錄資料

 

3.每日將那24筆時記錄資料做計算,算出平均值後記錄成日記錄資料


4.每隔30日將日記錄資料自動存檔,並重新開始記錄


5.按下"停止"鈕關閉程式時,先將目前的日記錄資料存檔再關閉

 


問題條件清楚,但要怎麼寫很傷腦筋,所以先畫了個流程圖來分析整個動作流程(下圖)

20120315-11  

 

 

從流程圖來看不是順序控制結構,而是有條件的跳躍控制結構。因為沒有指明資料擷取的硬體類型,為了儘量避免資料擷取的程式影響,決定把資料擷取的程式排除在控制結構程式之外


整個程式決定要採用所謂"狀態機"這類較高階的寫法,資料擷取的程式也決定丟給控制結構程式間接控制,找一找LabVIEW內有個範本適合這個題目,就用那個範本來修改


在LabVIEW開新檔時,選擇Master/Slave Design Pattern(主從架構)這個範本來開新檔


這個範本的特點是:主架構迴圈若沒有訊號給從架構迴圈,則從架構迴圈為待機狀態;關閉主架構迴圈則從架構迴圈也自動關閉

20120315-10  

 

 

完成的整個程式架構如下:上半的主架構迴圈是條件控制結構,下半的從架構迴圈是資料擷取,所有狀態的初始化全放到最左邊

20120315-12  

 

 

初始化分成幾個區塊:

 

最上方:預先規劃好秒日時記錄資料的陣列大小還有計次的初始值,使用移位暫存器傳遞資料

20120315-01  

 

 

中間:時間控制程式和動作控制程式的初始值,動作控制是用狀態字串加上移位暫存器加上Case元件來達成;自動存檔部分使用系統時間格式化成年月日時分的字串輸出為檔名

20120315-02  

 

 

最下面:設定主架構送出的控制訊號類型為布林狀態,當上面的動作控制迴圈有送出訊號時,底下資料取樣迴圈才會動作,並在動作完畢後自動待機


資料擷取的傳遞資料類型為數值,這裡使用隊列架構傳遞資料,這裡也可使用區域或全域變數取代。使用隊列架構的目的是要確保有擷取到資料

20120315-03  

 

 

 

程式最下方資料取樣迴圈:設定上接收主架構迴圈的訊號動作,主架構迴圈沒有訊號時不會動作,有訊號時會先判斷有沒有錯誤?有錯誤則停止從架構迴圈,沒有則繼續執行後續程式


當主架構迴圈停止時則會送出一個錯誤訊號,藉著這個訊號關閉從架構迴圈


資料擷取是透過DAQ寫入隊列架構,上方的主架構迴圈若沒有收到訊號則處於等待狀態


這樣的寫法有一定的風險:好處是確保一定有資料被擷取,壞處是若沒有擷取到資料或程式沒處理好,會變成主架構迴圈一直在等待資料使程式當機,這部分的錯誤訊息有硬體可試時再另外處理

20120315-04  

 

 

上方動作控制迴圈:


首先依初始化資料進入秒記錄狀態(默認狀態):


迴圈中下方是計時部分,每5秒送出一個訊號,使用Boolean Crossing PtByPt.vi元件是要避免訊號連續觸發


下方的Case元件控制送出一個訊號給資料取樣迴圈擷取資料,上方的Case元件則等待資料取樣迴圈送回資料記錄。上方若不使用Case元件會變成動作控制迴圈一開始就在等待資料取樣迴圈送回資料,這樣會造成上下兩個迴圈資料流互鎖而當機


中央動作控制使用兩個判斷條件:第一有優先權的是Stop按鈕狀態,當Stop按鈕按下時,先進入存檔狀態存檔後,再進入關機狀態停止程式。第二是判斷秒記錄資料是否已達720筆?是的話就進入時記錄狀態,否的話就保持秒記錄狀態

20120315-05  

 

 

第二是時記錄狀態:


程式上方是將秒記錄算出平均值後寫入到時記錄內,同時將秒記錄資料再初始化還原


中央判斷時記錄資料是否已達24筆?是的話就進入日記錄狀態,否的話就跳回到秒記錄狀態

20120315-06  

 

 

第三是日記錄狀態:


程式上方是將時記錄算出平均值後寫入到日記錄內,同時將時記錄資料再初始化還原


中央判斷時日記錄資料是否已達30筆?是的話就進入存檔狀態,否的話就跳回到秒記錄狀態

20120315-07  

 

 

第四是存檔狀態:


以系統時間為檔名自動將日記錄存檔,同時將日記錄資料再初始化還原


再來就是判斷是否有關機訊號,是的話就進入關機狀態,否的話就跳回到秒記錄狀態

20120315-08  

 

 

最後是關機狀態:


送出訊號停止迴圈,當動作控制迴圈停止後,資料取樣迴圈跟著停止

20120315-09  

arrow
arrow
    文章標籤
    記錄
    全站熱搜

    未出師的小工程師 發表在 痞客邦 留言(4) 人氣()