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
块
希望对您有所帮助。
我正在尝试从我正在使用 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
块
希望对您有所帮助。