Nmodbus возвращает NotImplementedException: код функции 123 не поддерживает исключение при чтении данных ответа - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь создать приложение для чтения Modbus с использованием библиотеки NModbus , но при подключении к порту выдает следующее ошибка :

System.NotImplementedException: Function code 123 not supported.
at Modbus.IO.ModbusRtuTransport.ResponseBytesToRead(Byte[] frameStart)
at Modbus.IO.ModbusRtuTransport.ReadResponse[T]()
at Modbus.IO.ModbusTransport.UnicastMessage[T](IModbusMessage message)
at Modbus.Device.ModbusMaster.PerformReadRegisters(ReadHoldingInputRegistersReques t request)
at Modbus.Device.ModbusMaster.ReadHoldingRegisters(Byte slaveAddress, UInt16 
startAddress, UInt16 numberOfPoints)
at ModbusReaderSnippet.Program.Main(String[] args).

вот фрагмент моего кода :

static void Main(string[] args)
{
    Console.WriteLine("Please enter the com port :");
    string comPort = Console.ReadLine();
    Console.WriteLine("Please enter slave id :");
    byte slave = Convert.ToByte(Console.ReadLine());
    Console.WriteLine("Please enter starting register number :");
    ushort startRegister = Convert.ToUInt16(Console.ReadLine());
    Console.WriteLine("Please enter no. of registers to read :");
    ushort noOfRegisters = Convert.ToUInt16(Console.ReadLine());
    bool flag = true;
    Console.WriteLine("Please enter baud rate : ");
    int baud = Convert.ToInt32(Console.ReadLine());

    try
    {
        while (flag)
        {

            SerialPort port = new SerialPort(comPort.ToUpper());
            port.BaudRate = baud;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.ReadTimeout = 500000000;
            port.WriteTimeout = 500000000;
            Console.WriteLine("Opening port");
            if (port.IsOpen == true)
            {
                port.Close();
                port.Open();
            }
            else
            {
                port.Open();
            }
            Console.WriteLine("Opened port : {0}", comPort.ToUpper());
            IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);


            byte slaveId = slave;
            ushort startAddress = startRegister;
            ushort numRegisters = noOfRegisters;

            ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);

            for (int j = 0; j < numRegisters; j++)
            {
                Console.WriteLine("Register {0} = {1} of Slave{2}", startAddress + j, registers[j], slaveId);
            }
            port.Close();
            Console.WriteLine("Do you want to continue ? Y/N");
            string perm = Console.ReadLine();
            flag = perm == "Y" || perm == "y" ? true : false;
            if (perm == "Y" || perm == "y")
            {
                Console.WriteLine("Please enter slave id : ");
                slave = Convert.ToByte(Console.ReadLine());
            }
        }
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    Console.ReadLine();
}

когда я пытаюсь прочитать регистры с 3961 по 3971 или любые другие регистры, выдает ошибку выше.

Я посмотрел в библиотеке Nmodbus и обнаружил, что ответ, полученный от счетчика со скоростью 9600 бод, недоступен в операторе switch case в методе Modbus.IO.ModbusRtuTransport.ResponseBytesToRead(Byte[] frameStart), который считывает ответ и отправляет значения регистра обратно.

Вопрос : что я мог сделать, чтобы преодолеть эту проблему. На скорости 2400 бод порт открыт, но не будет опрашивать никакие значения.

...