《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通訊模式開發及注意事項。附:網友製作的類庫說明(CHM)
目 錄
5. 輪詢通訊模型開發及注意事項... 2
4.1 概述... 2
4.2 通訊機制說明... 2
4.3 裝置驅動開發注意事項... 3
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框架優先排程該裝置驅動。
- 把命令增加發送資料快取中,框架從快取中獲得資料後會自動刪除,程式碼如下:
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
物聯網&整合技術(.NET) QQ群:54256083