溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

發(fā)布時(shí)間:2021-09-17 10:39:34 來源:億速云 閱讀:114 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析”這篇文章吧。

21.1     概述

ServerSuperIO以前所做的工作逐步為形成回路控制或級(jí)聯(lián)控制打下基礎(chǔ),例如:服務(wù)連接器和設(shè)備驅(qū)動(dòng)連接器的開發(fā)與應(yīng)用??傊?,是通過多種形式下發(fā)命令控制設(shè)備(驅(qū)動(dòng))或傳感器,云端控制站點(diǎn)或監(jiān)測(cè)點(diǎn)的傳感器、App或者其他終端控制傳感器、根據(jù)傳感器的采集數(shù)據(jù)控制另一個(gè)傳感器等。

下面介紹云端、App或者其他終端如何控制傳感器設(shè)備(傳感器控制傳感器類似,請(qǐng)參見:12.服務(wù)接口的開發(fā),以及與云端雙向交互)。根據(jù)通訊協(xié)議,結(jié)構(gòu)化方案、不需要太多代碼即可完成相應(yīng)的功能。效果如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

21.2     結(jié)構(gòu)示意圖

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

控制端發(fā)起控制命令,用ServerSuperIO服務(wù)接口開發(fā)一個(gè)簡(jiǎn)單的代理服務(wù),通過服務(wù)連接器IServiceConnector接口與設(shè)備驅(qū)動(dòng)進(jìn)行交互,設(shè)備驅(qū)動(dòng)接收到控制命令后下發(fā)給設(shè)備或傳感器,等待控制返回的確認(rèn)消息,再原路返回給控制端。

21.3     通訊協(xié)議

有人問為什么不使用MQTT協(xié)議,那如何兼容不同設(shè)備和傳感器的協(xié)議?以于中國(guó)現(xiàn)實(shí)情況,顯然還不能達(dá)到統(tǒng)一標(biāo)準(zhǔn)的水平,在經(jīng)濟(jì)不好的情況下,企業(yè)也不可能投資替換掉原來的硬件設(shè)備。也不符合ServerSuperIO設(shè)計(jì)的原則,就是要搞協(xié)議無關(guān)性,任何標(biāo)準(zhǔn)或非標(biāo)準(zhǔn)的協(xié)議都可以集成進(jìn)來。如果想過一條河,把橋修好、把索道搭好、把船擺好…具體怎么過河由你自己決定。

有人問ServerSuperIO都集成了什么協(xié)議?上面已經(jīng)給出了答案,另外我想說的是沒有任何一個(gè)框架可以包治百病。從相反的角度來考慮,如果像組態(tài)一樣把任何協(xié)議都加進(jìn)來,企業(yè)又想拿出來多少的價(jià)值來對(duì)等交換呢,所以協(xié)議驅(qū)動(dòng)還是交給大家來自己寫吧。

我們演示的協(xié)議如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

21.4     控制端

控制端包括很多種:云端向下級(jí)發(fā)送控制命令、App或Pc機(jī)軟件連接服務(wù)發(fā)送控制命令等等。發(fā)送控制命令如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

21.5     代理服務(wù)(SSIO服務(wù)接口)

代理服務(wù)是通過ServerSuperIO的IService接口實(shí)現(xiàn),在繼承類中使用ServerSuperIO框架本身的單例模式開發(fā)代理服務(wù),代碼如下:

public override void StartService()
        {
            string devId = "ControlDeviceService";
            Driver dev = new Driver();
            dev.ReceiveRequestInfos += Dev_ReceiveRequestInfos;
            dev.DeviceParameter.DeviceName = "控制設(shè)備驅(qū)動(dòng)器";
            dev.DeviceParameter.DeviceAddr = 0;
            dev.DeviceParameter.DeviceID = devId;
            dev.DeviceParameter.DeviceCode = "";
            dev.DeviceDynamic.DeviceID = devId;
            dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev.DeviceParameter.NET.RemotePort = 9600;
            dev.DeviceParameter.NET.ControllerGroup = "LocalGroup";
            dev.CommunicateType = CommunicateType.NET;
            dev.Initialize(devId);

            IServer server = new ServerManager().CreateServer(new ServerConfig()
            {
                ServerName = "控制設(shè)備服務(wù)",
                ListenPort=6670,
                ComReadTimeout = 1000,
                ComWriteTimeout = 1000,
                NetReceiveTimeout = 1000,
                NetSendTimeout = 1000,
                ControlMode = ControlMode.Singleton,
                SocketMode = SocketMode.Tcp,
                StartReceiveDataFliter = false,
                ClearSocketSession = false,
                StartCheckPackageLength = false,
                CheckSameSocketSession = false,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.SocketConnected += server_SocketConnected;
            server.SocketClosed += server_SocketClosed;
            server.Start();

            server.AddDevice(dev);
        }

dev.ReceiveRequestInfos事件是控制驅(qū)動(dòng)繼承ServerSuperIO框架中RunDevice驅(qū)動(dòng)類擴(kuò)展的事件接口,ServerSuperIO單例模式接收到數(shù)據(jù)信息,如果符合協(xié)議標(biāo)準(zhǔn)會(huì)把數(shù)據(jù)信息反饋給驅(qū)動(dòng)程序的Communicate接口,ReceiveRequestInfos事件把數(shù)據(jù)信息傳遞給代理服務(wù)訂閱該事件的Dev_ReceiveRequestInfos函數(shù)。代碼如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

代理服務(wù)中的Dev_ReceiveRequestInfos函數(shù),通過服務(wù)連接器接口IServiceConnector,根據(jù)DeviceCode(addr)把信息傳遞給相應(yīng)的設(shè)備驅(qū)動(dòng)。代碼如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

代理服務(wù)通過ServiceConnectorCallback和ServiceConnectorCallbackError函數(shù)接口接收設(shè)備驅(qū)動(dòng)反饋的結(jié)果信息,如果中間出現(xiàn)異常會(huì)調(diào)用ServiceConnectorCallbackError,如果正常會(huì)調(diào)用ServiceConnectorCallback函數(shù),ServiceConnectorCallback函數(shù)接口根據(jù)記錄的命令與IO通道的對(duì)應(yīng)關(guān)系,再把結(jié)果發(fā)送給控制端。ServiceConnectorCallback代碼如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

在這里邊有一個(gè)注意的地方,就是設(shè)備驅(qū)動(dòng)在規(guī)定的時(shí)間內(nèi)沒有反饋控制命令的確認(rèn)信息,也就是傳感器沒有反饋相應(yīng)的信息。這種情況要增加一個(gè)定時(shí)檢測(cè)服務(wù),如果超時(shí)沒有反饋信息,發(fā)送給控制端相應(yīng)的消息。代碼如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

21.6     設(shè)備驅(qū)動(dòng)

這個(gè)設(shè)備驅(qū)動(dòng)與傳感器相對(duì)應(yīng),之間相互過行數(shù)據(jù)交互。設(shè)備驅(qū)動(dòng)的RunServiceConnector接口負(fù)責(zé)接收代理服務(wù)Dev_ReceiveRequestInfos(OnServiceConnector)函數(shù)傳遞過來的命令信息。代碼如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

有兩點(diǎn)說明:1.接收到命令數(shù)據(jù)后可以通過OnSendData函數(shù)立即下發(fā)數(shù)據(jù)信息,以設(shè)置的IP查找相應(yīng)的IO通道,適用于自控模式。2. 接收到命令數(shù)據(jù)后放到this.Protocol.SendCache協(xié)議緩存中,等待下發(fā)命令,適用于輪詢、并發(fā)模式。

針對(duì)于返回的結(jié)果對(duì)象ServiceConnectorCallbackResult的isAsyn參數(shù),如果為true,說明通過AsyncServiceConnectorCallback callback返回結(jié)果信息,也就是說要等待傳感器返回確認(rèn)信息,并且設(shè)備驅(qū)動(dòng)接收后再反饋到代理服務(wù);如果為false,說明會(huì)立即反饋到代理服務(wù),適用于傳遞數(shù)據(jù)信息而不管與傳感器是否交互成功。

可以在這個(gè)函數(shù)中把callback參數(shù)進(jìn)行臨時(shí)保存,等待傳感器返回確認(rèn)信息后在Communicate函數(shù)中觸發(fā)異步回調(diào)到代理服務(wù)。代碼如下圖:

serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析

以上是“serversuperio分享終端控制傳感器或設(shè)備形成回路控制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI