Further improve PID polling

This commit is contained in:
Daniel Öster 2025-08-01 23:04:44 +03:00
parent cf422afd8e
commit aa6530b109
4 changed files with 77 additions and 4 deletions

View file

@ -51,6 +51,16 @@ void KiaHyundai64Battery::
datalayer_battery_extended->inverterVoltage = inverterVoltage;
memcpy(datalayer_battery_extended->ecu_serial_number, ecu_serial_number, sizeof(ecu_serial_number));
memcpy(datalayer_battery_extended->ecu_version_number, ecu_version_number, sizeof(ecu_version_number));
datalayer_battery_extended->cumulative_charge_current_ah = cumulative_charge_current_ah;
datalayer_battery_extended->cumulative_discharge_current_ah = cumulative_discharge_current_ah;
datalayer_battery_extended->cumulative_energy_charged_kWh = cumulative_energy_charged_kWh;
datalayer_battery_extended->cumulative_energy_discharged_kWh = cumulative_energy_discharged_kWh;
datalayer_battery_extended->powered_on_total_time = powered_on_total_time;
datalayer_battery_extended->isolation_resistance_kOhm = isolation_resistance_kOhm;
datalayer_battery_extended->number_of_standard_charging_sessions = number_of_standard_charging_sessions;
datalayer_battery_extended->number_of_fastcharging_sessions = number_of_fastcharging_sessions;
datalayer_battery_extended->accumulated_normal_charging_energy_kWh = accumulated_normal_charging_energy_kWh;
datalayer_battery_extended->accumulated_fastcharging_energy_kWh = accumulated_fastcharging_energy_kWh;
}
void KiaHyundai64Battery::update_number_of_cells() {
@ -138,9 +148,12 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
KIA64_7E4_poll.data.u8[2] = (uint8_t)((POLL_GROUP_6 & 0xFF00) >> 8);
KIA64_7E4_poll.data.u8[3] = (uint8_t)(POLL_GROUP_6 & 0x00FF);
} else if (poll_data_pid == 7) {
KIA64_7E4_poll.data.u8[2] = (uint8_t)((POLL_GROUP_11 & 0xFF00) >> 8);
KIA64_7E4_poll.data.u8[3] = (uint8_t)(POLL_GROUP_11 & 0x00FF);
} else if (poll_data_pid == 8) {
KIA64_7E4_poll.data.u8[2] = (uint8_t)((POLL_ECU_SERIAL & 0xFF00) >> 8);
KIA64_7E4_poll.data.u8[3] = (uint8_t)(POLL_ECU_SERIAL & 0x00FF);
} else if (poll_data_pid == 8) {
} else if (poll_data_pid == 9) {
KIA64_7E4_poll.data.u8[2] = (uint8_t)((POLL_ECU_VERSION & 0xFF00) >> 8);
KIA64_7E4_poll.data.u8[3] = (uint8_t)(POLL_ECU_VERSION & 0x00FF);
poll_data_pid = 0;
@ -195,6 +208,8 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
cellvoltages_mv[67] = (rx_frame.data.u8[5] * 20);
cellvoltages_mv[68] = (rx_frame.data.u8[6] * 20);
cellvoltages_mv[69] = (rx_frame.data.u8[7] * 20);
} else if (pid_reply == POLL_GROUP_11) {
number_of_standard_charging_sessions = ((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]);
} else if (pid_reply == POLL_ECU_SERIAL) {
ecu_serial_number[3] = rx_frame.data.u8[1];
ecu_serial_number[4] = rx_frame.data.u8[2];
@ -214,7 +229,11 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
}
break;
case 0x22: //Second datarow in PID group
if (pid_reply == POLL_GROUP_2) {
if (pid_reply == POLL_GROUP_1) {
//battery_max_temperature = rx_frame.data.u8[5];
//battery_min_temperature = rx_frame.data.u8[6];
//module_1_temperature = rx_frame.data.u8[7];
} else if (pid_reply == POLL_GROUP_2) {
cellvoltages_mv[6] = (rx_frame.data.u8[1] * 20);
cellvoltages_mv[7] = (rx_frame.data.u8[2] * 20);
cellvoltages_mv[8] = (rx_frame.data.u8[3] * 20);
@ -240,6 +259,9 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
cellvoltages_mv[76] = (rx_frame.data.u8[7] * 20);
} else if (pid_reply == POLL_GROUP_6) {
batteryManagementMode = rx_frame.data.u8[5];
} else if (pid_reply == POLL_GROUP_11) {
number_of_fastcharging_sessions = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
accumulated_normal_charging_energy_kWh = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6]);
} else if (pid_reply == POLL_ECU_SERIAL) {
ecu_serial_number[10] = rx_frame.data.u8[1];
ecu_serial_number[11] = rx_frame.data.u8[2];
@ -258,6 +280,9 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
break;
case 0x23: //Third datarow in PID group
if (pid_reply == POLL_GROUP_1) {
//module_2_temperature = rx_frame.data.u8[1];
//module_3_temperature = rx_frame.data.u8[2];
//module_4_temperature = rx_frame.data.u8[3];
temperature_water_inlet = rx_frame.data.u8[6];
CellVoltMax_mV = (rx_frame.data.u8[7] * 20); //(volts *50) *20 =mV
} else if (pid_reply == POLL_GROUP_2) {
@ -286,6 +311,8 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
cellvoltages_mv[83] = (rx_frame.data.u8[7] * 20);
} else if (pid_reply == POLL_GROUP_5) {
heatertemp = rx_frame.data.u8[7];
} else if (pid_reply == POLL_GROUP_11) {
accumulated_fastcharging_energy_kWh = ((rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]);
}
break;
case 0x24: //Fourth datarow in PID group
@ -324,7 +351,12 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
}
break;
case 0x25: //Fifth datarow in PID group
if (pid_reply == POLL_GROUP_2) {
if (pid_reply == POLL_GROUP_1) {
cumulative_charge_current_ah =
((rx_frame.data.u8[1] << 16) | (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]);
cumulative_discharge_current_ah =
((rx_frame.data.u8[5] << 16) | (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
} else if (pid_reply == POLL_GROUP_2) {
cellvoltages_mv[27] = (rx_frame.data.u8[1] * 20);
cellvoltages_mv[28] = (rx_frame.data.u8[2] * 20);
cellvoltages_mv[29] = (rx_frame.data.u8[3] * 20);
@ -362,7 +394,11 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
}
break;
case 0x26: //Sixth datarow in PID group
if (pid_reply == POLL_GROUP_5) {
if (pid_reply == POLL_GROUP_1) {
cumulative_energy_charged_kWh =
((rx_frame.data.u8[2] << 16) | (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
cumulative_energy_discharged_HIGH_BYTE = ((rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
} else if (pid_reply == POLL_GROUP_5) {
//We have read all cells, check that content is valid:
for (uint8_t i = 85; i < 97; ++i) {
if (cellvoltages_mv[i] < 300) { // Zero the value if it's below 300
@ -377,6 +413,9 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
break;
case 0x27: //Seventh datarow in PID group
if (pid_reply == POLL_GROUP_1) {
cumulative_energy_discharged_kWh = ((cumulative_energy_discharged_HIGH_BYTE << 8) | rx_frame.data.u8[1]);
powered_on_total_time = ((rx_frame.data.u8[2] << 24) | (rx_frame.data.u8[3] << 16) |
(rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]);
BMS_ign = rx_frame.data.u8[6];
inverterVoltageFrameHigh = rx_frame.data.u8[7];
}
@ -384,6 +423,7 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
case 0x28: //Eighth datarow in PID group
if (pid_reply == POLL_GROUP_1) {
inverterVoltage = (inverterVoltageFrameHigh << 8) + rx_frame.data.u8[1];
isolation_resistance_kOhm = ((rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
}
break;
default:

View file

@ -95,6 +95,17 @@ class KiaHyundai64Battery : public CanBattery {
bool startedUp = false;
uint8_t ecu_serial_number[16] = {0};
uint8_t ecu_version_number[16] = {0};
uint32_t cumulative_charge_current_ah = 0;
uint32_t cumulative_discharge_current_ah = 0;
uint32_t cumulative_energy_charged_kWh = 0;
uint16_t cumulative_energy_discharged_HIGH_BYTE = 0;
uint32_t cumulative_energy_discharged_kWh = 0;
uint32_t powered_on_total_time = 0;
uint16_t isolation_resistance_kOhm = 0;
uint16_t number_of_standard_charging_sessions = 0;
uint16_t number_of_fastcharging_sessions = 0;
uint16_t accumulated_normal_charging_energy_kWh = 0;
uint16_t accumulated_fastcharging_energy_kWh = 0;
CAN_frame KIA_HYUNDAI_200 = {.FD = false,
.ext_ID = false,
@ -146,6 +157,7 @@ class KiaHyundai64Battery : public CanBattery {
static const int POLL_GROUP_4 = 0x0104;
static const int POLL_GROUP_5 = 0x0105;
static const int POLL_GROUP_6 = 0x0106;
static const int POLL_GROUP_11 = 0x0111;
static const int POLL_ECU_SERIAL = 0xF18C;
static const int POLL_ECU_VERSION = 0xF191;
};

View file

@ -37,6 +37,17 @@ class KiaHyundai64HtmlRenderer : public BatteryHtmlRenderer {
content += "<h4>BMS ignition: " + String(data.BMS_ign) + "</h4>";
content += "<h4>Battery relay: " + String(data.batteryRelay) + "</h4>";
content += "<h4>Inverter voltage: " + String(data.inverterVoltage) + " V</h4>";
content += "<h4>Isolation resistance: " + String(data.isolation_resistance_kOhm) + " kOhm</h4>";
content += "<h4>Power on total time: " + String(data.powered_on_total_time) + " s</h4>";
content += "<h4>Fastcharging sessions: " + String(data.number_of_fastcharging_sessions) + " x</h4>";
content += "<h4>Slowcharging sessions: " + String(data.number_of_standard_charging_sessions) + " x</h4>";
content +=
"<h4>Normal charged energy amount: " + String(data.accumulated_normal_charging_energy_kWh) + " kWh</h4>";
content += "<h4>Fastcharged energy amount: " + String(data.accumulated_fastcharging_energy_kWh) + " kWh</h4>";
content += "<h4>Total amount charged energy: " + String(data.cumulative_energy_charged_kWh) + " kWh</h4>";
content += "<h4>Total amount discharged energy: " + String(data.cumulative_energy_discharged_kWh) + " kWh</h4>";
content += "<h4>Cumulative charge current: " + String(data.cumulative_charge_current_ah / 10) + " Ah</h4>";
content += "<h4>Cumulative discharge current: " + String(data.cumulative_discharge_current_ah / 10) + " Ah</h4>";
};
print_hyundai(*kia_datalayer);

View file

@ -354,6 +354,16 @@ typedef struct {
uint16_t inverterVoltage = 0;
uint8_t ecu_serial_number[16] = {0};
uint8_t ecu_version_number[16] = {0};
uint32_t cumulative_charge_current_ah = 0;
uint32_t cumulative_discharge_current_ah = 0;
uint32_t cumulative_energy_charged_kWh = 0;
uint32_t cumulative_energy_discharged_kWh = 0;
uint32_t powered_on_total_time = 0;
uint16_t isolation_resistance_kOhm = 0;
uint16_t number_of_standard_charging_sessions = 0;
uint16_t number_of_fastcharging_sessions = 0;
uint16_t accumulated_normal_charging_energy_kWh = 0;
uint16_t accumulated_fastcharging_energy_kWh = 0;
} DATALAYER_INFO_KIAHYUNDAI64;
typedef struct {