public ProtocolHandler(Transport transport, SiemensPlcProtocolContext s7Context, Action <ProtocolHandler, ConnectionState> connectionStateChanged, ILoggerFactory loggerFactory, Action <Socket> newSocketConnected = null, IPlcDataProvider provider = null) { _logger = loggerFactory?.CreateLogger <ProtocolHandler>(); _transport = transport; _s7Context = s7Context; _connectionStateChanged = connectionStateChanged; _loggerFactory = loggerFactory; _newSocketConnected = newSocketConnected; _provider = provider; _logger?.LogDebug("S7Protocol-Timeout is {0} ms", _s7Context.Timeout); SetupTransport(transport, loggerFactory); }
private static async Task <int> Serve(ServerOptions options, ILoggerFactory loggerFactory) { Dacs7Client client = null; IPlcDataProvider provider = null; if (string.IsNullOrWhiteSpace(options.DataProvider) || options.DataProvider.Equals("Simulation", StringComparison.InvariantCultureIgnoreCase)) { if (options.Tags != null) { foreach (var item in options.Tags) { var ri = ReadItem.CreateFromTag(item); Console.WriteLine($"Register tag {item}"); SimulationPlcDataProvider.Instance.Register(ri.Area, ri.NumberOfItems, ri.DbNumber); } } Console.WriteLine("Using Simulation Provider!"); provider = SimulationPlcDataProvider.Instance; } else if (options.DataProvider.Equals("Relay", StringComparison.InvariantCultureIgnoreCase)) { client = new Dacs7Client(options.Address, PlcConnectionType.Pg, 5000, loggerFactory) { MaxAmQCalled = (ushort)options.MaxJobs, MaxAmQCalling = (ushort)options.MaxJobs, PduSize = options.MaxPduSize }; RelayPlcDataProvider.Instance.UseClient(client); Console.WriteLine("Using Relay Provider!"); provider = RelayPlcDataProvider.Instance; } var server = new Dacs7Server(options.Port, provider, loggerFactory) { MaxAmQCalled = (ushort)options.MaxJobs, MaxAmQCalling = (ushort)options.MaxJobs, PduSize = (ushort)480 }; var logger = loggerFactory?.CreateLogger("Dacs7Cli.Serve"); try { Console.WriteLine($"Started serving on port {options.Port} !"); await server.ConnectAsync(); if (client != null) { await client.ConnectAsync(); } Console.WriteLine("Please press any key to stop serving!"); Console.ReadKey(); } catch (Exception ex) { logger?.LogError($"An error occured in Serve: {ex.Message} - {ex.InnerException?.Message}"); return(1); } finally { if (client != null) { await client.DisconnectAsync(); } await server.DisconnectAsync(); } return(0); }