espressif / esp-modbus

ESP-Modbus - the officially suppported library for Modbus protocol (serial RS485 + TCP over WiFi or Ethernet).
Apache License 2.0
85 stars 46 forks source link

E (92525) MB_PORT_COMMON: vMBMasterRunResRelease(195): Resource release failure. Possible memory leak???? (IDFGH-10127) #29

Closed kotyara12 closed 1 year ago

kotyara12 commented 1 year ago

When polling a sensor operating on the 485 modbus bus, an error is periodically generated:

E (92525) MB_PORT_COMMON: vMBMasterRunResRelease(195): Resource release failure.

This behavior is often observed, then several different registers are polled in a row and for several sensors on the bus. Although the data was successfully received.

Possible memory leak????

esp-idf: 4.4.3

/**
 * Read status register
 * */
esp_err_t reCWTSoilS::readModbusRegister(uint8_t cmd, uint16_t reg, uint16_t* value)
{
  mb_param_request_t _request = {
    .slave_addr = _address,
    .command    = cmd,
    .reg_start  = reg,
    .reg_size   = 1
  };
  return mbc_master_send_request(&_request, (void*)value);
}

/**
 * Read humidity and temperature data
 * */
sensor_status_t reCWTSoilS::readRawData()
{
  esp_err_t err = ESP_OK;
  uint16_t bufH, bufT, bufC, bufP = 0;

  // Humidity (moisture)
  if ((_item2) && (err == ESP_OK)) {
    err = readModbusRegister(FUNCTION_CODE_STATUS_READ, REG_STATUS_HUMIDITY, &bufH);
  };
  // Temperature
  if ((_item1) && (err == ESP_OK)) {
    err = readModbusRegister(FUNCTION_CODE_STATUS_READ, REG_STATUS_TEMPERATURE, &bufT);
  };
  // Conductivity
  if ((_item3) && (err == ESP_OK)) {
    err = readModbusRegister(FUNCTION_CODE_STATUS_READ, REG_STATUS_CONDUCTIVITY, &bufC);
  };
  // PH
  if ((_item4) && (err == ESP_OK)) {
    err = readModbusRegister(FUNCTION_CODE_STATUS_READ, REG_STATUS_PH, &bufP);
  };

  // Check exit code
  if (err != ESP_OK) {
    rlog_e(logTAG, RSENSOR_LOG_MSG_READ_DATA_FAILED, _name, err, esp_err_to_name(err));
    return convertEspError(err);
  };

  // Store values in sensors
  return setRawValues((float)bufT/10.0, (float)bufH/10.0, (float)bufC, (float)bufP/10.0);
};

link: https://github.com/kotyara12/reSensors/tree/master/reCWTSoilS

Steps to reproduce.

  1. Connect two or more RS485 devices to the bus
  2. Query registers with mbc_master_send_request() one at a time (not several in sequence, but one at a time)
  3. Enjoy occasional error messages (not always)
14:53:17 [I] OUTD :: Values raw: 24.40 °С / 44.60 % | out: 24.40 °С / 44.60 % | min: 24.37 °С / 44.47 % | max: 24.40 °С / 44.60 %
14:53:17 [I] INT1 :: Values raw: 24.40 °С / 44.00 % | out: 24.40 °С / 43.91 % | min: 24.40 °С / 43.90 % | max: 24.40 °С / 43.91 %
14:53:17 [I] OUTL :: Values raw: 35.83 lux | out: 35.83 lux | min: 35.00 lux | max: 36.67 lux

E (92525) MB_PORT_COMMON: vMBMasterRunResRelease(195): Resource release failure.

14:53:18 [I] SOIL1 :: Values raw: 34.0 % / 21.9 °С | out: 33.1 % / 21.9 °С | min: 33.1 % / 21.9 °С | max: 33.1 % / 21.9 °С
14:53:18 [I] MQTT :: Publish to topic "local/sensors/greenhouse/outdoor/temperature": 24.40
14:53:18 [I] MQTT :: Publish to topic "local/sensors/greenhouse/outdoor/humidity": 44.60
14:53:18 [I] MQTT :: Publish to topic "local/sensors/greenhouse/outdoor/light": 36

https://github.com/espressif/esp-idf/issues/11399