Read modbus holding register with scale

Hi,
I use library for 8266 - works also on ESP32.
#include <ModbusIP_ESP8266.h>

how can I define types and compute correct value of a register defined like:
uint16_t = PowerAC;
uint16_t = pwrscale;

raw PowerAC value = 9850
raw pwrscale value = 0 => 0

read out row:
mb.readHreg(remote, REG, &PowerAC, 1, nullptr, UNIT_ID);
mb.readHreg(remote, REG, &pwrscale, 1, nullptr, UNIT_ID);

or

uint16_t = Frequency;
uint16_t = freqscale;

raw Frequency value = 4997
raw freqscale value = 65534 => -2

Serial.println(PowerAC value * pow(10, pwrscale value)); // frequency * scale doesn't work

read out row:
mb.readHreg(remote, REG, &Frequency, 1, nullptr, UNIT_ID);
mb.readHreg(remote, REG, &freqscale, 1, nullptr, UNIT_ID);

Thanks.

what is a "holding register"?

???

It looks like you want a signed 16 bit integer for for freqscale rather than an unsigned 16 bit int.

modbusRTU or mobusTCP communication protocol with e.g. energy meter or photovoltaic inverter

yes scale is send from modbus as unsigned integer, but should be converted into signed integer.
Frequency value shoud be computed as
Frequency * 10 ^ sint

Frequency computed is 5001 * 10 ^ -2 = 50.01 Hz

I found it out :0)

unsigned int x = 65529;
    int y = (short) x;      //  If short is a 16-bit integer.

    or alternatively:

    unsigned int x = 65529;
    int y = (int16_t) x;    //  This is defined in <stdint.h>

The just make it a signed integer.

uint16_t = Frequency;
uint16_t = freqscale;
mb.readHreg(remote, REG, &Frequency, 1, nullptr, UNIT_ID);
mb.readHreg(remote, REG, &freqscale, 1, nullptr, UNIT_ID);

int16_t scale = freqscale;

float freq = Frequency * pow(10, scale);

Serial.println(freq);
1 Like
Serial.println(Frequency * pow(10, (short)freqscale)); // frequency * scale

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.