程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通訊模式開發及注意事項,樓宇自控物聯網

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

編輯:C#入門知識

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


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框架優先調度該設備驅動。

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    宿主程序服務實例配置注意事項

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved