Столкнулся с проблемой: необходимо считывать данные с устройств по протоколу modbus. Я не могу понять, как получить ответ от устройства.
Я вызываю свою функцию, но как мне получить данные с устройства? Может, кто-то может помочь.
P.S. Готовые библиотеки типа nmodbus, я использовал, но хочу разобраться как это сделать самому.
static void Main(string[] args)
{
//Connection comPort = new Connection("COM6", 19200, 8);
//comPort.readHoldingCom(2, 0x600, 16);
//comPort.writeHoldingCom(2, 0x44E, 0x0100);
//Connection portTCP = new Connection("192.168.127.12", 4001);
//portTCP.readHoldingTcp(2, 0x600, 16);
var serial = new SerialPort("COM6", 19200);
serial.Handshake = Handshake.None;
serial.Parity = Parity.None;
serial.DataBits = 8;
serial.StopBits = StopBits.One;
serial.Open();
serial.Write(ReadHoldingRegister(2, 1024, 16), 0, 8);
ReadReponse(serial);
serial.Close();
Console.ReadLine();
}
static void ReadReponse(SerialPort serial)
{
Console.WriteLine("Чтение ответа...");
var byteBuffer = GetData(serial);
var firstRegValue = CreateRegValue(byteBuffer[3], byteBuffer[4]);
Console.WriteLine(firstRegValue);
var secondRegValue = CreateRegValue(byteBuffer[5], byteBuffer[6]);
Console.WriteLine(secondRegValue);
Console.ReadKey();
}
static Int16 CreateRegValue(byte hiByte, byte lowByte)
{
return (Int16)(hiByte << 8 | lowByte);
}
static byte[] GetData(SerialPort serial)
{
int offset = 0;
var byteBuffer = new byte[9];
while (offset < 9)
{
offset += serial.Read(ReadHoldingRegister(2, 1024, 16), 0, 8);
}
return byteBuffer;
}
#region Function 3
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;
}
#endregion
#region CRC
public static void myCRC(byte[] message, int length, out byte CRCHigh, out byte CRCLow)
{
ushort CRCFull = 0xFFFF;
for (int i = 0; i < length; i++)
{
CRCFull = (ushort)(CRCFull ^ message[i]);
for (int j = 0; j < 8; j++)
{
if ((CRCFull & 0x0001) == 0)
CRCFull = (ushort)(CRCFull >> 1);
else
{
CRCFull = (ushort)((CRCFull >> 1) ^ 0xA001);
}
}
}
CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
CRCLow = (byte)(CRCFull & 0xFF);
}
#endregion
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
имеем небольшой кусок кода, который по клику на кнопку вызывает cmd, и в ней исполняет apache benchНадо показать прогресс бар
Выполняю удаленную отладку сайта, который находится на веб-сервере IIS
Как я могу загрузить файл через WebClientUploadFile на сервера Telegram? И потом отправить его пользователю?