开源纯C#工控网关+组态软件(五)从网关到人机界面
一、???引子
之前都在講網(wǎng)關(guān),不少網(wǎng)友關(guān)注如何實現(xiàn)界面。想了解下位機(jī)變量變化,是怎樣一步步觸發(fā)人機(jī)界面動畫的。
?
這個步步觸發(fā),實質(zhì)上是變量組(Group)的批量數(shù)據(jù)變化(DataChange)事件,引發(fā)了變量(Tag)的值更新(ValueChange)事件,最終觸發(fā)了圖元的動畫腳本(Action)。這是一個連鎖反應(yīng)。
簡言之,界面是一批叫Tag乘客,從網(wǎng)關(guān)坐TLV協(xié)議的列車,到了上位機(jī)車站下車,在ClientService這個舞臺上,用各自的樂器(ITagReader)演奏了一出交響樂。
二、???承上啟下的核心對象:Tag
Tag(標(biāo)簽或者叫變量)是整個項目的核心對象。所謂核心對象,就是它無所不在,是動態(tài)的,流動的,就像血液融匯貫通。
實質(zhì)上,Tag對下位機(jī),就是一個個傳感器的數(shù)據(jù)、一個個開關(guān)信號;對上位機(jī),就是一個個按鈕、儀表盤、電機(jī)。
Tag在變量管理器(TagConfig)產(chǎn)生,在系統(tǒng)初始化時分配,存在于人機(jī)界面程序和網(wǎng)關(guān)服務(wù)的各個角落,它們的值和時間戳在不斷的變化。
對上位機(jī)設(shè)計者,用到的是Tag的名字、Tag的數(shù)據(jù)類型;對下位機(jī)設(shè)計者,看到的是Tag的地址、Tag的長度。對變量報警和數(shù)據(jù)歸檔,需要知道Tag的時間戳。
所有的Tag繼承于ITag接口。Tag的類型就是數(shù)據(jù)的類型,有FloatTag(浮點型)、BoolTag(邏輯型)、還有整型、字符型。不同類型Tag的讀寫對應(yīng)IReaderWriter接口的ReadXXX/WriteXXX方法。
Tag可以主動去讀(Read)寫(Write),也可以被動的刷新(Update),強(qiáng)制刷新(Refresh)。
Tag的Read方法是調(diào)用所屬Group、最終是調(diào)用所屬IDriver的ReadXXX方法從下位機(jī)讀入數(shù)據(jù)。但Tag的主要應(yīng)用場景是被動刷新觸發(fā)ValueChanged事件,以驅(qū)動人機(jī)界面。
三、???上下位機(jī)連接的紐帶:TLV協(xié)議
前文已經(jīng)闡述了網(wǎng)關(guān)如何通過輪詢下位機(jī)、推送批量數(shù)據(jù)給上位機(jī)。上位機(jī)需要將推送來的數(shù)據(jù)流解析為一堆變化的Tag,以驅(qū)動整個人機(jī)界面和控制邏輯。
網(wǎng)關(guān)和上位機(jī)之間通訊,我這里使用了一個自定義的簡單的TLV協(xié)議(Tag-Length-Value),承載于Socket。
這個協(xié)議包括兩部分:
-
?數(shù)據(jù)推送:將網(wǎng)關(guān)一端變化的Tag打包封裝,傳輸給客戶端;客戶端拆包,還原為一堆Tag。具體流程為:
網(wǎng)關(guān)的DataChange事件調(diào)用SendData方法,將變化的Tag打包為HistoryData數(shù)組(包含變量ID、值、時間戳);
Socket將HistoryData數(shù)組轉(zhuǎn)換為字節(jié)流推送給客戶端;
客戶端的ClientDriver?包含ReciveData方法,將字節(jié)流還原為HistoryData數(shù)組并觸發(fā)客戶端DataChange事件;
客戶端的DataChange事件將HistoryData數(shù)組轉(zhuǎn)換為Tag數(shù)組,并調(diào)用Tag的Update,觸發(fā)ValueChanging和ValueChanged事件。
-
?指令:客戶端主動向網(wǎng)關(guān)發(fā)送指令,一般用來讀、寫特定變量或一批變量,還可以查詢歷史歸檔、查詢報警等。指令格式如下:
? ? ? 指令碼FCTCOMMAND:包含各種命令;
? ? ? 參數(shù):如讀入時間段內(nèi)所有歸檔數(shù)據(jù),則需要起始時間、結(jié)束時間;讀入變量,則需要變量ID。
? ? ? 返回值:網(wǎng)關(guān)接收指令并返回數(shù)據(jù),也是字節(jié)流。??
四、???人機(jī)界面的驅(qū)動引擎:ClientService
人機(jī)界面客戶端的 ClientService與網(wǎng)關(guān)的DAService如出一轍:都具有相類似的結(jié)構(gòu),繼承了IDataServer, IAlarmServer,都從同一個數(shù)據(jù)庫加載驅(qū)動、組、變量、報警:
客戶端的:
public sealed class DAServer : IDataServer, IAlarmServer, IHDAServer網(wǎng)關(guān)的:
public class DAService : IDataExchangeService, IDataServer, IAlarmServer只是多了一個IHDAServer,具有查詢歷史數(shù)據(jù)的功能,而歷史數(shù)據(jù)歸檔是網(wǎng)關(guān)的功能。
因此,ClientService也帶有自己的驅(qū)動ClientDriver,ClientDriver也帶有自己的組ClientGroup。
注意的是,ClientDriver是上位機(jī)唯一的Driver,ClientGroup也是ClientDriver唯一的Group。這是因為上位機(jī)無需和各類型下位機(jī)打交道,與它打交道的唯一對象就是網(wǎng)關(guān)本身。
因此,人機(jī)界面的各類操作指令,如按按鈕、讀歸檔數(shù)據(jù)、查詢報警等,最終都反映成TLV協(xié)議指令發(fā)送給網(wǎng)關(guān),并得到反饋。
而人機(jī)界面圖元的動畫,都是來自網(wǎng)關(guān)推送的Tag,觸發(fā)ValueChanged事件;事件的訂閱者,就是圖元對應(yīng)的ITagReader,圖元動畫的幕后指揮。
五、???圖元動畫的幕后指揮:ITagReader
ITagReader接口為所有圖元組件繼承,它的功能就是將Tag與動畫綁定。先看下結(jié)構(gòu):
? ?string TagReadText { get; set; } ? ? ?
? ? ?string[] GetActions();Action SetTagReader(string key, Delegate tagChanged);IList<ITagLink> Children { get; }}
TagReadText屬性,就是與圖元動畫關(guān)聯(lián)的變量表達(dá)式:形如Tag1*2+Tag2*5>10。我實現(xiàn)了一個自定義表達(dá)式編譯器Eval,可以解析表達(dá)式語法,分離出Tag1和Tag2。這段代碼在Example-WindowHelper-BindingControl。
接著,圖元組件訂閱Tag1和Tag2的ValueChanged事件。
如果值發(fā)生變化,這個事件內(nèi)部會執(zhí)行SetTagReader,計算表達(dá)式的結(jié)果,如滿足條件,將向界面發(fā)送指令。
例如變量表達(dá)式為Tag1*2+Tag2*5>10,此時若Tag1=1,Tag2=2,滿足條件,最終會觸發(fā)一個動畫腳本:Action。這個Action可以是讓電機(jī)報警,顏色變?yōu)殚W爍的紅色;也可以是點亮一盞燈,或打開一座閥門。下文會詳細(xì)闡述。
從網(wǎng)關(guān)到人機(jī)界面流程:
?
六、???下面的計劃
寫一系列帖子,把架構(gòu)、原理講清楚。大致如下:
-
網(wǎng)關(guān)層接口概述
-
上下位機(jī)通訊原理
-
如何實現(xiàn)一個設(shè)備驅(qū)動
-
從網(wǎng)關(guān)到人機(jī)界面
-
如何設(shè)計圖元
-
VS插件模塊及原理
-
歸檔模塊及文件格式
-
如何進(jìn)行功能擴(kuò)展
-
組態(tài)變量表達(dá)式實現(xiàn)
github地址:https://github.com/GavinYellow/SharpSCADA。QQ群:102486275
相關(guān)文章:?
-
.NET十年回顧
-
開源純C#工控網(wǎng)關(guān)+組態(tài)軟件
-
開源純C#工控網(wǎng)關(guān)+組態(tài)軟件(三)加入一個新驅(qū)動:西門子S7
-
開源純C#工控網(wǎng)關(guān)+組態(tài)軟件(四)上下位機(jī)通訊原理
原文地址:http://www.cnblogs.com/evilcat/p/7782265.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的开源纯C#工控网关+组态软件(五)从网关到人机界面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 认证与授权[4
- 下一篇: 使用Identity Server 4建