2017-08-25 81 views
0

我想從COM端口讀取modbus寄存器我正在使用NModbus4寄存器,但使用readHoldingRegister時,它將簡單地凍結在那裏。 這是我的源代碼:nmodbus ReadHoldingRegisters freeze

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); 
      } 


     } 

    } 
} 

回答

1

設置ReadTimeout或WriteTimeout。在我的情況下,我使用200毫秒。

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

對於我的使用情況下,如果需要更多的則200ms的溝通,這是因爲硬件是不存在的。根據你的通信硬件,你必須改變這個值。

編輯:只是一個離題改進:IModbusSerialMaster是IDisposable。把它放在using區塊

希望這會有所幫助。