開源純C#工控網關+組態軟件(二)工控網關的實現

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的數據類型是整型、仍是浮點數、仍是布爾量,所以Tag也分IntTag、FloatTag、BoolTag等類型。

無論哪一種類型的Tag,必定繼承ITag抽象類。 ITag有Address屬性,就是映射到DeviceAddress 。同時還有TimeStamp(時間戳),Value(值),Quailty(數據質量)。

一樣的,Tag自己也具備讀寫功能(Read,Write方法),也就是上位機對Tag的讀寫,最終反映爲下位機對地址的讀寫。

而不一樣類型的Tag,天然就對應到上面所提到的IReaderWriter 接口,正好有匹配的讀/寫布爾量,讀/寫整型,讀/寫浮點型等等的方法。

這樣,就把下位機設備和Tag變量的讀寫對應起來 了。

4、   下面的計劃

  • 完善功能。

請繼續關注個人帖子,並提出寶貴意見和建議。

  • 寫一系列帖子,把架構、原理講清楚。

       提綱和目錄也擬好了。大體以下:

  1. 網關層接口概述
  2. 上下位機通信原理
  3. 如何實現一個設備驅動
  4. 如何設計圖元
  5. VS插件模塊及原理
  6. 歸檔模塊及文件格式
  7. 如何進行功能擴展

github地址:https://github.com/GavinYellow/SharpSCADA

相關文章
相關標籤/搜索