コード例 #1
0
        /// <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");
            }
        }
コード例 #2
0
        /// <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");
            }
        }
コード例 #3
0
        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);
        }