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

来源:http://www.cnblogs.com/lsjwq/archive/2016/11/13/6060239.html
-Advertisement-
Play Games

1.C#跨平臺物聯網通訊框架ServerSuperIO(SSIO)介紹 《連載 | 物聯網框架ServerSuperIO教程》1.4種通訊模式機制。 《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明 《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅 ...


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

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

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

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

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

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

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

 

目       錄

7. 自控通訊模式開發及註意事項... 2

7.1           概述... 2

7.2           通訊機制說明... 2

7.3           設備驅動開發註意事項... 3

7.3.1    實時發送數據... 3

7.3.2    發送固定實時請求數據命令... 4

7.3.3    優先發送其他數據... 4

7.3.4    如何選擇IO通道發送數據... 5

7.3.5    如何以DeviceCode分配數據... 5

7.3.6    如何改變設備驅動的狀態... 6

7.4           宿主程式服務實例配置註意事項... 6

7.5           自控模式運行效果... 8

7. 自控通訊模式開發及註意事項 

7.1    概述

     自控通訊模式與併發通訊模式類似,唯一的區別是發送請求數據命令,自控通訊模式可以使用定時器,定時發送請求數據命令,不再像併發通訊模式集中發送。

     在工業物聯網建設中,設備不同、協議不同、場景不同,對於某些不同的設備定時採集數據的頻率也不一樣,過於高頻的數據採集也是對資源的一種浪費,所以就供給二次開發者在開發設備驅動的時候更自主的控制模式。

7.2    通訊機制說明

     只有網路通訊時可以使用這種控制模式。自控通訊模式與併發通訊模式類似,區別在於發送指令操作交給設備驅動本身進行控制,或者說交給二次開發者,二次開發者可以通過時鐘定時用事件驅動的方式發送指令數據。硬體設 備接收到指令後進行校驗,校驗成功後返回對應指令的數據,通訊平臺非同步監聽到數據信息後,進行接收操作,然後再進行數據的分發、處理等。

     自控通訊模式可以為二次開發者提供精確的定時請求實時數據機制,使通訊機制更靈活、自主,如果多個設備驅動共用使用同一個IO通道的話,時間控制會有偏差。

     同樣涉及到數據的分發,和併發模式一樣。通訊結構如下圖:

 

 

7.3    設備驅動開發註意事項

7.3.1    實時發送數據

     ServerSuperIO框架的IRunDevice驅動介面有一個GetSendBytes函數,此函數介面會同時協調調用GetConstantCommand固定請求數據介面和SendCache發送數據的緩存器,並設置設備的優先順序別進行調度。

     可以繼承以前寫的設備驅動,在此基礎上增加定時發送數據的代碼。代碼如下:

public class DeviceSelfDriver:DeviceDriver
 {
        public DeviceSelfDriver() : base()
        {
        }

        public override void Initialize(string devid)
        {
            base.Initialize(devid);
            this.RunTimerInterval = 5000;
            this.IsRunTimer = true;
        }

        public override void OnRunTimer()
        {
            byte[] data = this.GetSendBytes();
            OnSendData(data);
            base.OnRunTimer();
        }
  }

7.3.2    發送固定實時請求數據命令

     自控通訊模式定時發送請求數據命令,同樣是以呼叫應答的方式向設備發送請求實時數據命令,對於同一個設備的請求實時數據命令一般相對固定。在調度某一具體設備驅動的時候,會調用固定的調用IRunDevice驅動介面的GetConstantCommand函數,以獲得請求實時數據的命令。代碼如下:

public override byte[] GetConstantCommand()
{
            byte[] data = this.Protocol.DriverPackage<String>("0", "61", null);
            string hexs = BinaryUtil.ByteToHex(data);
            OnDeviceRuningLog("發送>>"+hexs);
            return data;
  }

      this.Protocol.DriverPackage驅動調用61命令獲得要發送的命令,並返回byte[]數組,ServerSuperIO獲得數據後會自動通過IO介面下發命令數據。如果返回null類型,系統不進行下發操作。

7.3.3    優先發送其他數據

     對於一個設備不可能只有一個讀實時數據的命令,可能還存在其他命令進行交互,例如:讀參數、實時校準等,這時就需要進行優先順序調度發送數據信息。可以通過兩種方式讓ServerSuperIO框架優先調度該設備驅動。

  1. 把命令增加發送數據緩存中,框架從緩存中獲得數據後會自動刪除,代碼如下:
this.Protocol.SendCache.Add("讀參數",readParaBytes);

      2.設置設備的優先順序別屬性,代碼如下:

this.DevicePriority=DevicePriority.Priority;

7.3.4    如何選擇IO通道發送數據

    集中發送數據時,涉及到如何關聯設備驅動與IO通道,框架會以DeviceParameter.NET.RemoteIP設置的終端IP參數進行選擇IO通道發送數據。但是如果終端設備是動態IP地址的話,那麼RemoteIP參數也應該是變動的。這時就需要設置服務實例是以DeviceCode的方式分佈數據到設備驅動,終端設備先發送簡單的驗證數據,保證發送的DeviceCode與設備驅動的相對應,設備驅動接收到驗證數據後需要保存臨時的RemoteIP信息,這樣保證在發送數據的時候參數準確找到要請求數據的IO通道到終端設備。

例如下麵代碼:

public override void Communicate(ServerSuperIO.Communicate.IRequestInfo info)
{
            this.DeviceParameter.NET.RemoteIP = info.Channel.Key;
            this.DeviceParameter.Save(this.DeviceParameter);
            ……
}

7.3.5    如何以DeviceCode分配數據

    如果服務實例設置以DeliveryMode.DeviceCode模式分配數據,那麼就需要在通訊協議介面里實現過濾DeviceCode編碼的介面。

    例如下麵的代碼:

  internal class DeviceProtocol:ProtocolDriver
    {
        public override string GetCode(byte[] data)
        {
            byte[] head = new byte[] {0x55, 0xaa};
            int codeIndex = data.Mark(0, data.Length, head);
            if (codeIndex == -1)
            {
                return String.Empty;
            }
            else
            {
                return data[codeIndex + head.Length].ToString();
            }
        }
}

7.3.6    如何改變設備驅動的狀態

      不像輪詢通訊模式,發送數據、接收數據是一個輪迴,在接收數據的過程後驅動設備驅動,設備執行整個生命周期的流程,根據接收到的數據,會自動改變設備驅動的狀態。

      自控通訊模式和併發通訊模式更多強調請求數據的方式不同,那麼不能一直發送請求數據命令,而設備狀態一直不改變,例如:通訊正常變成了通訊中斷、通訊中斷變成了通訊正常。這兩種通訊模式的發送與接收過程有一個協調機制,發送3次請求數據命令,而沒有接收到任何數據,會自動調用設備驅動的介面,以驅動設備驅動的整個執行的流程,這樣設備的狀態會自動發生改變,而不需要二次開發寫相應的代碼。

7.4    宿主程式服務實例配置註意事項

   在宿主程式中創建服務實例的時候,需要把服務實例的配置參數設置為自控通訊模式,並啟動服務實例,把實例化的設備驅動增加到該服務實例中。代碼如下:

 

static void Main(string[] args)
        {
            DeviceDriver dev1 = new DeviceDriver();
            dev1.DeviceParameter.DeviceName = "串口設備";
            dev1.DeviceParameter.DeviceAddr = 0;
            dev1.DeviceParameter.DeviceID = "0";
            dev1.DeviceDynamic.DeviceID = "0";
            dev1.DeviceParameter.DeviceCode = "0";
            dev1.DeviceParameter.COM.Port = 1;
            dev1.DeviceParameter.COM.Baud = 9600;
            dev1.CommunicateType = CommunicateType.COM;
            dev1.Initialize("0");

            DeviceSelfDriver dev2 = new DeviceSelfDriver();
            dev2.DeviceParameter.DeviceName = "網路設備";
            dev2.DeviceParameter.DeviceAddr = 1;
            dev2.DeviceParameter.DeviceID = "1";
            dev2.DeviceDynamic.DeviceID = "1";
            dev2.DeviceParameter.DeviceCode = "1";
            dev2.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev2.DeviceParameter.NET.RemotePort = 9600;
            dev2.CommunicateType = CommunicateType.NET;
            dev2.Initialize("1");

            IServer server = new ServerManager().CreateServer(new ServerConfig()
            {
                ServerName = "服務1",
                ComReadTimeout = 1000,
                ComWriteTimeout = 1000,
                NetReceiveTimeout = 1000,
                NetSendTimeout = 1000,
                ControlMode = ControlMode.Self,
                SocketMode = SocketMode.Tcp,
                StartReceiveDataFliter = false,
                ClearSocketSession = false,
                StartCheckPackageLength = false,
                CheckSameSocketSession = false,
                DeliveryMode = DeliveryMode.DeviceCode,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted+=server_DeleteDeviceCompleted;
            server.Start();

            server.AddDevice(dev1);
            server.AddDevice(dev2);

            while ("exit" == Console.ReadLine())
            {
                server.Stop();
            }
}

     ControlMode = ControlMode. Self代碼是設置服務實例調度設備為併發控制模式;以DeliveryMode = DeliveryMode.DeviceCode方式進行數據分發,當然我現在模擬的是固定的終端IP。

7.5    自控模式運行效果

1.圖片

 

2.視頻


 

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 


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

-Advertisement-
Play Games
更多相關文章
  • 添加引用時生成”勾選允許生成非同步操作” Wcf非同步調用三種方式: 第一種:直接調用非同步方法 var serviceClient = new MyServiceClient(); serviceClient.MessageAsync(); erviceClient.Close(); 第二種:Begin ...
  • 一、MessageBox的Buttons MessageBox.Show可以出現有按鈕的對話框 例如: DialogResult dr = MessageBox.Show("是否要繼續嗎?", "警告!!!", MessageBoxButtons.OKCancel);//它彈出的對話框如下圖所示if ...
  • 一、客戶端設計思路 1.理順設計思路,架構框架 2.設計界面 3.編寫後臺代碼 4.資料庫訪問 二、公共控制項 1、Button(按鈕): ⑴ Enabled :確定是否啟用控制項 ⑵ Visible:確定控制項是否課件; 2、CheckBox(多選項) 、CheckListBox -(多選項列表) 3、 ...
  • Asp.Net MVC4 BundleConfig文件合併、壓縮,網站優化加速 Asp.Net MVC4 BundleConfig文件合併、壓縮,網站優化加速 瀏覽器在向伺服器發送請求的時候,請求的文件鏈接數量是有限制的,如果頁面文件少就沒有什麼問題了,如果文件太多就會導致鏈接失敗等等問題。針對這個 ...
  • C# 知識回顧 - 事件入門 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通過《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》介紹了委托的基本知識,這次我們來看看 ...
  • ASP.NET Core管道雖然在結構組成上顯得非常簡單,但是在具體實現上卻涉及到太多的對象,所以我們在 “通過重建Hosting系統理解HTTP請求在ASP.NET Core管道中的處理流程”(上篇、中篇、下篇) 中圍繞著一個經過極度簡化的模擬管道講述了真實管道構建的方式以及處理HTTP請求的流程... ...
  • 問題 我們想快速啟動一個 ASP.NET Web API 解決方案。 解決方案 APS.NET 模板一開始就支持 ASP.NET Web API。使用模板往我們的項目中添加 Controller,在我們解決方案的 Controllers 文件夾上右鍵,選擇“添加”->"Scaffolding"。 即 ...
  • 發現問題 需求很簡單,大致就是要批量往資料庫寫數據,於是打算用Parallel並行的方式寫入,希望能利用電腦多核特性加快程式執行速度。想的很美好,於是快速擼了類似下麵的一串代碼: 可意外的是竟然無情的報錯了: 奇葩的是當我再次刷新的時候異常又不一樣了,於是連著刷新好多次,總結出現過的異常有下麵這些 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...