《物聯網框架ServerSuperIO教程》-21.終端控制感測器或設備,形成迴路控制。附:demo源代碼

来源:http://www.cnblogs.com/lsjwq/archive/2017/06/12/6992627.html
-Advertisement-
Play Games

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


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中載入。具體參見工程代碼:http://pan.baidu.com/s/1c1ZZLOO

 

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

 


1.[連載]《C#通訊(串口和網路)框架的設計與實現》

2.[開源]C#跨平臺物聯網通訊框架ServerSuperIO(SSIO)介紹

2.應用SuperIO(SIO)和開源跨平臺物聯網框架ServerSuperIO(SSIO)構建系統的整體方案

3.C#工業物聯網和集成系統解決方案的技術路線(數據源、數據採集、數據上傳與接收、ActiveMQ、Mongodb、WebApi、手機App)

5.ServerSuperIO開源地址:https://github.com/wxzz/ServerSuperIO

物聯網&集成技術(.NET) QQ群:54256083 

下載地址:http://www.bmpj.net/thread-14-1-1.html


 1.C#跨平臺物聯網通訊框架ServerSuperIO(SSIO)介紹

《連載 | 物聯網框架ServerSuperIO教程》1.4種通訊模式機制。

《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明

《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅動介紹

《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網路通訊。

《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通訊模式開發及註意事項。

《連載 | 物聯網框架ServerSuperIO教程》- 6.併發通訊模式開發及註意事項

《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通訊模式開發及註意事項

《連載 | 物聯網框架ServerSuperIO教程》- 8.單例通訊模式開發及註意事項

《連載 | 物聯網框架ServerSuperIO教程》- 9. 協議過濾器,解決一包多發、粘包、冗餘數據

《連載 | 物聯網框架ServerSuperIO教程》- 10.持續傳輸大塊數據流的兩種方式(如:文件)

《連載 | 物聯網框架ServerSuperIO教程》- 11.實現設備(驅動)與設備(驅動)交互和級聯控制。

《連載 | 物聯網框架ServerSuperIO教程》- 12.服務介面的開發,以及與雲端雙向交互

《連載 | 物聯網框架ServerSuperIO教程》- 13.自定義視圖顯示介面開發,滿足不同的顯示需求

《連載 | 物聯網框架ServerSuperIO教程》- 14.配製工具介紹,以及設備驅動、視圖驅動、服務實例的掛載

《連載 | 物聯網框架ServerSuperIO教程》- 15.數據持久化介面的使用

《連載 | 物聯網框架ServerSuperIO教程》- 16.OPC Server的使用步驟

《連載 | 物聯網框架ServerSuperIO教程》- 17.支持實時資料庫,高併發保存測點數據

《連載 | 物聯網框架ServerSuperIO教程》- 18.集成OPC Client,及使用步驟

《連載 | 物聯網框架ServerSuperIO教程》-19.設備驅動和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化

《物聯網框架ServerSuperIO教程》-20.網路通訊控制器分組,提高交互的負載平衡能力。v3.6.6 版本發佈

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • “微服務架構(Microservice Architecture)”一詞在過去幾年裡廣泛的傳播,它用於描述一種設計應用程式的特別方式,作為一套獨立可部署的服務。目前,這種架構方式還沒有準確的定義,但是在圍繞業務能力的組織、自動部署(automated deployment)、端智能(intellig ...
  • 從很早時候,聽老師說 select * from table 比 select a,b,c,d from table 要慢很多。3年來從未測試。 今天沒事測一測, 不測不知道,一測嚇一跳。 當然 以下純屬測試,並未運用到實際項目中。如有什麼意見和建議,請指教。 測試代碼如下: ...
  • 反射是.net中非常有用的特性。 什麼是反射 可以用一句話來概括就是:基於程式集和元數據,可以動態創建某個類型的實例,調用方法,和訪問對象成員的一種能力。 為什麼要使用反射 在編譯時無法確定要調用的對象的時候,就不得不使用反射。 反射的應用場景 最常見的應用場景有: 1,ORM框架,因為它要面對的是 ...
  • 下載Redis https://github.com/MSOpenTech/redis 修改Redis.windows.conf,如果不修改,遠程不能訪問Redis 將bind 127.0.0.1 改成了bind 0.0.0.0。註意:進入生產環境時候,要啟用密碼,否則會是Redis漏洞. prot... ...
  • 文檔: "http://structuremap.github.io/documentation/" 下載: "https://sourceforge.net/projects/structuremap/" GitHub: "https://github.com/structuremap/struc ...
  • 1,值類型對象有兩種表示形式:未裝箱和已裝箱,相反引用類型總是處於已裝箱形式 2,值類型從System.ValueType派生。該類型提供了與System.Object相同的方法。但是System.ValueType重寫了Equals方法,能在兩個對象的欄位值完全匹配的前提下返回true。此外,Sy ...
  • 代碼格式化:Ctrl K +Ctrl D ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp善用 Ctrl + F 查找題目。本節你可能會需要的兩個測試數據文件:largeW: http://algs4.cs.princeto... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...