開源純C#工控網關+組態軟體(五)從網關到人機介面

來源:互聯網
上載者:User

標籤:idt   lin   tac   串連   tco   浮點   關注   多個   加密   

一、   引子

之前都在講網關,不少網友關注如何?介面。想瞭解下位機變數變化,是怎樣一步步觸發人機介面動畫的。

 

這個步步觸發,實質上是變數組(Group)的批量資料變化(DataChange)事件,引發了變數(Tag)的值更新(ValueChange)事件,最終觸發了圖元的動畫指令碼(Action)。這是一個連鎖反應。

簡言之,介面是一批叫Tag乘客,從網關坐TLV協議的列車,到了上位機車站下車,在ClientService這個舞台上,用各自的樂器(ITagReader)演奏了一出交響樂。

二、   承上啟下的核心對象:Tag

Tag(標籤或者叫變數)是整個項目的核心對象。所謂核心對象,就是它無所不在,是動態,流動的,就像血液融匯貫通。

實質上,Tag對下位機,就是一個個感應器的資料、一個個開關訊號;對上位機,就是一個個按鈕、儀錶盤、電機。

Tag在變數管理器(TagConfig)產生,在系統初始化時分配,存在於人機介面程式和網關服務的各個角落,它們的值和時間戳記在不斷的變化。

對上位機設計者,用到的是Tag的名字、Tag的資料類型;對下位機設計者,看到的是Tag的地址、Tag的長度。對變數警示和資料歸檔,需要知道Tag的時間戳記。

所有的Tag繼承於ITag介面。Tag的類型就是資料的類型,有FloatTag(浮點型)、BoolTag(邏輯型)、還有整型、字元型。不同類型對應IReaderWriter介面的ReadXXX方法。

Tag可以主動去讀(Read)寫(Write),也可以被動的重新整理(Update),強制重新整理(Refresh)。

Tag的Read方法是調用所屬Group、最終是調用所屬IDriver的ReadXXX方法從下位機讀入資料。但Tag的主要應用情境是被動重新整理觸發ValueChanged事件,以驅動人機介面。

三、   上下位機串連的紐帶:TLV協議

前文已經闡述了網關如何通過輪詢下位機、推送批量資料給上位機。上位機需要將推送來的資料流解析為一堆變化的Tag,以驅動整個人機介面和控制邏輯。

網關和上位機之間通訊,我這裡使用了一個自訂的簡單的TLV協議(Tag-Length-Value),承載於Socket。

這個協議包括兩部分:

  •  資料推送:將網關一端變化的Tag打包封裝,傳輸給用戶端;用戶端拆包,還原為一堆Tag。具體流程為:
  1. 網關的DataChange事件調用SendData方法,將變化的Tag打包為HistoryData數組(包含變數ID、值、時間戳記);
  2. Socket將HistoryData數群組轉換為位元組流推送給用戶端;
  3. 用戶端的ClientDriver 包含ReciveData方法,將位元組流還原為HistoryData數組並觸發用戶端DataChange事件;
  4. 用戶端的DataChange事件將HistoryData數群組轉換為Tag數組,並調用Tag的Update,觸發ValueChanging和ValueChanged事件。
  •  指令:用戶端主動向網關發送指令,一般用來讀、寫特定變數或一批變數,還可以查詢曆史歸檔、查詢警示等。指令格式如下:

指令碼FCTCOMMAND:包含各種命令;參數:如讀入時間段內所有歸檔資料,則需要起始時間、結束時間;讀入變數,則需要變數ID。傳回值:網關接收指令並返回資料,也是位元組流。  

    public class FCTCOMMAND    {        public const byte fctHead = 0xAB;//前序可加密,如前序不符,則不進行任何操作;用戶端Socket發送警示請求,封裝於Server        public const byte fctHdaIdRequest = 30;//按變數ID讀入曆史資料        public const byte fctHdaRequest = 31;//讀時間段內所有曆史資料        public const byte fctAlarmRequest = 32;//讀警示資料        public const byte fctOrderChange = 33;//讀訂單        public const byte fctReset = 34;//重設指令,一般用來釋放網關通訊端        public const byte fctXMLHead = 0xEE;//xml協議        public const byte fctReadSingle = 1;//讀單一變數        public const byte fctReadMultiple = 2;//讀多個變數        public const byte fctWriteSingle = 5;//寫單一變數        public const byte fctWriteMultiple = 15;//寫多個變數    }

四、   人機介面的驅動引擎:ClientService

用戶端的 ClientService與網關的DAService如出一轍:都具有相類似的結構,繼承了IDataServer, IAlarmServer,都從同一個資料庫載入驅動、組、變數、警示:

用戶端的:

public sealed class DAServer : IDataServer, IAlarmServer, IHDAServer

網關的:

public class DAService : IDataExchangeService, IDataServer, IAlarmServer

只是多了一個IHDAServer,具有查詢曆史資料的功能,而曆史資料歸檔是網關的功能。

因此,ClientService也帶有自己的驅動ClientDriver,ClientDriver也帶有自己的組ClientGroup。

注意的是,ClientDriver是上位機唯一的Driver,ClientGroup也是ClientDriver唯一的Group。這是因為上位機無需和各類型下位機打交道,與它打交道的唯一對象就是網關本身。

因此,人機介面的各類操作指令,如按按鈕、讀歸檔資料、查詢警示等,最終都反映成TLV協議指令發送給網關,並得到反饋。

而人機介面圖元的動畫,都是來自網關推送的Tag,觸發ValueChanged事件;事件的訂閱者,就是圖元對應的ITagReader,圖元動畫的幕後指揮。

五、   圖元動畫的幕後指揮:ITagReader

ITagReader介面為所有圖元組件繼承,它的功能就是將Tag與動畫綁定。先看下結構:

    public interface ITagReader : ITagLink    {        string TagReadText { get; set; }        string[] GetActions();        Action SetTagReader(string key, Delegate tagChanged);        IList<ITagLink> Children { get; }    }

TagReadText屬性,就是與圖元動畫關聯的Variant 運算式:形如Tag1*2+Tag2*5>10。我實現了一個自訂運算式編譯器Eval,可以解析運算式文法,分離出Tag1和Tag2。這段代碼在Example-WindowHelper-BindingControl。

接著,圖元組件訂閱Tag1和Tag2的ValueChanged事件。

如果值發生變化,這個事件內部會執行SetTagReader,計算運算式的結果,並向介面發送指令。

如果Tag1*2+Tag2*5>10,此時Tag1=1,Tag2=2,滿足條件,最終會產生一個動畫指令碼:Action。這個Action可以是讓電機警示,顏色變為閃爍的紅色;也可以是點亮一盞燈,或開啟一座閥門。下文會詳細闡述。

       從網關到人機介面流程:

 

六、   下面的計劃

寫一系列文章,把架構、原理講清楚。大致如下:

  • 網關層介面概述
  • 上下位機通訊原理
  • 如何?一個裝置驅動
  • 從網關到人機介面
  • 如何設計圖元
  • VS外掛程式模組及原理
  • 歸檔模組及檔案格式
  • 如何進行功能擴充
  • 組態Variant 運算式實現

github地址:https://github.com/GavinYellow/SharpSCADA。QQ群:102486275

開源純C#工控網關+組態軟體(五)從網關到人機介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.