Skip to content

Commit

Permalink
meters-modbus-tcp: Disable debug output
Browse files Browse the repository at this point in the history
  • Loading branch information
photron committed Apr 26, 2024
1 parent 25eb2e7 commit 29306a6
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 33 deletions.
56 changes: 32 additions & 24 deletions software/src/modules/meters_modbus_tcp/meter_modbus_tcp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

#include "meters_modbus_tcp_defs.inc"

#define DEBUG_LOG_ALL_READS
//#define DEBUG_LOG_ALL_VALUES

#define SUNGROW_HYBRID_INVERTER_OUTPUT_TYPE_ADDRESS 5002u
#define SUNGROW_HYBRID_INVERTER_GRID_FREQUENCY_ADDRESS 5036u
Expand Down Expand Up @@ -119,9 +119,11 @@ void MeterModbusTCP::setup(const Config &ephemeral_config)

void MeterModbusTCP::connect_callback()
{
read_index = 0;

generic_read_request.register_type = TAddress::RegType::IREG;
generic_read_request.data[0] = register_buffer;
generic_read_request.data[1] = nullptr;
generic_read_request.read_twice = false;
generic_read_request.done_callback = [this]{ read_done_callback(); };

if (preset == MeterModbusTCPPreset::SungrowHybridInverter) {
if (sungrow_hybrid_inverter_output_type < 0) {
Expand All @@ -130,14 +132,10 @@ void MeterModbusTCP::connect_callback()
}
}
else {
generic_read_request.start_address = value_specs[read_index].start_address - 1;
generic_read_request.register_count = static_cast<uint8_t>(value_specs[read_index].value_type) % 10;
}
read_index = 0;

generic_read_request.data[0] = register_buffer;
generic_read_request.data[1] = nullptr;
generic_read_request.read_twice = false;
generic_read_request.done_callback = [this]{ read_done_callback(); };
prepare_read();
}

start_generic_read();
}
Expand All @@ -147,6 +145,18 @@ void MeterModbusTCP::disconnect_callback()
read_allowed = false;
}

void MeterModbusTCP::prepare_read()
{
#ifndef DEBUG_LOG_ALL_VALUES
while (value_index[read_index] == VALUE_IS_DEBUG) {
read_index = (read_index + 1) % value_specs_length;
}
#endif

generic_read_request.start_address = value_specs[read_index].start_address - 1;
generic_read_request.register_count = static_cast<uint8_t>(value_specs[read_index].value_type) % 10;
}

void MeterModbusTCP::read_done_callback()
{
if (generic_read_request.result_code != Modbus::ResultCode::EX_SUCCESS) {
Expand Down Expand Up @@ -209,7 +219,7 @@ void MeterModbusTCP::read_done_callback()

sungrow_hybrid_inverter_output_type = register_buffer[0];

#ifdef DEBUG_LOG_ALL_READS
#ifdef DEBUG_LOG_ALL_VALUES
logger.printfln("%s / Output Type (%u): %d",
get_preset_name(preset),
SUNGROW_HYBRID_INVERTER_OUTPUT_TYPE_ADDRESS,
Expand All @@ -222,8 +232,7 @@ void MeterModbusTCP::read_done_callback()
read_allowed = true;
read_index = 0;

generic_read_request.start_address = value_specs[read_index].start_address - 1;
generic_read_request.register_count = static_cast<uint8_t>(value_specs[read_index].value_type) % 10;
prepare_read();

return;
}
Expand All @@ -240,28 +249,28 @@ void MeterModbusTCP::read_done_callback()

switch (value_specs[read_index].value_type) {
case ValueType::U16:
#ifdef DEBUG_LOG_ALL_READS
#ifdef DEBUG_LOG_ALL_VALUES
logger.printfln("%s / %s (%zu): %u", get_preset_name(preset), value_specs[read_index].name, value_specs[read_index].start_address, register_buffer[0]);
#endif
value = static_cast<float>(register_buffer[0]);
break;

case ValueType::S16:
#ifdef DEBUG_LOG_ALL_READS
#ifdef DEBUG_LOG_ALL_VALUES
logger.printfln("%s / %s (%zu): %d", get_preset_name(preset), value_specs[read_index].name, value_specs[read_index].start_address, static_cast<int16_t>(register_buffer[0]));
#endif
value = static_cast<float>(static_cast<int16_t>(register_buffer[0]));
break;

case ValueType::U32:
#ifdef DEBUG_LOG_ALL_READS
#ifdef DEBUG_LOG_ALL_VALUES
logger.printfln("%s / %s (%zu): %u (%u %u)", get_preset_name(preset), value_specs[read_index].name, value_specs[read_index].start_address, u.v, register_buffer[0], register_buffer[1]);
#endif
value = static_cast<float>(u.v);
break;

case ValueType::S32:
#ifdef DEBUG_LOG_ALL_READS
#ifdef DEBUG_LOG_ALL_VALUES
logger.printfln("%s / %s (%zu): %d (%u %u)", get_preset_name(preset), value_specs[read_index].name, value_specs[read_index].start_address, static_cast<int32_t>(u.v), register_buffer[0], register_buffer[1]);
#endif
value = static_cast<float>(static_cast<int32_t>(u.v));
Expand All @@ -271,9 +280,7 @@ void MeterModbusTCP::read_done_callback()
break;
}

if (value_index[read_index] != UINT32_MAX) {
value *= value_specs[read_index].scale_factor;
}
value *= value_specs[read_index].scale_factor;

if (preset == MeterModbusTCPPreset::SungrowHybridInverterGrid) {
if (generic_read_request.start_address == SUNGROW_HYBRID_INVERTER_GRID_FREQUENCY_ADDRESS - 1) { // grid frequency
Expand All @@ -300,19 +307,20 @@ void MeterModbusTCP::read_done_callback()
}
}

if (value_index[read_index] != UINT32_MAX) {
if (value_index[read_index] != VALUE_IS_META && value_index[read_index] != VALUE_IS_DEBUG) {
meters.update_value(slot, value_index[read_index], value);
}

read_index = (read_index + 1) % value_specs_length;
generic_read_request.start_address = value_specs[read_index].start_address - 1;
generic_read_request.register_count = static_cast<uint8_t>(value_specs[read_index].value_type) % 10;

if (read_index == 0) {
// make a little pause after each round trip
read_allowed = true;
}
else {

prepare_read();

if (!read_allowed) {
start_generic_read();
}
}
1 change: 1 addition & 0 deletions software/src/modules/meters_modbus_tcp/meter_modbus_tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class MeterModbusTCP final : protected GenericModbusTCPClient, public IMeter
private:
void connect_callback() override;
void disconnect_callback() override;
void prepare_read();

uint32_t slot;
Config *state;
Expand Down
25 changes: 16 additions & 9 deletions software/src/modules/meters_modbus_tcp/prepare.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ def create_software_module():
f.write(''.join(preset_values))
f.write('}\n')

VALUE_IS_META = 0xFFFFFFFF - 1
VALUE_IS_DEBUG = 0xFFFFFFFF - 2

sungrow_hybrid_inverter_base_values = [
{
'name': 'Total Output Energy [0.1 kWh]',
Expand Down Expand Up @@ -85,14 +88,14 @@ def create_software_module():
},
{
'name': 'MPPT 2 Voltage [0.1 V]',
'value_id': None, # FIXME: merge with MPPT 1?
'value_id': VALUE_IS_DEBUG, # FIXME: merge with MPPT 1?
'start_address': 5013,
'value_type': 'U16',
'scale_factor': 0.1,
},
{
'name': 'MPPT 2 Current [0.1 A]',
'value_id': None, # FIXME: merge with MPPT 1?
'value_id': VALUE_IS_DEBUG, # FIXME: merge with MPPT 1?
'start_address': 5014,
'value_type': 'U16',
'scale_factor': 0.1,
Expand Down Expand Up @@ -120,7 +123,7 @@ def create_software_module():
},
{
'name': 'Total PV Generation [0.1 kWh]',
'value_id': None,
'value_id': VALUE_IS_DEBUG,
'start_address': 13003,
'value_type': 'U32',
'scale_factor': 0.1,
Expand Down Expand Up @@ -257,14 +260,14 @@ def create_software_module():
'values': [
{
'name': 'Running State',
'value_id': None,
'value_id': VALUE_IS_META,
'start_address': 13001,
'value_type': 'U16',
'scale_factor': 1.0,
},
{
'name': 'Total Battery Charge Energy From PV [0.1 kWh]',
'value_id': None,
'value_id': VALUE_IS_DEBUG,
'start_address': 13013,
'value_type': 'U32',
'scale_factor': 0.1,
Expand Down Expand Up @@ -299,7 +302,7 @@ def create_software_module():
},
{
'name': 'Battery State Of Health [0.1 %]',
'value_id': None,
'value_id': VALUE_IS_DEBUG,
'start_address': 13024,
'value_type': 'U16',
'scale_factor': 0.1,
Expand Down Expand Up @@ -359,12 +362,14 @@ def create_software_module():
' },'
)

if value["value_id"] != None:
if value["value_id"] == VALUE_IS_META:
value_index.append(' VALUE_IS_META,')
elif value["value_id"] == VALUE_IS_DEBUG:
value_index.append(' VALUE_IS_DEBUG,')
else:
value_ids.append(f' MeterValueID::{value["value_id"]},')
value_index.append(f' {current_index},')
current_index += 1
else:
value_index.append(' UINT32_MAX,')

name = util.FlavoredName(spec["name"]).get()

Expand All @@ -374,6 +379,8 @@ def create_software_module():

with open('meters_modbus_tcp_defs.inc', 'w', encoding='utf-8') as f:
f.write('// WARNING: This file is generated.\n\n')
f.write(f'#define VALUE_IS_META {VALUE_IS_META}u\n')
f.write(f'#define VALUE_IS_DEBUG {VALUE_IS_DEBUG}u\n\n')
f.write('\n\n'.join(spec_values) + '\n\n')
f.write('\n\nstatic const char *get_preset_name(MeterModbusTCPPreset preset)\n')
f.write('{\n')
Expand Down

0 comments on commit 29306a6

Please sign in to comment.