六、採集/反控調度系統設計
在第一部分,我們提到了數據採集所面臨的問題。穩定、併發、時延少、不串碼,是調度系統需要解決的問題。
串行讀寫是最穩定的一種讀寫方式。遍歷設備,把每臺設備需要採集的命令發送,得到回覆之後,再轉到下一臺設備。這種方式的缺點是速度慢。如果設備數量大、因子多,某臺設備的響應速度慢,那麼一個採集循環的時間就會很長。
另一種方式是每一個鏈路配一個線程,因爲不同鏈路是可以並行讀寫的。這裏需要考慮多設備共用串口的問題。而最大的問題是,當設備數比較大時,要求的線程數也大,這樣的資源耗費是巨大的。
我們採用一個線程,解決多設備採集、反控的調度問題,儘可能做到並行、無需等待。
定義一種這樣的結構體:
發送數據 |
發送/接收 |
接收回調函數 |
預期執行時間 |
超時時間 |
建立一個列表,存放上述的結構體。採集定時觸發,反控由用戶觸發,每次觸發,都會向列表中插入若干個結構體(如果發現列表中有相同鏈路相同設備相同數據,則不插入)。採集的預期執行時間較長,反控的預期執行時間較短,甚至直接爲0。發送/接收狀態一開始爲發送。
調度線程是一個循環,隔一段時間執行一次操作。每一次操作,先把列表按預期執行時間進行排序,把最需要執行的放在前面。比較每一項的預期執行時間與當前時間,如果已到預期執行時間,則處理結構體。
如果結構體的狀態爲發送,檢查相同鏈路是否有未接收的結構體。如果有,則跳過。如果沒有,則發送數據。把發送/接收狀態改爲接收。
如果結構體的狀態爲接收,嘗試接收數據。如果能接收數據,調用回調函數,並刪除此結構體。如果接收不到,檢查當前時間與超時時間。若未超時,跳過。若超時,把此結構體刪除。