// Обработка нажатия кнопки Записать private void CM_REG_WRITE_BTN_Click(object sender, EventArgs e) { byte[] Buffer = new byte[9]; byte reg_address = 0; uint reg_data = 0; reg_address = (byte)Convert.ToInt32(CM_REG_ADDRESS_BOX.Text, 16); reg_data = (uint)Convert.ToInt32(CM_REG_DATA_BOX.Text, 16); Buffer[0] = Modbus.NODE_ADDRESS; Buffer[1] = Modbus.WRITE_REGISTER; // Адрес первого регистра Buffer[2] = Modbus.GRUP_CM1K_REGISTER; Buffer[3] = reg_address; // Количество регистров для записи Buffer[4] = 0x01; // Данные для записи Buffer[5] = (byte)(reg_data >> 8); Buffer[6] = (byte)reg_data; // Вычисляем контрольную сумму uint crc = Modbus.CRC16(Buffer, (uint)Buffer.Length - 2); Buffer[7] = (byte)(crc); Buffer[8] = (byte)(crc >> 8); // Пытаемся отправить пакет try { serialPort1.Write(Buffer, 0, Buffer.Length); } catch (Exception ex) { serialPort1.Close(); MessageBox.Show("Error writing to serial port - " + ex.Message, "Error!"); return; } // Ждем секунду Wait(1); // Проверяем, есть ли пакет try { int sss = serialPort1.Read(Buffer, 0, Buffer.Length); if ((sss == 0) && (Buffer[0] != Modbus.NODE_ADDRESS)) { toolStripStatusLabel3.Text = "Data not write!"; } else { toolStripStatusLabel3.Text = "Data write!"; } } catch (Exception ex) { MessageBox.Show("Error reading from serial port - " + ex.Message, "Error!"); return; } }
// Обработка нажатия кнопки Синхронизировать время private void DATA_TIME_BTN_Click(object sender, EventArgs e) { byte[] Buffer = new byte[19]; // Готовим пакет с текущим временем Buffer[0] = Modbus.NODE_ADDRESS; Buffer[1] = Modbus.WRITE_REGISTERS; // Адрес первого регистра Buffer[2] = Modbus.GRUP_CLOCK_REGISTER; Buffer[3] = 0x00; // Количество регистров для записи Buffer[4] = 0x06; // Регистр секунд Buffer[5] = 0x00; Buffer[6] = (byte)DateTime.Now.Second; // Регистр минут Buffer[7] = 0x00; Buffer[8] = (byte)DateTime.Now.Minute; // Регистр часов Buffer[9] = 0x00; Buffer[10] = (byte)DateTime.Now.Hour; // Регистр дата Buffer[11] = 0x00; Buffer[12] = (byte)DateTime.Now.Day; // Регистр месяц Buffer[13] = 0x00; Buffer[14] = (byte)DateTime.Now.Month; // Регистр год Buffer[15] = 0x00; Buffer[16] = (byte)(DateTime.Now.Year - ((DateTime.Now.Year / 1000) * 1000)); // Вычисляем контрольную сумму uint crc = Modbus.CRC16(Buffer, (uint)Buffer.Length - 2); Buffer[17] = (byte)(crc); Buffer[18] = (byte)(crc >> 8); // Настройка timeouts serialPort1.WriteTimeout = Convert.ToInt32(WRITE_TIME_OUT.Text); serialPort1.ReadTimeout = Convert.ToInt32(READ_TIME_OUT.Text); // Пытаемся отправить пакет try { serialPort1.Write(Buffer, 0, Buffer.Length); } catch (Exception ex) { serialPort1.Close(); MessageBox.Show("Error writing to serial port - " + ex.Message, "Error!"); return; } toolStripStatusLabel3.Text = "Process"; // Очищаем приемный буфер for (byte x = 0; x < Buffer.Length; x++) { Buffer[x] = 0; } // Ждем секунду Wait(1); // Проверяем, есть ли пакет try { int sss = serialPort1.Read(Buffer, 0, Buffer.Length); if (Buffer[0] != Modbus.NODE_ADDRESS) { toolStripStatusLabel3.Text = "Time no updated!"; } else { toolStripStatusLabel3.Text = "Time updated!"; } } catch (Exception ex) { MessageBox.Show("Error reading from serial port - " + ex.Message, "Error!"); return; } }