《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通信模式開發及注意事項。附:網友製做的類庫說明(CHM)

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

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

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

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

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

 

目       錄網絡

5. 輪詢通信模型開發及注意事項... 2併發

4.1           概述... 2app

4.2           通信機制說明... 2框架

4.3           設備驅動開發注意事項... 3ide

4.3.1    實時發送數據... 3

4.3.2    優先發送其餘數據... 3

4.4           宿主程序服務實例配置注意事項... 4

4.5           輪詢運行效果... 4

5. 輪詢通信模型開發及注意事項  

4.1    概述

      輪詢通信模式是SuperIO最先且惟一的通信模式,在此基礎上增長了自控模式、併發模式。ServerSuperIO框架除了具有這3種通信模式外,還具有單例模式,後邊會對這些通信模式進行詳細介紹。

      剛參加工做的時候,也不知道什麼通信模式,可是當時工業領域的通信環境很是複雜,調製解調的通信鏈路,300波特率的傳輸速率,受地質、電纜等強電磁干擾,常常會出現數據被幹擾的現象。當時也沒有所謂的互聯網技術,爲了保障通信的穩定性,只能進行輪詢的通信模式。

4.2    通信機制說明

      這是框架最先的運行模式,串口和網絡通信時均可以使用這種控制模式。當有多個設備 鏈接到通信平臺時,通信平臺會輪詢調度設備進行通信任務。某一時刻只能有一個設備發送請求命令、等待接收返回數據,這個設備完成發送、接收(若是遇到超時 狀況,則自動返回)後,下一個設備才進行通信任務,依次輪詢設備。

      應用場景是這樣的,服務端與設備進行通信遵循呼叫應答的方式,也就是IO可用的狀況下,服務端先發起通信命令請求,設備根據命令信息,檢驗經過後返回數據給服務端。這種通信模式很好理解,每一個設備的通信都遵循排隊的原則。可是若是某個設備的命令須要及時發送,怎麼辦?ServerSuperIO框架是支持設備優先級別調度的,例如:對某個設備要進行實時的檢測,須要連續發送命令,那麼就須要對設備進行高級別設置,發送請求數據命令。

     通信結構以下圖:

 

4.3    設備驅動開發注意事項

4.3.1    實時發送數據

     ServerSuperIO框架會輪詢調度全部設備,以呼叫應答的方式向設備發送請求實時數據命令,對於同一個設備的請求實時數據命令通常相對固定。在調度某一具體設備驅動的時候,會調用固定的調用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類型,系統不進行下發操做。

4.3.2    優先發送其餘數據

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

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

      2.設置設備的優先級別屬性,代碼以下:

this.DevicePriority=DevicePriority.Priority;

4.4    宿主程序服務實例配置注意事項

      在宿主程序中建立服務實例的時候,須要把服務實例的配置參數設置爲輪詢通信模式,並啓動服務實例,把實例化的設備驅動增長到該服務實例中。代碼以下:

DeviceDriver dev1 = new DeviceDriver();
dev1.DeviceParameter.DeviceName = "串口設備1";
dev1.DeviceParameter.DeviceAddr = 0;
dev1.DeviceParameter.DeviceID = "0";
dev1.DeviceDynamic.DeviceID = "0";
dev1.DeviceParameter.COM.Port = 1;
dev1.DeviceParameter.COM.Baud = 9600;
dev1.CommunicateType = CommunicateType.COM;
dev1.Initialize("0");
IServer server = new ServerFactory().CreateServer(new ServerConfig()
{
      ServerName = "服務實例1",
      SocketMode = SocketMode.Tcp,
      ControlMode = ControlMode.Loop,
      CheckSameSocketSession = false,
      StartCheckPackageLength = false,
});
server.Start();
server.AddDevice(dev1);

     ControlMode = ControlMode.Loop代碼是設置服務實例調度設備爲輪詢控制模式。

4.5    輪詢運行效果

1.圖片

 

2.視頻


 

附:羣裏網友製做的類庫說明(CHM),網友名稱:norman33,QQ號:235936468。感謝norman33,共建美好社區。下載地址:http://pan.baidu.com/s/1qXDVIvq


 

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  

相關文章
相關標籤/搜索