在寫 Windows上的Modbus RTU Master應用程式, 主要就是監控某些暫存器跟必要時寫入某些數值到對應的暫存器內,對於GUI 程式來說一種簡化的做法是開一個定時器定時輪詢所需要的值,然後再輪詢前檢查是否有寫入的工作在執行中,若執行中先忽略這次輪詢。畢竟Modbus RTU 是透過Serial Port 是一問一答的設計,而且有可能是RS485 的環境,是一個半雙工的設計,所有動作都必須等待上一個動作完成才行,可以說它就是一個獨佔資源。

複雜一點的作法就是透過Command Pattern 建一個Workitem Queue 將要執行的動作透過包裝成為一個Command 然後推入Workitem Queue 裡面,然後透過一個背景執行緒從該Queue把要做的工作取出,然後針對該命令實際操作Serial Port,這樣程式設計時就不需要考慮多個UI控制項 對Serial Port 產生資源爭奪的問題。

從 .Net 4.5 開始引入 Dataflow 網路的設計;其中就有BufferBlock/CancellationTokenSource 這樣的設計提供了Workitem queue 的功能,讓實現這個功能變得簡單很多。只需要定義好Command 類別,與處理的執行緒相關工作即可。不在需要重頭設計一個Queue 考慮多執行緒如何使用。

ref. https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-implement-a-producer-consumer-dataflow-pattern


This free site is ad-supported. Learn more