Пример #1
0
        // Обработка нажатия кнопки Записать
        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;
            }
        }
Пример #2
0
        // Обработка нажатия кнопки Синхронизировать время
        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;
            }
        }