工控系統設計(六)採集/反控調度系統設計

六、採集/反控調度系統設計

在第一部分,我們提到了數據採集所面臨的問題。穩定、併發、時延少、不串碼,是調度系統需要解決的問題。

串行讀寫是最穩定的一種讀寫方式。遍歷設備,把每臺設備需要採集的命令發送,得到回覆之後,再轉到下一臺設備。這種方式的缺點是速度慢。如果設備數量大、因子多,某臺設備的響應速度慢,那麼一個採集循環的時間就會很長。

另一種方式是每一個鏈路配一個線程,因爲不同鏈路是可以並行讀寫的。這裏需要考慮多設備共用串口的問題。而最大的問題是,當設備數比較大時,要求的線程數也大,這樣的資源耗費是巨大的。

我們採用一個線程,解決多設備採集、反控的調度問題,儘可能做到並行、無需等待。

定義一種這樣的結構體:

發送數據

發送/接收

接收回調函數

預期執行時間

超時時間

建立一個列表,存放上述的結構體。採集定時觸發,反控由用戶觸發,每次觸發,都會向列表中插入若干個結構體(如果發現列表中有相同鏈路相同設備相同數據,則不插入)。採集的預期執行時間較長,反控的預期執行時間較短,甚至直接爲0。發送/接收狀態一開始爲發送。

調度線程是一個循環,隔一段時間執行一次操作。每一次操作,先把列表按預期執行時間進行排序,把最需要執行的放在前面。比較每一項的預期執行時間與當前時間,如果已到預期執行時間,則處理結構體。

如果結構體的狀態爲發送,檢查相同鏈路是否有未接收的結構體。如果有,則跳過。如果沒有,則發送數據。把發送/接收狀態改爲接收。

如果結構體的狀態爲接收,嘗試接收數據。如果能接收數據,調用回調函數,並刪除此結構體。如果接收不到,檢查當前時間與超時時間。若未超時,跳過。若超時,把此結構體刪除。

發佈了79 篇原創文章 · 獲贊 67 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章