1. 程式人生 > >工控機上位機軟體的開發歷程(二)

工控機上位機軟體的開發歷程(二)

儀器歸一化設計

這是具體內容的第一篇,我們先來講述儀器的歸一化設計。

儀器是各種功能都有的,我只舉我們在環境監測這方面所用到的儀器。我們要測試水是不是有汙染物質,汙染到什麼程度,我們要測試水體的高錳酸鹽指數、氨氮、總磷、總氮等值。我們的站房有一個後備電源,我們要知道市電是否斷電了,是否在用備用電源。我們的站房是有空調的,我希望知道站房的溫度和溼度,於是就有了一個溫溼度計。我們可能還會有流量計、DTU、數採儀等儀器。這些儀器跟工控機的連線也不盡相同,有的使用序列線,有的使用網線。用網線的儀器,有的作為客戶端,有的作為服務端,有的使用UDP。總之,這些儀器的通訊協議是五花八門的,通訊鏈路也是有區別的。

但我們需要對儀器做出歸一化設計。

其實無論儀器有什麼功能,工控機對儀器的操作無非就兩個:讀和寫。讀的話,可能是讀到測量的值、儀器的狀態等;寫的話,就是啟動儀器測量、修改儀器的引數等。而讀和寫的操作,都是通過傳送和接收完成的。雖然通訊協議各不相同,但我們總是可以把傳送和接收的內容轉化為最基礎的位元組流。要傳送怎樣的位元組流,接收到的位元組流如何解釋,就要根據儀器的特性去定義了。

根據這樣的特點,我們為所有儀器定義了一個基類,它包含了傳送位元組流和接收位元組流兩個方法。而所有儀器類,都繼承自這個基類。

每個儀器特定的類,只需要完成拼裝傳送的位元組流,和解析接收的位元組流即可,它不需要理會如何傳送和接收。而實際上的傳送和接收,我們知道鏈路是有多種的,如上面提到的序列線和網線。使用哪種方式去傳輸,我們需要根據儀器的屬性去判斷。如下圖所示的方法,在基類裡實現。

解決了上面儀器類的結構設計以後,我們需要考慮儀器的屬性如何表示和儲存。我們把所有儀器都稱為裝置,裝置包含以下內容:

(1)名稱。

(2)傳輸方式,以及傳輸的引數。例如用串列埠,那應該有串列埠號、波特率等。如果用網線,應該有IP、埠等。

(3)使用的通訊協議。選定之後,上位機能夠找到相應的通訊協議類,對位元組流進行操作。順便一說,我們把通訊協議類用反射的方法去做,每個協議是一個dll,選擇不同的協議即會執行不同的程式碼。

(4)因子列表。

沒錯,說到這裡,我們就發現,裝置裡有一個因子的概念。因子是什麼?這個比較難解釋。從最原始的因子來看,因子就是儀器的測量值。例如我們有一臺溫溼度計,它的測量值會有兩個,分別是溫度和溼度。我們就把溫度和溼度作為兩個因子。我們對因子的概念進行擴充套件,把狀態也作為因子。例如儀器的工作狀態、故障狀態,都可以看作是一個個的因子。甚至,我們把控制儀器的命令,也看成是因子。例如是啟動測量、更換執行模式,每一個動作都看成是一個因子。這樣下來之後,儀器的所有功能,都變成了因子的列表。因子有很多屬性,但不是所有因子都一樣的。名稱是我們想到的唯一一個共性屬性。我們在實際的開發過程中,定義了幾種因子:

(1)實際因子:就是測量值。它應該有單位、超標限制、因子地址(Modbus協議)等屬性。

(2)計算因子:跟實際因子類似,只是它不是直接讀取儀器值得到的,而是根據實際因子計算出來的。這樣的話,計算因子就要有一個表示式的屬性,例如是:溫度*9/5+32

(3)狀態因子:儀器的狀態。它的值不一定是數,可能是一個字串。

(4)反控因子:對儀器的控制命令。可以用一個數字去表示控制的型別,只需要在協議類裡面解釋清楚即可。

通過上面的方法,我們把所有儀器都歸一成統一的類了。