jusufs
August 28, 2023, 8:19am
1
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.
gcjr
August 28, 2023, 11:30am
2
what is a "holding register"?
???
blh64
August 28, 2023, 11:55am
3
It looks like you want a signed 16 bit integer for for freqscale rather than an unsigned 16 bit int.
jusufs
August 28, 2023, 12:08pm
4
modbusRTU or mobusTCP communication protocol with e.g. energy meter or photovoltaic inverter
jusufs
August 28, 2023, 12:35pm
5
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
jusufs
August 28, 2023, 3:27pm
6
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>
blh64
August 28, 2023, 3:27pm
7
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
jusufs
August 28, 2023, 3:44pm
8
Serial.println(Frequency * pow(10, (short)freqscale)); // frequency * scale
system
Closed
February 24, 2024, 3:44pm
9
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.