Программа считывает показания преобразователя давления СДВ с интерфейсом RS485 по протоколу ModBus через USB-адаптер "Меркурий 221".
Настройки порта выглядат так:
SerialPort SPort; SPort = new SerialPort(lstPorts.Text); SPort.BaudRate = Convert.ToInt32(lstBaudrate.SelectedItem.ToString()); SPort.Parity = Parity.Even; SPort.DataBits = 8; SPort.StopBits = StopBits.One; SPort.ReadTimeout = 2000; SPort.WriteTimeout = 1000; |
Далее заполняем массив байт для отправки сообщения на устройство:
byte device_address=Convert.ToByte(txtDeviceAddress.Text); byte data_type = 0x03; Int64 start_address = Convert.ToInt64(txtStartAddress.Text); //start_address = 0x28; Int64 amount_bytes = 2; start_address=start_address -1;
Int64 start_address_higer=start_address/256; Int64 start_address_lower=start_address % 256;
Int64 amount_bytes_higer=amount_bytes/256; Int64 amount_bytes_address_lower=amount_bytes % 256;
byte[] toSend = new byte[8];
toSend[0] = device_address; toSend[1] = data_type; toSend[2] = (byte)start_address_higer; toSend[3] = (byte)start_address_lower; toSend[4] = (byte)amount_bytes_higer; toSend[5] = (byte)amount_bytes_address_lower;
int crc_result=CRC.crc16(toSend, 6); byte[] crc_bytes=BitConverter.GetBytes(crc_result); toSend[6]= crc_bytes[1]; toSend[7]= crc_bytes[0]; |
где CRC - класс расчета контрольной суммы. Ну и сама функция считывания данных с устройства выглядит так:
byte[] buf = new byte[5 + 2*(amount_bytes)]; str_out = Convert.ToString(toSend); SPort.Write(toSend, 0, 8); int btor = SPort.BytesToRead;
for (int i = 0; i < (5 + 2*(amount_bytes)); i++) { buf[i] = (byte)(SPort.ReadByte()); } |
|