1. 程式人生 > >工業通信網關的實現

工業通信網關的實現

sed out ifile nec 翻譯 它的 直接 mes under

一、 工控網關是什麽

網關是物聯網和工控系統的核心組件。網關起的是承上啟下的作用。上即上位機,電腦/觸屏監控系統、MES這些;下即下位機,包括PLC、傳感器、嵌入式芯片等。

不同廠家的下位機,往往講的是不同的語言,西門子的語言叫ProfiBus,施耐德的語言叫Modbus,AB的語言叫Ethernet IP。在樓宇自控領域,又有BACnet 。。

網關要擔當溝通上、下位機的重任,它的基本功能就是翻譯,即協議轉換。管你說哪種方言,最後轉給上位機的都是普通話。

技術分享

二、 如何實現軟網關:啟下

  • 網關是對下位機的抽象

程序就是對客觀事物的抽象。網關如果要完整無誤的轉述各種下位機的“方言”,那一定是它能夠提取出下位機的共性。

共性的部分,抽象成接口。特性的部分,在各自的類裏實現。

最終,我認為下位機最重要的兩個共性是:可讀寫性可連接性

這樣就有了兩個基本接口(在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 數組。

如果你的下位機支持批量讀寫,直接繼承這個接口並實現就可以了。如果讀寫時發現繼承了這個接口,系統就會自動調用更高效的方式。

三、 如何實現軟網關:承上

  • 網關是對上位機變量的映射

一個能連接、能讀寫的下位機如果實現了,要想在界面顯示,必須做一件事,

就是下位機數據的變化,反映為上位機圖形的變化

技術分享比如這幅界面裏的電機,啟動後變綠;電流溫度數據會顯示並刷新。

要做到這一點,就必須有一個上下位機的中介: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變量的讀寫對應起來 了。

四、 下面的計劃

  • 完善功能。

請繼續關註我的帖子,並提出寶貴意見和建議。

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

提綱和目錄也擬好了。大致如下:

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

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

工業通信網關的實現