mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Add event for missing inverter, fix capping value
This commit is contained in:
parent
1d786463a8
commit
55340886af
3 changed files with 27 additions and 2 deletions
|
@ -149,6 +149,7 @@ void init_events(void) {
|
||||||
events.entries[EVENT_CANFD_RX_FAILURE].level = EVENT_LEVEL_ERROR;
|
events.entries[EVENT_CANFD_RX_FAILURE].level = EVENT_LEVEL_ERROR;
|
||||||
events.entries[EVENT_CAN_RX_WARNING].level = EVENT_LEVEL_WARNING;
|
events.entries[EVENT_CAN_RX_WARNING].level = EVENT_LEVEL_WARNING;
|
||||||
events.entries[EVENT_CAN_TX_FAILURE].level = EVENT_LEVEL_ERROR;
|
events.entries[EVENT_CAN_TX_FAILURE].level = EVENT_LEVEL_ERROR;
|
||||||
|
events.entries[EVENT_CAN_INVERTER_MISSING].level = EVENT_LEVEL_ERROR;
|
||||||
events.entries[EVENT_WATER_INGRESS].level = EVENT_LEVEL_ERROR;
|
events.entries[EVENT_WATER_INGRESS].level = EVENT_LEVEL_ERROR;
|
||||||
events.entries[EVENT_CHARGE_LIMIT_EXCEEDED].level = EVENT_LEVEL_INFO;
|
events.entries[EVENT_CHARGE_LIMIT_EXCEEDED].level = EVENT_LEVEL_INFO;
|
||||||
events.entries[EVENT_DISCHARGE_LIMIT_EXCEEDED].level = EVENT_LEVEL_INFO;
|
events.entries[EVENT_DISCHARGE_LIMIT_EXCEEDED].level = EVENT_LEVEL_INFO;
|
||||||
|
@ -276,6 +277,8 @@ const char* get_event_message_string(EVENTS_ENUM_TYPE event) {
|
||||||
return "ERROR: High amount of corrupted CAN messages detected. Check CAN wire shielding!";
|
return "ERROR: High amount of corrupted CAN messages detected. Check CAN wire shielding!";
|
||||||
case EVENT_CAN_TX_FAILURE:
|
case EVENT_CAN_TX_FAILURE:
|
||||||
return "ERROR: CAN messages failed to transmit, or no one on the bus to ACK the message!";
|
return "ERROR: CAN messages failed to transmit, or no one on the bus to ACK the message!";
|
||||||
|
case EVENT_CAN_INVERTER_MISSING:
|
||||||
|
return "ERROR: Inverter missing on CAN bus! Check wiring!";
|
||||||
case EVENT_CHARGE_LIMIT_EXCEEDED:
|
case EVENT_CHARGE_LIMIT_EXCEEDED:
|
||||||
return "Info: Inverter is charging faster than battery is allowing.";
|
return "Info: Inverter is charging faster than battery is allowing.";
|
||||||
case EVENT_DISCHARGE_LIMIT_EXCEEDED:
|
case EVENT_DISCHARGE_LIMIT_EXCEEDED:
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
// #define INCLUDE_EVENTS_TEST // Enable to run an event test loop, see events_test_on_target.cpp
|
// #define INCLUDE_EVENTS_TEST // Enable to run an event test loop, see events_test_on_target.cpp
|
||||||
|
|
||||||
#define EE_MAGIC_HEADER_VALUE 0x0014 // 0x0000 to 0xFFFF
|
#define EE_MAGIC_HEADER_VALUE 0x0015 // 0x0000 to 0xFFFF
|
||||||
|
|
||||||
#define GENERATE_ENUM(ENUM) ENUM,
|
#define GENERATE_ENUM(ENUM) ENUM,
|
||||||
#define GENERATE_STRING(STRING) #STRING,
|
#define GENERATE_STRING(STRING) #STRING,
|
||||||
|
@ -35,6 +35,7 @@
|
||||||
XX(EVENT_CANFD_RX_FAILURE) \
|
XX(EVENT_CANFD_RX_FAILURE) \
|
||||||
XX(EVENT_CAN_RX_WARNING) \
|
XX(EVENT_CAN_RX_WARNING) \
|
||||||
XX(EVENT_CAN_TX_FAILURE) \
|
XX(EVENT_CAN_TX_FAILURE) \
|
||||||
|
XX(EVENT_CAN_INVERTER_MISSING) \
|
||||||
XX(EVENT_CHARGE_LIMIT_EXCEEDED) \
|
XX(EVENT_CHARGE_LIMIT_EXCEEDED) \
|
||||||
XX(EVENT_DISCHARGE_LIMIT_EXCEEDED) \
|
XX(EVENT_DISCHARGE_LIMIT_EXCEEDED) \
|
||||||
XX(EVENT_WATER_INGRESS) \
|
XX(EVENT_WATER_INGRESS) \
|
||||||
|
|
|
@ -27,6 +27,7 @@ static uint16_t voltage_per_pack = 0;
|
||||||
static int16_t current_per_pack = 0;
|
static int16_t current_per_pack = 0;
|
||||||
static uint8_t temperature_max_per_pack = 0;
|
static uint8_t temperature_max_per_pack = 0;
|
||||||
static uint8_t temperature_min_per_pack = 0;
|
static uint8_t temperature_min_per_pack = 0;
|
||||||
|
static uint8_t inverterStillAlive = CAN_STILL_ALIVE;
|
||||||
|
|
||||||
static bool send_cellvoltages = false;
|
static bool send_cellvoltages = false;
|
||||||
static unsigned long previousMillisCellvoltage = 0; // Store the last time a cellvoltage CAN messages were sent
|
static unsigned long previousMillisCellvoltage = 0; // Store the last time a cellvoltage CAN messages were sent
|
||||||
|
@ -354,7 +355,8 @@ CAN_frame FOXESS_0D59 = {.FD = false,
|
||||||
.ID = 0x0D59, //Celltemperatures Pack 8
|
.ID = 0x0D59, //Celltemperatures Pack 8
|
||||||
.data = {0x49, 0x48, 0x47, 0x47, 0x48, 0x49, 0x46, 0x47}};
|
.data = {0x49, 0x48, 0x47, 0x47, 0x48, 0x49, 0x46, 0x47}};
|
||||||
|
|
||||||
void update_values_can_inverter() { //This function maps all the values fetched from battery CAN to the correct CAN messages
|
void update_values_can_inverter() { //This function maps all the CAN values fetched from battery. It also checks some safeties.
|
||||||
|
|
||||||
//Calculate the required values
|
//Calculate the required values
|
||||||
temperature_average =
|
temperature_average =
|
||||||
((datalayer.battery.status.temperature_max_dC + datalayer.battery.status.temperature_min_dC) / 2);
|
((datalayer.battery.status.temperature_max_dC + datalayer.battery.status.temperature_min_dC) / 2);
|
||||||
|
@ -395,6 +397,24 @@ void update_values_can_inverter() { //This function maps all the values fetched
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Cap the value according to user settings. Some inverters cannot handle large values.
|
||||||
|
if ((max_charge_rate_amp * 10) > datalayer.battery.info.max_charge_amp_dA) {
|
||||||
|
max_charge_rate_amp = (datalayer.battery.info.max_charge_amp_dA / 10);
|
||||||
|
}
|
||||||
|
if ((max_discharge_rate_amp * 10) > datalayer.battery.info.max_discharge_amp_dA) {
|
||||||
|
max_discharge_rate_amp = (datalayer.battery.info.max_discharge_amp_dA / 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inverterStillAlive > 0) {
|
||||||
|
inverterStillAlive--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inverterStillAlive) {
|
||||||
|
set_event(EVENT_CAN_INVERTER_MISSING, 0);
|
||||||
|
} else {
|
||||||
|
clear_event(EVENT_CAN_INVERTER_MISSING);
|
||||||
|
}
|
||||||
|
|
||||||
//Put the values into the CAN messages
|
//Put the values into the CAN messages
|
||||||
//BMS_Limits
|
//BMS_Limits
|
||||||
FOXESS_1872.data.u8[0] = (uint8_t)datalayer.battery.info.max_design_voltage_dV;
|
FOXESS_1872.data.u8[0] = (uint8_t)datalayer.battery.info.max_design_voltage_dV;
|
||||||
|
@ -692,6 +712,7 @@ void send_can_inverter() { // This function loops as fast as possible
|
||||||
void receive_can_inverter(CAN_frame rx_frame) {
|
void receive_can_inverter(CAN_frame rx_frame) {
|
||||||
|
|
||||||
if (rx_frame.ID == 0x1871) {
|
if (rx_frame.ID == 0x1871) {
|
||||||
|
inverterStillAlive = CAN_STILL_ALIVE;
|
||||||
if (rx_frame.data.u8[0] == 0x03) { //0x1871 [0x03, 0x06, 0x17, 0x05, 0x09, 0x09, 0x28, 0x22]
|
if (rx_frame.data.u8[0] == 0x03) { //0x1871 [0x03, 0x06, 0x17, 0x05, 0x09, 0x09, 0x28, 0x22]
|
||||||
//This message is sent by the inverter every '6' seconds (0.5s after the pack serial numbers)
|
//This message is sent by the inverter every '6' seconds (0.5s after the pack serial numbers)
|
||||||
//and contains a timestamp in bytes 2-7 i.e. <YY>,<MM>,<DD>,<HH>,<mm>,<ss>
|
//and contains a timestamp in bytes 2-7 i.e. <YY>,<MM>,<DD>,<HH>,<mm>,<ss>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue