Использование Modbus-RTU с Arduino и контроллером температуры

Я пытаюсь подключиться к 4-канальному контроллеру температуры, используя библиотеку Arduino Modbus.

Это часть описания моего контроллера температуры. Он имеет регистр для чтения PV каждого канала.

Регистры

Я изучил пример кода библиотеки и теперь пытаюсь прочитать PV каждого канала.

Итак, я изменил пример кода, как показано ниже,

#include <ModbusMaster.h>


    // создание экземпляра объекта ModbusMaster
    ModbusMaster node;


    void setup()
    {
      // использовать Serial (порт 0); инициализировать скорость передачи данных Modbus
      Serial.begin(19200);

      // связь с ведомым устройством Modbus с идентификатором 2 по последовательному порту (порт 0)
      node.begin(2, Serial);
    }


    void loop()
    {
      static uint32_t i;
      uint8_t j, result;
      uint16_t data[6];

      i++;

      // установить слово 0 буфера TX в наименее значимое слово счетчика (биты 15..0)
      node.setTransmitBuffer(0, lowWord(i));

      // установить слово 1 буфера TX в самое старшее слово счетчика (биты 31..16)
      node.setTransmitBuffer(1, highWord(i));

      // ведомое устройство: чтение (4) 16-битных регистров, начиная с регистра 2, в буфер RX
      result = node.readHoldingRegisters(1, 4);

      // делаем что-то с данными, если чтение прошло успешно
      if (result == node.ku8MBSuccess)
      {
        for (j = 0; j < 4; j++)
        {
          data[j] = node.getResponseBuffer(j);
        }
      }


    }

Мои вопросы: Объясните следующие строки в коде

          // установить слово 0 буфера TX в наименее значимое слово счетчика (биты 15..0)
      node.setTransmitBuffer(0, lowWord(i));

      // установить слово 1 буфера TX в самое старшее слово счетчика (биты 31..16)
      node.setTransmitBuffer(1, highWord(i));

Я не передал никакого запроса подчиненному устройству. Итак, могу ли я получить значение 4 PV таким образом? Если нет, объясните, как мне это сделать.

, 👍0


1 ответ


1

Вызовы setTransmitBuffer предназначены для writeMultipleRegisters, которые вы удалили из примера.

Первый параметр readHoldingRegisters — это адрес регистра. Второй параметр — количество регистров для чтения.

На скетче не отображаются полученные данные. У вас нет признаков успеха или неудачи.

,

Как я понял, setTransmitBuffer используется для инициализации буфера TX. Я прав? Полученные данные хранятся в буфере RX. мы не можем получить данные с помощью getResponseBuffer?, @user_fs10

у вас есть data[j] = node.getResponseBuffer(j);, @Juraj