Я пытаюсь создать приложение для чтения 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 бод порт открыт, но не будет опрашивать никакие значения.