Fix Solax CAN message contents (#819)

- Fix 1874 msg where remaining kwh was included instead of total kwh.
- Fix 1874 msg where actual min/max cell voltages were included instead of design min/max cell voltages
- Fix 1876 msg where actual min/max temperature were missing
- Fix 1878 msg where more bytes are available for total capacit3
- Fix 187E msg where remaining kwh was included instead of total kwh.
This commit is contained in:
Marijn van Galen 2025-01-25 13:13:07 +01:00 committed by GitHub
parent ae7b091306
commit 85c5cd81aa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -147,16 +147,16 @@ void update_values_can_inverter() { //This function maps all the values fetched
SOLAX_1873.data.u8[3] = (datalayer.battery.status.current_dA >> 8); SOLAX_1873.data.u8[3] = (datalayer.battery.status.current_dA >> 8);
SOLAX_1873.data.u8[4] = (uint8_t)(datalayer.battery.status.reported_soc / 100); //SOC (100.00%) SOLAX_1873.data.u8[4] = (uint8_t)(datalayer.battery.status.reported_soc / 100); //SOC (100.00%)
//SOLAX_1873.data.u8[5] = //Seems like this is not required? Or shall we put SOC decimals here? //SOLAX_1873.data.u8[5] = //Seems like this is not required? Or shall we put SOC decimals here?
SOLAX_1873.data.u8[6] = (uint8_t)(capped_remaining_capacity_Wh / 10); SOLAX_1873.data.u8[6] = (uint8_t)(capped_capacity_Wh / 10);
SOLAX_1873.data.u8[7] = ((capped_remaining_capacity_Wh / 10) >> 8); SOLAX_1873.data.u8[7] = ((capped_capacity_Wh / 10) >> 8);
//BMS_CellData //BMS_CellData
SOLAX_1874.data.u8[0] = (int8_t)datalayer.battery.status.temperature_max_dC; SOLAX_1874.data.u8[0] = (int8_t)datalayer.battery.status.temperature_max_dC;
SOLAX_1874.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8); SOLAX_1874.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8);
SOLAX_1874.data.u8[2] = (int8_t)datalayer.battery.status.temperature_min_dC; SOLAX_1874.data.u8[2] = (int8_t)datalayer.battery.status.temperature_min_dC;
SOLAX_1874.data.u8[3] = (datalayer.battery.status.temperature_min_dC >> 8); SOLAX_1874.data.u8[3] = (datalayer.battery.status.temperature_min_dC >> 8);
SOLAX_1874.data.u8[4] = (uint8_t)(datalayer.battery.status.cell_max_voltage_mV); SOLAX_1874.data.u8[4] = (uint8_t)(datalayer.battery.info.max_cell_voltage_mV);
SOLAX_1874.data.u8[5] = (datalayer.battery.status.cell_max_voltage_mV >> 8); SOLAX_1874.data.u8[5] = (datalayer.battery.info.max_cell_voltage_mV >> 8);
SOLAX_1874.data.u8[6] = (uint8_t)(datalayer.battery.status.cell_min_voltage_mV); SOLAX_1874.data.u8[6] = (uint8_t)(datalayer.battery.status.cell_min_voltage_mV);
SOLAX_1874.data.u8[7] = (datalayer.battery.status.cell_min_voltage_mV >> 8); SOLAX_1874.data.u8[7] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
@ -167,9 +167,13 @@ void update_values_can_inverter() { //This function maps all the values fetched
SOLAX_1875.data.u8[4] = (uint8_t)0; // Contactor Status 0=off, 1=on. SOLAX_1875.data.u8[4] = (uint8_t)0; // Contactor Status 0=off, 1=on.
//BMS_PackTemps (strange name, since it has voltages?) //BMS_PackTemps (strange name, since it has voltages?)
SOLAX_1876.data.u8[0] = (int8_t)datalayer.battery.status.temperature_max_dC;
SOLAX_1876.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8);
SOLAX_1876.data.u8[2] = (uint8_t)datalayer.battery.status.cell_max_voltage_mV; SOLAX_1876.data.u8[2] = (uint8_t)datalayer.battery.status.cell_max_voltage_mV;
SOLAX_1876.data.u8[3] = (datalayer.battery.status.cell_max_voltage_mV >> 8); SOLAX_1876.data.u8[3] = (datalayer.battery.status.cell_max_voltage_mV >> 8);
SOLAX_1876.data.u8[4] = (int8_t)datalayer.battery.status.temperature_min_dC;
SOLAX_1876.data.u8[5] = (datalayer.battery.status.temperature_min_dC >> 8);
SOLAX_1876.data.u8[6] = (uint8_t)datalayer.battery.status.cell_min_voltage_mV; SOLAX_1876.data.u8[6] = (uint8_t)datalayer.battery.status.cell_min_voltage_mV;
SOLAX_1876.data.u8[7] = (datalayer.battery.status.cell_min_voltage_mV >> 8); SOLAX_1876.data.u8[7] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
@ -183,8 +187,10 @@ void update_values_can_inverter() { //This function maps all the values fetched
SOLAX_1878.data.u8[0] = (uint8_t)(datalayer.battery.status.voltage_dV); SOLAX_1878.data.u8[0] = (uint8_t)(datalayer.battery.status.voltage_dV);
SOLAX_1878.data.u8[1] = ((datalayer.battery.status.voltage_dV) >> 8); SOLAX_1878.data.u8[1] = ((datalayer.battery.status.voltage_dV) >> 8);
SOLAX_1878.data.u8[4] = (uint8_t)capped_capacity_Wh; SOLAX_1878.data.u8[4] = (uint8_t)datalayer.battery.info.total_capacity_Wh;
SOLAX_1878.data.u8[5] = (capped_capacity_Wh >> 8); SOLAX_1878.data.u8[5] = (datalayer.battery.info.total_capacity_Wh >> 8);
SOLAX_1878.data.u8[6] = (datalayer.battery.info.total_capacity_Wh >> 16);
SOLAX_1878.data.u8[7] = (datalayer.battery.info.total_capacity_Wh >> 24);
// BMS_Answer // BMS_Answer
SOLAX_1801.data.u8[0] = 2; SOLAX_1801.data.u8[0] = 2;
@ -192,10 +198,10 @@ void update_values_can_inverter() { //This function maps all the values fetched
SOLAX_1801.data.u8[4] = 1; SOLAX_1801.data.u8[4] = 1;
//Ultra messages //Ultra messages
SOLAX_187E.data.u8[0] = (uint8_t)capped_remaining_capacity_Wh; SOLAX_187E.data.u8[0] = (uint8_t)datalayer.battery.info.total_capacity_Wh;
SOLAX_187E.data.u8[1] = (capped_remaining_capacity_Wh >> 8); SOLAX_187E.data.u8[1] = (datalayer.battery.info.total_capacity_Wh >> 8);
SOLAX_187E.data.u8[2] = 0; SOLAX_187E.data.u8[2] = (datalayer.battery.info.total_capacity_Wh >> 16);
SOLAX_187E.data.u8[3] = 0; SOLAX_187E.data.u8[3] = (datalayer.battery.info.total_capacity_Wh >> 24);
SOLAX_187E.data.u8[5] = (uint8_t)(datalayer.battery.status.reported_soc / 100); SOLAX_187E.data.u8[5] = (uint8_t)(datalayer.battery.status.reported_soc / 100);
} }