20.1 概述
ServerSuperIO原來在網路通訊模式下,只有一個網路控制卡,在自控模式、併發模式和單例模式下時都是非同步處理返回的資料,並不會出現效能問題。但是在輪詢模式下,一個網路控制卡要按順序逐一操作裝置驅動的發送和接收,這樣就會出現輪詢周期過長,達不到讀取資料頻率的情況。
為瞭解決上述問題,現在對裝置驅動的參數增加了網路控制卡分組功能,網路控制卡會根據裝置參數設定的分組名稱控制裝置驅動。例如輪詢模式下,有1000個裝置驅動,可以每10個裝置驅動設定相同的分組名稱,這10個裝置驅動受控於同一個網路控制卡,如果每間隔1s讀取一次資料,那麼每個裝置驅動的輪詢周期是10s鐘,其他網路控制卡類似。
20.2 網路控制卡
根據設定裝置驅動網路參數的ControllerGroup,可以把裝置驅動分配到不同的網路控制中運行,並且適用於輪詢、自控、並發和單例控制模式。
20.3 串口控制器
順便提一下串口控制器,通過設定裝置驅動的串口號決定被分配到不同的串口控制器,該控制器只能適用於輪詢控制模式。
20.4 裝置驅動網路控制卡分組範例程式碼
static void Main(string[] args) { string deviceID = "2"; DeviceDriver dev3 = new DeviceDriver(); dev3.DeviceParameter.DeviceName = "裝置2"; dev3.DeviceParameter.DeviceAddr = 0; dev3.DeviceParameter.DeviceID = deviceID; dev3.DeviceParameter.DeviceCode = deviceID; dev3.DeviceDynamic.DeviceID = deviceID; dev3.DeviceParameter.NET.RemoteIP = "127.0.0.1"; dev3.DeviceParameter.NET.RemotePort = 9600; dev3.DeviceParameter.NET.ControllerGroup = "G2"; dev3.CommunicateType = CommunicateType.NET; dev3.DeviceParameter.NET.WorkMode = WorkMode.TcpServer; dev3.Initialize(deviceID); deviceID = "3"; DeviceDriver dev4 = new DeviceDriver(); dev4.DeviceParameter.DeviceName = "裝置3"; dev4.DeviceParameter.DeviceAddr = 0; dev4.DeviceParameter.DeviceID = deviceID; dev4.DeviceParameter.DeviceCode = deviceID; dev4.DeviceDynamic.DeviceID = deviceID; dev4.DeviceParameter.NET.RemoteIP = "127.0.0.1"; dev4.DeviceParameter.NET.RemotePort = 9600; dev4.DeviceParameter.NET.ControllerGroup = "G3"; dev4.CommunicateType = CommunicateType.NET; dev4.Initialize(deviceID); IServer server = new ServerManager().CreateServer(new ServerConfig() { ServerName = "服務1", ComReadTimeout = 1000, ComWriteTimeout = 1000, NetReceiveTimeout = 1000, NetSendTimeout = 1000, ControlMode = ControlMode.Loop, SocketMode = SocketMode.Tcp, StartReceiveDataFliter = false, ClearSocketSession = true, StartCheckPackageLength = false, CheckSameSocketSession = false, }); server.AddDeviceCompleted += server_AddDeviceCompleted; server.DeleteDeviceCompleted += server_DeleteDeviceCompleted; server.SocketConnected+=server_SocketConnected; server.SocketClosed+=server_SocketClosed; server.Start(); server.AddDevice(dev3); server.AddDevice(dev4); while ("exit"==Console.ReadLine()) { server.Stop(); } }