Search code examples
c#loggingmodbus

How can catch log NModbus?


ModbusFactory modbus = new ModbusFactory();
TcpClient tcpClient = new TcpClient("127.0.0.1", 5000);
var master = modbus.CreateMaster(tcpClient);
var data = master.ReadHoldingRegisters(0, 0, 2);

This is my NModbus code. In this case, I expect to get the result data of only response ReadHoldingRegisters(). However, I want to get not only response data but also the request byte array.

ModbusSlave communication log

The above picture is the ModbusSlave program's communication log. That shows RX/TX with a timestamp. How can I get like this RX/TX log in my C# NModbus code?

There are no available logging methods in a document of NModbus GitHub.


Solution

  •     public class GetLogMessage : ModbusLogger
        {
            public List<string> _message { get; set; } = new List<string>();
            public GetLogMessage(LoggingLevel minimumLoggingLevel) : base(minimumLoggingLevel)
            {
            }
    
            protected override void LogCore(LoggingLevel level, string message)
            {
                _message.Add(message);
                if (level == LoggingLevel.Trace) _message.Add(message);
    
                Trace.WriteLine($"[{level}]".PadRight(4) + message);
            }
        }
    

    I found how can get a trace log. First, we create a new class that inherits ModbusLogger. Then create LogCore and Constructure.

    Now we can get RX/TX data in _message.

            GetLogMessage logger = new GetLogMessage(LoggingLevel.Trace);
            ModbusFactory modbus = new ModbusFactory(null,true, logger);
    
            TcpClient client = new TcpClient("127.0.0.1", 5000);
            
            IModbusMaster master = modbus.CreateMaster(client);
            ushort[] res = master.ReadHoldingRegisters(0,0,2);
    
            var getlog = logger._message;
            Console.WriteLine(getlog[0]);
            Console.WriteLine(getlog[5]);
    

    Results

    GetResults