二、數據模型
整個SCADA系統,其功能其實是對數據流動的控制,如下圖所示:
(1)採集模塊是系統的入口,所有數據來自採集模塊。
(2)採集到的數據是實時變化的,而數據庫可能要求1分鐘或1小時存放一條數據,這時候需要對數據進行採樣。
(3)原始數據或許只是數字,而我們在展現時,會要求顯示單位、保留一定的小數位數,又或者,什麼數字代表什麼狀態,這就要求對數據進行一定的格式化。
(4)數據經過整理之後,按照一定的通信協議上傳至服務器。
那作爲系統核心的數據,究竟以怎樣的格式進行存放呢?
上位機對一臺儀器的操作,無非包含以下幾項內容:
(1)讀取其測量數值。
(2)讀取其狀態。
(3)發送命令,執行某項任務。
可以發現,一般開發語言裏的“屬性”這一概念,剛好能表達上述內容。例如:
public double Temperature { get; set; }
public string RunningState { get; set; }
private int runningMode;
public int RunningMode
{
get
{
return runningMode;
}
set
{
runningMode = value;
//執行其他動作
}
}
我們轉換一下名稱,把設備的所有這些屬性,稱爲“因子”。存在3種主要類型的因子:
測量因子:代表儀器的測量值,例如溫溼度計的溫度值、溼度值。
狀態因子:代表儀器的狀態,例如儀器是否正在運行、是否在線等。
反控因子:代表對儀器的操作,例如關閉儀器、調高溫度等。
那麼,代表儀器的數據,都具有以下的形式:
設備名.因子名 = 值
我們可以使用一個列表List,或一個字典Dictionary,去存儲這一形式的數據。
採集模塊,需要把各種各樣的儀器數據,整理成上述形式。同時,需要把上述形式的數據,解析成儀器具體的數據類型。例如,某個溫溼度計,在地址爲6的寄存器上,存放了溫度的10倍整數值。那麼,採集模塊應該完成以下的工作:
溫溼度計.溫度=(地址爲6的寄存器值)/10。
上式的等號,在代碼裏面就是讀寄存器。
然後,當我們要設定一個值時,其完成的工作就是:
(地址爲6的寄存器值)=溫溼度計.溫度*10
上式的等號,在代碼裏面就是寫寄存器。
在採集模塊開發完成以後(我們在下一章講述採集模塊的開發細節),上層模塊操作數據的方式就變得非常簡單明瞭了。舉個例子,組態模塊的開發:當我們要在某個地方顯示溫度時,可以拖一下文本框到那個地方,然後把文本框的內容輸入爲:{溫溼度計.溫度}。如果我們想點擊一個按鈕,即改變當然溫度,可以在按鈕的命令內容裏,寫:{溫溼度計.溫度}=25。