Работа с Modbus RTU и чтение значений удержания в c# - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над последовательной связью в течение нескольких дней. Я видел много обучающих программ по этому и попытался осуществить это. Я могу подключиться к порту COM и отправлять и получать данные.

 private void sendData()
        {
        bool error = false;
        if (rdText.Checked == true)        //if text mode is selected, send data as tex
            {
            // Send the user's text straight out the port 
            ComPort.Write(txtSend.Text );

            // Show in the terminal window 
            rtxtDataArea.ForeColor = Color.Green;    //write sent text data in green colour              
            txtSend.Clear();                       //clear screen after sending data

            }
        else                    //if Hex mode is selected, send data in hexadecimal
            {
            try
                {
                // Convert the user's string of hex digits (example: E1 FF 1B) to a byte array
                byte[] data = HexStringToByteArray(txtSend.Text);

                // Send the binary data out the port
              ComPort.Write(data, 0, data.Length);

                // Show the hex digits on in the terminal window
              rtxtDataArea.ForeColor = Color.Blue;   //write Hex data in Blue
              rtxtDataArea.AppendText(txtSend.Text.ToUpper() + "\n");
              txtSend.Clear();                       //clear screen after sending data
                }
            catch (FormatException) { error = true; }

                // Inform the user if the hex string was not properly formatted
                catch (ArgumentException) { error = true; }

            if (error) MessageBox.Show(this, "Not properly formatted hex string: " + txtSend.Text + "\n" + "example: E1 FF 1B", "Format Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);

            }
        }

Теперь я хочу сделать это, используя Modbus RTU Library. Я искал его и обнаружил некоторые библиотеки, но их учебники не так понятны, т. Е. Они не настолько ясны, как работает библиотека. Сейчас я просто хочу сделать кадр запроса, как показано ниже:

  1. Идентификатор устройства
  2. Регистр хранения
  3. Значение регистра
  4. Контрольная сумма (не ясно что будет ли библиотека устанавливать это или я должен установить это вручную)

Есть ли какое-нибудь хорошее руководство по этому вопросу, что, как я могу просто сделать простой запрос?

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 21 апреля 2020

Я полагаю, вы знаете, как отправлять данные по компорте. Проблема в том, «как написать запрос Modbus RTU».

Вы можете проверить документацию организации Modbus

Пример: Считать два регистра хранения из 0x0001 и 0x0002 из идентификатора Устройство 11 (0x0B).

Slave Address       0B
Function            03
Starting Address Hi 00
Starting Address Lo 01
No. of Points Hi    00
No. of Points Lo    02
CRC Hi              95
CRC Lo              61

Вы можете проверить cr c с этого генерирующего сайта cr c Не проверяйте "Hex" и посмотрите на CRC16 (modbus).

Следующие примеры данных отображаются следующим образом.

byte[] data = new byte[] {
0x11, 0x03, 0x00, 0x01, 0x00, 0x02, 0x95, 0x61 
};

Отправляя эти данные, вы можете получить ответ в следующей структуре данных.

Field Name              (Hex)
Slave Address            0B
Function                 03
Byte Count               06
Data Hi (Register 0x01)  00
Data Lo (Register 0x01)  2B
Data Hi (Register 0x02)  00
Data Lo (Register 0x02)  13
Error Check (LRC or CRC) ––

PS: между каждым запросом вам нужен интервал без вывода сообщений для 28 бит, вы можете рассчитать интервал без вывода сообщений по скорости передачи.

...