У меня есть устройство, работающее по протоколу Modbus. Необходимо провести опрос этого устройства. У меня есть функция для чтения данных, но как посмотреть, что возвращает устройство? Спасибо.
static void Main(string[] args)
{
SerialPort mySerialPort = new SerialPort("COM6");
mySerialPort.BaudRate = 19200;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.ReadTimeout = 450;
mySerialPort.WriteTimeout = 3000;
mySerialPort.Open();
mySerialPort.Write(ReadHoldingRegister(02, 1508, 1), 0, 8);
mySerialPort.Close();
}
public static byte[] ReadHoldingRegister(int id, int startAddress, int length)
{
byte[] data = new byte[8];
byte High, Low;
data[0] = Convert.ToByte(id);
data[1] = Convert.ToByte(3);
byte[] _adr = BitConverter.GetBytes(startAddress - 1);
data[2] = _adr[1];
data[3] = _adr[0];
byte[] _length = BitConverter.GetBytes(length);
data[4] = _length[1];
data[5] = _length[0];
myCRC(data, 6, out High, out Low);
data[6] = Low;
data[7] = High;
return data;
}}
Я пытался читать, используя эту функцию.
byte[] ReadExact(Stream s, int nbytes) {
var buf = new byte[nbytes];
var readpos = 0;
while (readpos < nbytes)
readpos += s.Read(buf, readpos, nbytes - readpos);
return buf; }
И чтение из потока:
byte[] response = ReadExact(serial.BaseStream, 9);
Тогда я попытался использовать nmodbus, но нигде не могу найти, как вернуть данные. Вот мой код:
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM6";
serialPort.BaudRate = 19200;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.Open();
ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);
byte slaveID = 2;
ushort startAddress = 1508;
ushort numOfPoints = 1;
ushort[] holding_register = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints);
Console.ReadKey();
serialPort.Close();