標籤:false 過濾 通訊協議 模式 img 資料來源 activemq blog creat
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 宿主程式服務執行個體配置注意事項
在宿主程式中建立服務執行個體的時候,需要把服務執行個體的配置參數設定為自控通訊模式,並啟動服務執行個體,把執行個體化的裝置驅動增加到該服務執行個體中。代碼如下:
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
《連載 | 物聯網架構ServerSuperIO教程》- 7.自控通訊模式開發及注意事項