1、 工控網關是什麼git
網關是物聯網和工控系統的核心組件。網關起的是承上啓下的做用。上即上位機,電腦/觸屏監控系統、MES這些;下即下位機,包括PLC、傳感器、嵌入式芯片等。github
不一樣廠家的下位機,每每講的是不一樣的語言,西門子的語言叫ProfiBus,施耐德的語言叫Modbus,AB的語言叫Ethernet IP。在樓宇自控領域,又有BACnet 。。數據庫
網關要擔當溝通上、下位機的重任,它的基本功能就是翻譯,即協議轉換。管你說哪一種方言,最後轉給上位機的都是普通話。數組
2、 如何實現軟網關:啓下架構
程序就是對客觀事物的抽象。網關若是要完整無誤的轉述各類下位機的「方言」,那必定是它可以提取出下位機的共性。編碼
共性的部分,抽象成接口。特性的部分,在各自的類裏實現。spa
分析以後,我認爲下位機最重要的兩個共性是:可讀寫性。可鏈接性。插件
這樣就有了兩個基本接口(在Dataservice項目中):IReaderWriter,描述讀寫性。IDriver,描述鏈接性。翻譯
IReaderWriter接口的方法,都是和讀寫有關的:讀入/寫入一個位,讀入/寫入一字節、一個整數、一個浮點數、一個字符串。設計
這些方法都有一個共同的參數,DeviceAddress。表明一個下位機地址。
DeviceAddresss 是一個結構體。包含區域號Area,區塊號DBNumber,起始位置Start,位號Bit。
區域包含區塊,區塊有起始地址,邏輯變量有位號。加上VarType描述數據類型(布爾型、整型、浮點型、字符型等等),DataSize描述數據長度。
這樣的四級地址加上數據描述,足夠映射到任何一個下位機變量地址了。
IDriver 接口的方法,都是和鏈接有關的。Connect方法負責鏈接、IsClosed判斷鏈接是否斷開、TimeOut設置超時、OnClose事件在鏈接斷開時觸發。
ServerName屬性表示下位機的IP或者主機名。由這樣一些屬性、方法,就能夠定義一個下位機的鏈接了。
也許你們會問,爲何不把兩個接口合併爲一個?
由於必定有某種只具有鏈接性,不具有可讀寫性,或者只有可讀寫性,並無可鏈接性的對象存在。
好比內存數據庫對象。由於全部下位機的地址,都是各有各的表述方式,我在A小區X棟X號,我在B小區住獨棟。
下位機的地址小區不一樣,門牌號不一樣,並且極可能是不連續的,散亂的。
要對這些亂七八糟的地址進行統一管理,就像這些來自五湖四海的客人,住到同一家大酒店。每一個人今後只有一個標準化的地址:房號。
內存數據庫ICache就是對下位機地址變量的映射。映射到一個連續的內存地址空間,便於統一編號,統一管理。
對內存數據庫而言,它具備可讀寫性,但不須要可鏈接性。也就是隻要繼承IReaderWriter。
在這個繼承圖裏,有一個抽象類專門描述PLC類型下位機的,就是IPLCDriver。
首先全部的PLC都具備可鏈接性,可讀寫性。所以兩個接口都繼承。
同時,PLC的地址每每表示爲格式化的字符串。好比西門子地址可寫爲DB3,D122.1,Modubs爲30001.1。
GetDeviceAddress\GetAddress兩個方法就是對DeviceAddress 與字符串之間編碼、解碼。
PDU 是PLC的一個特殊屬性。也就是報文的數據單元。
全部的PLC如西門子、三菱、AB、Modbus都繼承於IPLCDriver 。
IFileDriver表明另外一類下位機,好比來自數據庫、文件流等。它們的共性是具備文件名FileName。
在類圖裏看到一個孤零零的IMultiReadWrite ,它是作什麼的?
由於部分下位機支持批量讀寫,尤爲在注重效率的場合,批量讀寫十分重要。一次讀入幾百個變量,和幾百次讀入單個變量,效率天壤之別。
所以IMultiReadWrite 要實現兩個方法,ReadMultiple(批量讀),WriteMultiple(批量寫),參數都是一個DeviceAddress 數組。
若是你的下位機支持批量讀寫,直接繼承這個接口並實現就能夠了。若是讀寫時發現繼承了這個接口,系統就會自動調用更高效的方式。
3、 如何實現軟網關:承上
一個能鏈接、能讀寫的下位機若是實現了,要想在界面顯示,必須作一件事,
就是讓下位機數據的變化,反映爲上位機圖形的變化。
好比這幅界面裏的電機,啓動後變綠;電流溫度數據會顯示並刷新。
要作到這一點,就必須有一個上下位機的中介:Tag。
Tag 這個對象,必須有一個上位機設計者理解的名字,好比1號馬達運行信號,就叫作Motor1_Running。
這個名字,在下位機是不存在的。下位機只有呆板的地址,好比DB3,D122.1。
這些上位機設計者不必知道。但他們必定知道這是一個布爾量,名字叫Motor1_Running。
所以網關還有一個必要的功能,下位機數據變化了,Tag值會相應變化,反過來也同樣。
由於上位機設計員只知道Tag的數據類型是整型、仍是浮點數、仍是布爾量,所以Tag也分IntTag、FloatTag、BoolTag等類型。
無論哪一種類型的Tag,必定繼承ITag抽象類。 ITag有Address屬性,就是映射到DeviceAddress 。同時還有TimeStamp(時間戳),Value(值),Quailty(數據質量)。
一樣的,Tag自己也具備讀寫功能(Read,Write方法),也就是上位機對Tag的讀寫,最終反映爲下位機對地址的讀寫。
而不一樣類型的Tag,天然就對應到上面所提到的IReaderWriter 接口,正好有匹配的讀/寫布爾量,讀/寫整型,讀/寫浮點型等等的方法。
這樣,就把下位機設備和Tag變量的讀寫對應起來 了。
4、 下面的計劃
請繼續關注個人帖子,並提出寶貴意見和建議。
提綱和目錄也擬好了。大體以下: