From c3e67d2f62b14ca112e30e5dabb1f99ff77a39e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sun, 10 Nov 2024 11:49:31 +0200 Subject: [PATCH] Make discharge limits under settings datalayer --- Software/Software.ino | 16 ++++++++-------- Software/src/datalayer/datalayer.h | 8 ++++---- .../src/devboard/webserver/settings_html.cpp | 4 ++-- Software/src/devboard/webserver/webserver.cpp | 6 +++--- Software/src/inverter/BYD-MODBUS.cpp | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Software/Software.ino b/Software/Software.ino index adc771e1..2b45dc5a 100644 --- a/Software/Software.ino +++ b/Software/Software.ino @@ -401,11 +401,11 @@ void init_stored_settings() { } temp = settings.getUInt("MAXCHARGEAMP", false); if (temp != 0) { - datalayer.battery.info.max_charge_amp_dA = temp; + datalayer.battery.settings.max_user_set_charge_dA = temp; } temp = settings.getUInt("MAXDISCHARGEAMP", false); if (temp != 0) { - datalayer.battery.info.max_discharge_amp_dA = temp; + datalayer.battery.settings.max_user_set_discharge_dA = temp; temp = settings.getBool("USE_SCALED_SOC", false); datalayer.battery.settings.soc_scaling_active = temp; //This bool needs to be checked inside the temp!= block } // No way to know if it wasnt reset otherwise @@ -847,11 +847,11 @@ void update_calculated_values() { ((datalayer.battery.status.max_discharge_power_W * 100) / datalayer.battery.status.voltage_dV); } /* Restrict values from user settings if needed*/ - if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.info.max_charge_amp_dA) { - datalayer.battery.status.max_charge_current_dA = datalayer.battery.info.max_charge_amp_dA; + if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.settings.max_user_set_charge_dA) { + datalayer.battery.status.max_charge_current_dA = datalayer.battery.settings.max_user_set_charge_dA; } - if (datalayer.battery.status.max_discharge_current_dA > datalayer.battery.info.max_discharge_amp_dA) { - datalayer.battery.status.max_discharge_current_dA = datalayer.battery.info.max_discharge_amp_dA; + if (datalayer.battery.status.max_discharge_current_dA > datalayer.battery.settings.max_user_set_discharge_dA) { + datalayer.battery.status.max_discharge_current_dA = datalayer.battery.settings.max_user_set_discharge_dA; } if (datalayer.battery.settings.soc_scaling_active) { @@ -991,8 +991,8 @@ void storeSettings() { datalayer.battery.settings.max_percentage / 10); // Divide by 10 for backwards compatibility settings.putUInt("MINPERCENTAGE", datalayer.battery.settings.min_percentage / 10); // Divide by 10 for backwards compatibility - settings.putUInt("MAXCHARGEAMP", datalayer.battery.info.max_charge_amp_dA); - settings.putUInt("MAXDISCHARGEAMP", datalayer.battery.info.max_discharge_amp_dA); + settings.putUInt("MAXCHARGEAMP", datalayer.battery.settings.max_user_set_charge_dA); + settings.putUInt("MAXDISCHARGEAMP", datalayer.battery.settings.max_user_set_discharge_dA); settings.putBool("USE_SCALED_SOC", datalayer.battery.settings.soc_scaling_active); settings.end(); } diff --git a/Software/src/datalayer/datalayer.h b/Software/src/datalayer/datalayer.h index a26097af..7e1880af 100644 --- a/Software/src/datalayer/datalayer.h +++ b/Software/src/datalayer/datalayer.h @@ -19,10 +19,6 @@ typedef struct { uint16_t min_cell_voltage_mV = 2700; /** The maxumum allowed deviation between cells, in milliVolt. 500 = 0.500 V */ uint16_t max_cell_voltage_deviation_mV = 500; - /** The user specified maximum allowed charge rate, in deciAmpere. 300 = 30.0 A */ - uint16_t max_user_set_charge_dA = BATTERY_MAX_CHARGE_AMP; - /** The user specified maximum allowed discharge rate, in deciAmpere. 300 = 30.0 A */ - uint16_t max_user_set_discharge_dA = BATTERY_MAX_DISCHARGE_AMP; /** uint8_t */ /** Total number of cells in the pack */ @@ -111,6 +107,10 @@ typedef struct { * you want the inverter to be able to use. At this real SOC, the inverter * will "see" 100% */ uint16_t max_percentage = BATTERY_MAXPERCENTAGE; + /** The user specified maximum allowed charge rate, in deciAmpere. 300 = 30.0 A */ + uint16_t max_user_set_charge_dA = BATTERY_MAX_CHARGE_AMP; + /** The user specified maximum allowed discharge rate, in deciAmpere. 300 = 30.0 A */ + uint16_t max_user_set_discharge_dA = BATTERY_MAX_DISCHARGE_AMP; } DATALAYER_BATTERY_SETTINGS_TYPE; typedef struct { diff --git a/Software/src/devboard/webserver/settings_html.cpp b/Software/src/devboard/webserver/settings_html.cpp index 5efe2493..caac64d4 100644 --- a/Software/src/devboard/webserver/settings_html.cpp +++ b/Software/src/devboard/webserver/settings_html.cpp @@ -58,10 +58,10 @@ String settings_processor(const String& var) { ";'>SOC min percentage: " + String(datalayer.battery.settings.min_percentage / 100.0, 1) + " "; content += "

Max charge speed: " + - String(datalayer.battery.info.max_user_set_charge_dA / 10.0, 1) + + String(datalayer.battery.settings.max_user_set_charge_dA / 10.0, 1) + " A

"; content += "

Max discharge speed: " + - String(datalayer.battery.info.max_user_set_discharge_dA / 10.0, 1) + + String(datalayer.battery.settings.max_user_set_discharge_dA / 10.0, 1) + " A

"; // Close the block content += ""; diff --git a/Software/src/devboard/webserver/webserver.cpp b/Software/src/devboard/webserver/webserver.cpp index 244d8846..81d77567 100644 --- a/Software/src/devboard/webserver/webserver.cpp +++ b/Software/src/devboard/webserver/webserver.cpp @@ -209,7 +209,7 @@ void init_webserver() { return request->requestAuthentication(); if (request->hasParam("value")) { String value = request->getParam("value")->value(); - datalayer.battery.info.max_user_set_charge_dA = static_cast(value.toFloat() * 10); + datalayer.battery.settings.max_user_set_charge_dA = static_cast(value.toFloat() * 10); storeSettings(); request->send(200, "text/plain", "Updated successfully"); } else { @@ -223,7 +223,7 @@ void init_webserver() { return request->requestAuthentication(); if (request->hasParam("value")) { String value = request->getParam("value")->value(); - datalayer.battery.info.max_user_set_discharge_dA = static_cast(value.toFloat() * 10); + datalayer.battery.settings.max_user_set_discharge_dA = static_cast(value.toFloat() * 10); storeSettings(); request->send(200, "text/plain", "Updated successfully"); } else { @@ -285,7 +285,7 @@ void init_webserver() { String value = request->getParam("value")->value(); float val = value.toFloat(); - if (!(val <= datalayer.battery.info.max_user_set_charge_dA && val <= CHARGER_MAX_A)) { + if (!(val <= datalayer.battery.settings.max_user_set_charge_dA && val <= CHARGER_MAX_A)) { request->send(400, "text/plain", "Bad Request"); } diff --git a/Software/src/inverter/BYD-MODBUS.cpp b/Software/src/inverter/BYD-MODBUS.cpp index 3522e18b..7cee6b8d 100644 --- a/Software/src/inverter/BYD-MODBUS.cpp +++ b/Software/src/inverter/BYD-MODBUS.cpp @@ -65,13 +65,13 @@ void handle_update_data_modbusp301_byd() { } // Convert max discharge Amp value to max Watt user_configured_max_discharge_W = - ((datalayer.battery.info.max_user_set_discharge_dA * datalayer.battery.info.max_design_voltage_dV) / 100); + ((datalayer.battery.settings.max_user_set_discharge_dA * datalayer.battery.info.max_design_voltage_dV) / 100); // Use the smaller value, battery reported value OR user configured value max_discharge_W = std::min(datalayer.battery.status.max_discharge_power_W, user_configured_max_discharge_W); // Convert max charge Amp value to max Watt user_configured_max_charge_W = - ((datalayer.battery.info.max_user_set_charge_dA * datalayer.battery.info.max_design_voltage_dV) / 100); + ((datalayer.battery.settings.max_user_set_charge_dA * datalayer.battery.info.max_design_voltage_dV) / 100); // Use the smaller value, battery reported value OR user configured value max_charge_W = std::min(datalayer.battery.status.max_charge_power_W, user_configured_max_charge_W);