1. 程式人生 > >《物聯網框架ServerSuperIO教程》-21.終端控制感測器或裝置,形成迴路控制。附:demo原始碼

《物聯網框架ServerSuperIO教程》-21.終端控制感測器或裝置,形成迴路控制。附:demo原始碼

21.1     概述

     ServerSuperIO以前所做的工作逐步為形成迴路控制或級聯控制打下基礎,例如:服務聯結器和裝置驅動聯結器的開發與應用。總之,是通過多種形式下發命令控制裝置(驅動)或感測器,雲端控制站點或監測點的感測器、App或者其他終端控制感測器、根據感測器的採集資料控制另一個感測器等。

    下面介紹雲端、App或者其他終端如何控制感測器裝置(感測器控制感測器類似,請參見:12.服務介面的開發,以及與雲端雙向互動)。根據通訊協議,結構化方案、不需要太多程式碼即可完成相應的功能。效果如下圖:

 

21.2     結構示意圖

 

    控制端發起控制命令,用ServerSuperIO服務介面開發一個簡單的代理服務,通過服務聯結器IServiceConnector介面與裝置驅動進行互動,裝置驅動接收到控制命令後下發給裝置或感測器,等待控制返回的確認訊息,再原路返回給控制端。

21.3     通訊協議

    有人問為什麼不使用MQTT協議,那如何相容不同裝置和感測器的協議?以於中國現實情況,顯然還不能達到統一標準的水平,在經濟不好的情況下,企業也不可能投資替換掉原來的硬體裝置。也不符合ServerSuperIO設計的原則,就是要搞協議無關性,任何標準或非標準的協議都可以整合進來。如果想過一條河,把橋修好、把索道搭好、把船擺好…具體怎麼過河由你自己決定。

    有人問ServerSuperIO都集成了什麼協議?上面已經給出了答案,另外我想說的是沒有任何一個框架可以包治百病。從相反的角度來考慮,如果像組態一樣把任何協議都加進來,企業又想拿出來多少的價值來對等交換呢,所以協議驅動還是交給大家來自己寫吧。

    我們演示的協議如下圖:

 

21.4     控制端

   控制端包括很多種:雲端向下級傳送控制命令、App或Pc機軟體連線服務傳送控制命令等等。傳送控制命令如下圖:

 

21.5     代理服務(SSIO服務介面)

      代理服務是通過ServerSuperIO的IService介面實現,在繼承類中使用ServerSuperIO框架本身的單例模式開發代理服務,程式碼如下:

public override void StartService()
        {
            string devId = "ControlDeviceService";
            Driver dev = new Driver();
            dev.ReceiveRequestInfos += Dev_ReceiveRequestInfos;
            dev.DeviceParameter.DeviceName = "控制裝置驅動器";
            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 = "控制裝置服務",
                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事件是控制驅動繼承ServerSuperIO框架中RunDevice驅動類擴充套件的事件介面,ServerSuperIO單例模式接收到資料資訊,如果符合協議標準會把資料資訊反饋給驅動程式的Communicate介面,ReceiveRequestInfos事件把資料資訊傳遞給代理服務訂閱該事件的Dev_ReceiveRequestInfos函式。程式碼如下圖:

 

   代理服務中的Dev_ReceiveRequestInfos函式,通過服務聯結器介面IServiceConnector,根據DeviceCode(addr)把資訊傳遞給相應的裝置驅動。程式碼如下圖:

 

    代理服務通過ServiceConnectorCallback和ServiceConnectorCallbackError函式介面接收裝置驅動反饋的結果資訊,如果中間出現異常會呼叫ServiceConnectorCallbackError,如果正常會呼叫ServiceConnectorCallback函式,ServiceConnectorCallback函式介面根據記錄的命令與IO通道的對應關係,再把結果傳送給控制端。ServiceConnectorCallback程式碼如下圖:

 

     在這裡邊有一個注意的地方,就是裝置驅動在規定的時間內沒有反饋控制命令的確認資訊,也就是感測器沒有反饋相應的資訊。這種情況要增加一個定時檢測服務,如果超時沒有反饋資訊,傳送給控制端相應的訊息。程式碼如下圖:

 

21.6     裝置驅動

     這個裝置驅動與感測器相對應,之間相互過行資料互動。裝置驅動的RunServiceConnector介面負責接收代理服務Dev_ReceiveRequestInfos(OnServiceConnector)函式傳遞過來的命令資訊。程式碼如下圖:

 

     有兩點說明:1.接收到命令資料後可以通過OnSendData函式立即下發資料資訊,以設定的IP查詢相應的IO通道,適用於自控模式。2. 接收到命令資料後放到this.Protocol.SendCache協議快取中,等待下發命令,適用於輪詢、併發模式。

     針對於返回的結果物件ServiceConnectorCallbackResult的isAsyn引數,如果為true,說明通過AsyncServiceConnectorCallback callback返回結果資訊,也就是說要等待感測器返回確認資訊,並且裝置驅動接收後再反饋到代理服務;如果為false,說明會立即反饋到代理服務,適用於傳遞資料資訊而不管與感測器是否互動成功。

     可以在這個函式中把callback引數進行臨時儲存,等待感測器返回確認資訊後在Communicate函式中觸發非同步回撥到代理服務。程式碼如下圖:

 

21.7     Demo說明

    開啟兩個TestDevice程式,一個作為裝置感測器,一個作為控制端,DeviceCode要以應;TestDeviceDriver是裝置驅動,在服務例項中載入,我用的是自控模式,使用TestSelfMain專案;ControlDeviceService是代理服務,在TestSelfMain中載入。具體參見工程程式碼:

備註:將來我們的大資料平臺,也可以通這種模式下發控制命令到站點。

物聯網&整合技術(.NET) QQ群:54256083