ModbusRTU + ESP32 + частотный преобразователь VEMPER VR100. Читаются только регистры функциональных кодов

Нет ответов
PabloSS
Offline
Зарегистрирован: 11.04.2022

Всем здравствуйте. Используя вышеуказанную библу (https://github.com/emelianov/modbus-esp8266) не могу прочитать регистры отличные от регистров функциональных кодов. А, также не могу записать в регистры функциональных кодов и другие.

При попытке ,например, записать содержимое регистра в него же (код ниже), в мониторе порта ошибка: 0x5.

Пример кода 

#include <ModbusRTU.h>
//#include <ESP8266_LCD_1602_RUS.h>
//#include <Keypad.h>

//////////   MODBUS   /////////////
#define SLAVE_ID 1            //номер сервера
#define READ_REG 5            //читаемый регистр
#define REG_COUNT 1           //количество читаемых регистров
#define MODBUS_RX_PIN 16      //пин RX
#define MODBUS_TX_PIN 17      //пин TX
#define MODBUS_DE_RE 4        //пин DE_RE

ModbusRTU mb;

bool cb(Modbus::ResultCode event, uint16_t transactionId, void* data) {   
  if (event != Modbus::EX_SUCCESS) {
    Serial.print("Request result: 0x");
    Serial.println(event, HEX);
  }
  return true;
}
uint16_t res[REG_COUNT]; 

void setup() {
  Serial.begin(115200);         
  Serial2.begin(9600, SERIAL_8N1, MODBUS_RX_PIN, MODBUS_TX_PIN);    //запускаем и определяем параметры MODBUS
  mb.begin(&Serial2, MODBUS_DE_RE);     //работа по состоянию пина 4
  mb.master();
}

void loop() {
        ////////////////////////////////  READ  ///////////////////////////////////////
  if (!mb.slave()) {           
    mb.readHreg(SLAVE_ID, READ_REG, res, REG_COUNT, cb);    
    while(mb.slave()) {      
      mb.task();        
      delay(50);
    }
    Serial.println(res[0]);
    delay(1000);    
  }
    
      //////////////////////////// WRITE ///////////////////////////////////////////
     if (!mb.slave()) {    
      mb.writeHreg(SLAVE_ID, READ_REG, res, REG_COUNT, cb); 
      while(mb.slave()) { 
        mb.task();
        delay(10);
      }
    }
}