Как использовать библиотеку Modbus RTU функционального кода 6

Я пытаюсь установить связь с контроллером температуры с помощью Modbus RTU. Я использовал эту библиотеку Arduino.

Мне удалось прочитать PV (текущее значение температуры), используя приведенный ниже код. Он использует код функции 4.

Я хочу установить значение SV (установить значение), используя код функции 6

Я заменил telegram.u8fct = 0x04; на telegram.u8fct = 0x06; и telegram.u16RegAdd = 0x03E8; на соответствующий адрес для СВ. Но мне не удалось добиться успеха.

Как я могу реализовать код функции 6 в этой библиотеке?

Код для чтения PV, как показано ниже. Он работает правильно.

    #include <ModbusRtu.h>

    // массив данных для общего доступа к сети Modbus
    uint16_t au16data[16];
    uint8_t u8state;

    /**
        Modbus object declaration
        u8id : node id = 0 for master, = 1..247 for slave
        u8serno : serial port (use 0 for Serial)
        u8txenpin : 0 for RS-232 and USB-FTDI
                     or any pin number > 1 for RS-485
    */
    //УПРАВЛЕНИЕ ПЕРЕДАЧЕЙ - 8
    // hardware serial - 2
    Modbus master(0, 2, 8); // это мастер и RS-232 или USB-FTDI

    /*
       This is an structe which contains a query to an slave device
    */
    modbus_t telegram;

    unsigned long u32wait;

    void setup() {
      Serial.begin(9600);
      master.begin(9600); // скорость передачи 9600
      master.setTimeOut( 2000 ); // если нет ответа в течение 2000 мс, перевернуть
      u32wait = millis() + 1000;
      u8state = 0;
    }

    void loop() {
      switch ( u8state ) {
        case 0:
          if (millis() > u32wait) u8state++; // состояние ожидания
          break;
        case 1:
          telegram.u8id = 0x01; // адрес подчиненного устройства
          telegram.u8fct = 0x04; // код функции (это чтение регистров)
          telegram.u16RegAdd = 0x03E8; // начальный адрес в ведомом устройстве [CHANNEL 1 PV]
          telegram.u16CoilsNo = 0x01; // количество элементов (катушек или регистров) для чтения
          telegram.au16reg = au16data; // указатель на массив памяти в Arduino

          master.query( telegram ); // отправляем запрос (только один раз)
          u8state++;
          break;
        case 2:
          master.poll(); // проверяем входящие сообщения
          if (master.getState() == COM_IDLE) {
            u8state = 0;
            u32wait = millis() + 100;
            Serial.println(au16data[0]);//ЗНАЧЕНИЕ ТЕМПЕРАТУРЫ ПЕЧАТИ
          }
          break;
      }
    }

, 👍-1


1 ответ


0

Мне удалось изменить значение SV.

Согласно библиотеке, при использовании кода функции 6 она получает данные для отправки (значение температуры) из au16regs[0], как показано ниже в фрагменте кода файла библиотеки. Необходимо установить это значение перед запросом.

(ModbusRtu.h - номер строки 601)

case MB_FC_WRITE_REGISTER: //если код функции 6
    au8Buffer[ NB_HI ]      = highByte(au16regs[0]);
    au8Buffer[ NB_LO ]      = lowByte(au16regs[0]);
,

Можно принять ваш собственный ответ как решение проблемы., @VE7JRO

@VE7JRO да. Это ответ на вопрос. Но вам придется столкнуться с проблемой, если вы будете использовать этот код в программе с другими функциями., @user_fs10