/// <summary> /// Stops the proxy. /// </summary> /// <returns></returns> public Task StopAsync() { try { logger?.LogTrace("ModbusTcpSerialProxy.StopAsync enter"); CheckDisposed(); if (!isStarted) { return(Task.CompletedTask); } isStarted = false; server?.Dispose(); server = null; client?.Dispose(); client = null; return(Task.CompletedTask); } finally { logger?.LogTrace("ModbusTcpSerialProxy.StopAsync leave"); } }
/// <summary> /// Starts the proxy. /// </summary> /// <returns></returns> public async Task StartAsync() { try { logger?.LogTrace("ModbusTcpSerialProxy.StartAsync enter"); CheckDisposed(); if (isStarted) { return; } isStarted = true; client = new ModbusClient(settings.PortName, logger) { BaudRate = settings.BaudRate, DataBits = settings.DataBits, Handshake = settings.Handshake, Parity = settings.Parity, StopBits = settings.StopBits }; await client.Connect(); server = new ModbusServer(settings.ListenPort, settings.ListenAddress, logger, HandleRequest); await server.Initialization; } finally { logger?.LogTrace("ModbusTcpSerialProxy.StartAsync leave"); } }
private static async Task <int> RunServerAsync(ILogger logger, CancellationToken cancellationToken) { Console.Write("Connection Type [1] TCP, [2] RS485: "); int cType = Convert.ToInt32(Console.ReadLine().Trim()); IModbusServer server = null; try { switch (cType) { case 1: { Console.Write("Bind IP address: "); var ip = IPAddress.Parse(Console.ReadLine().Trim()); Console.Write("Port: "); int port = Convert.ToInt32(Console.ReadLine().Trim()); var tcp = new TcpServer(port, ip, logger) { Timeout = TimeSpan.FromSeconds(3) }; server = tcp; } break; case 2: { Console.Write("Interface: "); string port = Console.ReadLine().Trim(); Console.Write("Baud: "); int baud = Convert.ToInt32(Console.ReadLine().Trim()); Console.Write("Stop-Bits [0|1|2|3=1.5]: "); int stopBits = Convert.ToInt32(Console.ReadLine().Trim()); Console.Write("Parity [0] None [1] Odd [2] Even [3] Mark [4] Space: "); int parity = Convert.ToInt32(Console.ReadLine().Trim()); Console.Write("Handshake [0] None [1] X-On/Off [2] RTS [3] RTS+X-On/Off: "); int handshake = Convert.ToInt32(Console.ReadLine().Trim()); Console.Write("Timeout (ms): "); int timeout = Convert.ToInt32(Console.ReadLine().Trim()); server = new SerialServer(port) { BaudRate = (BaudRate)baud, DataBits = 8, StopBits = (StopBits)stopBits, Parity = (Parity)parity, Handshake = (Handshake)handshake, Timeout = TimeSpan.FromMilliseconds(timeout) }; } break; default: throw new ArgumentException("Type unknown"); } server.AddDevice(1); server.AddDevice(5); server.AddDevice(10); Register.Create(123.45f, 100, false).ForEach(r => server.SetHoldingRegister(1, r)); Console.WriteLine("Server is running... press CTRL+C to exit."); await Task.Delay(Timeout.Infinite, cancellationToken); } catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested) { } finally { server?.Dispose(); } return(0); }