天天看點

《連載 | 物聯網架構ServerSuperIO教程》- 7.自控通訊模式開發及注意事項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通道的話,時間控制會有偏差。

     同樣涉及到資料的分發,和并發模式一樣。通訊結構如下圖:

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

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.圖檔

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

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 

繼續閱讀