日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

开源纯C#工控网关+组态软件(五)从网关到人机界面

發(fā)布時間:2023/12/4 C# 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源纯C#工控网关+组态软件(五)从网关到人机界面 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、???引子

之前都在講網(wǎng)關(guān),不少網(wǎng)友關(guān)注如何實現(xiàn)界面。想了解下位機變量變化,是怎樣一步步觸發(fā)人機界面動畫的。

?

這個步步觸發(fā),實質(zhì)上是變量組(Group)的批量數(shù)據(jù)變化(DataChange)事件,引發(fā)了變量(Tag)的值更新(ValueChange)事件,最終觸發(fā)了圖元的動畫腳本(Action)。這是一個連鎖反應(yīng)。

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

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

Tag(標(biāo)簽或者叫變量)是整個項目的核心對象。所謂核心對象,就是它無所不在,是動態(tài)的,流動的,就像血液融匯貫通。

實質(zhì)上,Tag對下位機,就是一個個傳感器的數(shù)據(jù)、一個個開關(guān)信號;對上位機,就是一個個按鈕、儀表盤、電機。

Tag在變量管理器(TagConfig)產(chǎn)生,在系統(tǒng)初始化時分配,存在于人機界面程序和網(wǎng)關(guān)服務(wù)的各個角落,它們的值和時間戳在不斷的變化。

對上位機設(shè)計者,用到的是Tag的名字、Tag的數(shù)據(jù)類型;對下位機設(shè)計者,看到的是Tag的地址、Tag的長度。對變量報警和數(shù)據(jù)歸檔,需要知道Tag的時間戳。

所有的Tag繼承于ITag接口。Tag的類型就是數(shù)據(jù)的類型,有FloatTag(浮點型)、BoolTag(邏輯型)、還有整型、字符型。不同類型Tag的讀寫對應(yīng)IReaderWriter接口的ReadXXX/WriteXXX方法。

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

Tag的Read方法是調(diào)用所屬Group、最終是調(diào)用所屬IDriver的ReadXXX方法從下位機讀入數(shù)據(jù)。但Tag的主要應(yīng)用場景是被動刷新觸發(fā)ValueChanged事件,以驅(qū)動人機界面。

三、???上下位機連接的紐帶:TLV協(xié)議

前文已經(jīng)闡述了網(wǎng)關(guān)如何通過輪詢下位機、推送批量數(shù)據(jù)給上位機。上位機需要將推送來的數(shù)據(jù)流解析為一堆變化的Tag,以驅(qū)動整個人機界面和控制邏輯。

網(wǎng)關(guān)和上位機之間通訊,我這里使用了一個自定義的簡單的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é)流。??


    public class FCTCOMMAND{ ? ? ? ?public const byte fctHead = 0xAB;//報頭可加密,如報頭不符,則不進行任何操作;客戶端Socket發(fā)送報警請求,封裝于Serverpublic const byte fctHdaIdRequest = 30;//按變量ID讀入歷史數(shù)據(jù)public const byte fctHdaRequest = 31;//讀時間段內(nèi)所有歷史數(shù)據(jù)public const byte fctAlarmRequest = 32;//讀報警數(shù)據(jù)public const byte fctOrderChange = 33;//讀訂單public const byte fctReset = 34;//重置指令,一般用來釋放網(wǎng)關(guān)套接字public const byte fctXMLHead = 0xEE;//xml協(xié)議public const byte fctReadSingle = 1;//讀單一變量public const byte fctReadMultiple = 2;//讀多個變量public const byte fctWriteSingle = 5;//寫單一變量public const byte fctWriteMultiple = 15;//寫多個變量}


    四、???人機界面的驅(qū)動引擎:ClientService

    人機界面客戶端的 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是上位機唯一的Driver,ClientGroup也是ClientDriver唯一的Group。這是因為上位機無需和各類型下位機打交道,與它打交道的唯一對象就是網(wǎng)關(guān)本身。

    因此,人機界面的各類操作指令,如按按鈕、讀歸檔數(shù)據(jù)、查詢報警等,最終都反映成TLV協(xié)議指令發(fā)送給網(wǎng)關(guān),并得到反饋。

    而人機界面圖元的動畫,都是來自網(wǎng)關(guān)推送的Tag,觸發(fā)ValueChanged事件;事件的訂閱者,就是圖元對應(yīng)的ITagReader,圖元動畫的幕后指揮。

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

    ITagReader接口為所有圖元組件繼承,它的功能就是將Tag與動畫綁定。先看下結(jié)構(gòu):


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


    TagReadText屬性,就是與圖元動畫關(guān)聯(lián)的變量表達式:形如Tag1*2+Tag2*5>10。我實現(xiàn)了一個自定義表達式編譯器Eval,可以解析表達式語法,分離出Tag1和Tag2。這段代碼在Example-WindowHelper-BindingControl。

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

    如果值發(fā)生變化,這個事件內(nèi)部會執(zhí)行SetTagReader,計算表達式的結(jié)果,如滿足條件,將向界面發(fā)送指令。

    例如變量表達式為Tag1*2+Tag2*5>10,此時若Tag1=1,Tag2=2,滿足條件,最終會觸發(fā)一個動畫腳本:Action。這個Action可以是讓電機報警,顏色變?yōu)殚W爍的紅色;也可以是點亮一盞燈,或打開一座閥門。下文會詳細闡述。

    從網(wǎng)關(guān)到人機界面流程:

    ?

    六、???下面的計劃

    寫一系列帖子,把架構(gòu)、原理講清楚。大致如下:

    • 網(wǎng)關(guān)層接口概述

    • 上下位機通訊原理

    • 如何實現(xiàn)一個設(shè)備驅(qū)動

    • 從網(wǎng)關(guān)到人機界面

    • 如何設(shè)計圖元

    • VS插件模塊及原理

    • 歸檔模塊及文件格式

    • 如何進行功能擴展

    • 組態(tài)變量表達式實現(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)軟件(四)上下位機通訊原理

    原文地址:http://www.cnblogs.com/evilcat/p/7782265.html


    .NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

    總結(jié)

    以上是生活随笔為你收集整理的开源纯C#工控网关+组态软件(五)从网关到人机界面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。