ClassicDIY / ModbusTool

A modbus master and slave test tool with import and export functionality, supports TCP, UDP and RTU.
Apache License 2.0
636 stars 192 forks source link

Will RTU over TCP be included? #21

Open HerrPausL opened 2 years ago

HerrPausL commented 2 years ago

Hello, is there any Plan to include RTU over TCP? See: https://www.simplymodbus.ca/TCP.htm Or https://github.com/stephane/libmodbus/pull/445

Best Regards, Bernd

TurkeyMan commented 3 months ago

I just came here intending to log this bug. I use ethernet serial servers, so I need RTU over TCP, which isn't an option here it seems...?

HerrPausL commented 3 months ago

Hi, please give me a little bit time to check my source - i was abel to use RTU over TCP :-)

HerrPausL commented 3 months ago

This is my code which is working fine :-)

      private void btnConnect_Click(object sender, EventArgs e)
        {
            if (radioButtonRTU.Checked)
            {
                //_uart = new SerialPort(PortName, Baud, Parity, DataBits, StopBits);
                _uart = new SerialPort(PortName, 115200, Parity.None, 8, StopBits.One);
                _uart.Open();
                _portClient = _uart.GetClient();
                _driver = new ModbusClient(new ModbusRtuCodec()) { Address = SlaveId };
                _driver.OutgoingData += DriverOutgoingData;
                _driver.IncommingData += DriverIncommingData;
            }
            if (radioButtonRTUTCP.Checked)
            {
                try
                {
                    _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    _socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
                    _socket.SendTimeout = 2000;
                    _socket.ReceiveTimeout = 2000;
                    _socket.Connect(new IPEndPoint(IPAddress, 502));
                    _portClient = _socket.GetClient();
                    _driver = new ModbusClient(new ModbusRtuCodec()) { Address = SlaveId };
                    _driver.OutgoingData += DriverOutgoingData;
                    _driver.IncommingData += DriverIncommingData;
                    AppendLog(String.Format("Connected using RTUoverTCP to {0}", _socket.RemoteEndPoint));
                    ConnectionState = 1;
                }
                catch (Exception ex)
                {
                    ConnectionState = 0;
                    AppendLog(ex.ToString());
                }
            }

            if (ConnectionState > 0)
            {
                btnConnect.Enabled = false;
                btnDisconnect.Enabled = true;

                ReadCoil();
                ReadInput();
            }
        }
TurkeyMan commented 3 months ago

Maybe make a PR and get it in the next release?