nmodbus ReadHoldingRegisters 冻结

nmodbus ReadHoldingRegisters freeze

我正在尝试从我正在使用 NModbus4 寄存器的 COM 端口读取 modbus 寄存器,但是当使用 readHoldingRegister 时,它只会冻结在那里。 这是我的源代码:

public static void ModbusSerialAsciiMasterReadRegisters()
    {
        using (SerialPort port = new SerialPort("COM4"))
        {
            // configure serial port
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();

            var adapter = new SerialPortAdapter(port);

            var factory = new ModbusFactory();

            // create modbus master
            IModbusSerialMaster master = factory.CreateAsciiMaster(adapter);

            byte slaveId = 1;
            ushort startAddress = 8193;
            ushort numRegisters = 5;

            // read five registers      
            try
            {
                ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
                for (int i = 0; i < numRegisters; i++)
                {
                    Console.WriteLine($"Register {startAddress + i}={registers[i]}");
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }


        }

    }
}

设置ReadTimeout 或WriteTimeout。就我而言,我使用 200 毫秒。

port.ReadTimeout = 200;
port.WriteTimeout= 200;

对于我的用例,如果通信时间超过 200 毫秒,那是因为硬件不存在。根据与您通信的硬件,您必须更改此值。

编辑: 只是一个题外话的改进:IModbusSerialMaster 是 IDisposable。放在using

希望对您有所帮助。