mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-05 02:39:57 +02:00
Max charge/discharge Amps calculation
- Add byte swap of all 16bit ints - Add max charge/discharge amps calculation - Add status bits
This commit is contained in:
parent
7bf2667e96
commit
36acb31629
1 changed files with 203 additions and 46 deletions
|
@ -8,7 +8,7 @@
|
||||||
#define SEND_0 //If defined, the messages will have ID ending with 0 (useful for some inverters)
|
#define SEND_0 //If defined, the messages will have ID ending with 0 (useful for some inverters)
|
||||||
//#define SEND_1 //If defined, the messages will have ID ending with 1 (useful for some inverters)
|
//#define SEND_1 //If defined, the messages will have ID ending with 1 (useful for some inverters)
|
||||||
#define INVERT_LOW_HIGH_BYTES //If defined, certain frames will have inverted low/high bytes
|
#define INVERT_LOW_HIGH_BYTES //If defined, certain frames will have inverted low/high bytes
|
||||||
//useful for some inverters like Sofar that report the voltages incorrect otherwise
|
//#define SET_30K_OFFSET //If defined, current values are sent with a 30k offest (useful for ferroamp)
|
||||||
|
|
||||||
/* Do not change code below unless you are sure what you are doing */
|
/* Do not change code below unless you are sure what you are doing */
|
||||||
//Actual content messages
|
//Actual content messages
|
||||||
|
@ -170,10 +170,27 @@ CAN_frame_t PYLON_4291 = {.FIR = {.B =
|
||||||
.MsgID = 0x4291,
|
.MsgID = 0x4291,
|
||||||
.data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
.data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
||||||
|
|
||||||
|
static int16_t max_charge_current = 0;
|
||||||
|
static int16_t max_discharge_current = 0;
|
||||||
|
|
||||||
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 values fetched from battery CAN to the correct CAN messages
|
||||||
//There are more mappings that could be added, but this should be enough to use as a starting point
|
//There are more mappings that could be added, but this should be enough to use as a starting point
|
||||||
// Note we map both 0 and 1 messages
|
// Note we map both 0 and 1 messages
|
||||||
|
|
||||||
|
if (datalayer.battery.status.voltage_dV > 10) { //div0 safeguard
|
||||||
|
max_charge_current = (datalayer.battery.status.max_charge_power_W * 100) / datalayer.battery.status.voltage_dV;
|
||||||
|
if (max_charge_current > datalayer.battery.info.max_charge_amp_dA) {
|
||||||
|
max_charge_current = datalayer.battery.info.max_charge_amp_dA; //Cap the value to the max allowed Amp. Some inverters cannot handle large values.
|
||||||
|
}
|
||||||
|
max_discharge_current = (datalayer.battery.status.max_discharge_power_W * 100) / datalayer.battery.status.voltage_dV;
|
||||||
|
if (max_discharge_current > datalayer.battery.info.max_discharge_amp_dA) {
|
||||||
|
max_discharge_current = datalayer.battery.info.max_discharge_amp_dA; //Cap the value to the max allowed Amp. Some inverters cannot handle large values.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
max_charge_current = 0;
|
||||||
|
max_discharge_current = 0;
|
||||||
|
}
|
||||||
|
|
||||||
//Charge / Discharge allowed
|
//Charge / Discharge allowed
|
||||||
PYLON_4280.data.u8[0] = 0;
|
PYLON_4280.data.u8[0] = 0;
|
||||||
PYLON_4280.data.u8[1] = 0;
|
PYLON_4280.data.u8[1] = 0;
|
||||||
|
@ -184,31 +201,6 @@ void update_values_can_inverter() { //This function maps all the values fetched
|
||||||
PYLON_4281.data.u8[2] = 0;
|
PYLON_4281.data.u8[2] = 0;
|
||||||
PYLON_4281.data.u8[3] = 0;
|
PYLON_4281.data.u8[3] = 0;
|
||||||
|
|
||||||
//Voltage (370.0)
|
|
||||||
PYLON_4210.data.u8[0] = (datalayer.battery.status.voltage_dV >> 8);
|
|
||||||
PYLON_4210.data.u8[1] = (datalayer.battery.status.voltage_dV & 0x00FF);
|
|
||||||
PYLON_4211.data.u8[0] = (datalayer.battery.status.voltage_dV >> 8);
|
|
||||||
PYLON_4211.data.u8[1] = (datalayer.battery.status.voltage_dV & 0x00FF);
|
|
||||||
|
|
||||||
//Current (15.0)
|
|
||||||
PYLON_4210.data.u8[2] = (datalayer.battery.status.current_dA >> 8);
|
|
||||||
PYLON_4210.data.u8[3] = (datalayer.battery.status.current_dA & 0x00FF);
|
|
||||||
PYLON_4211.data.u8[2] = (datalayer.battery.status.current_dA >> 8);
|
|
||||||
PYLON_4211.data.u8[3] = (datalayer.battery.status.current_dA & 0x00FF);
|
|
||||||
|
|
||||||
// BMS Temperature (We dont have BMS temp, send max cell voltage instead)
|
|
||||||
#ifdef INVERT_LOW_HIGH_BYTES //Useful for Sofar inverters
|
|
||||||
PYLON_4210.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
|
||||||
PYLON_4210.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
|
||||||
PYLON_4211.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
|
||||||
PYLON_4211.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
|
||||||
#else
|
|
||||||
PYLON_4210.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
|
||||||
PYLON_4210.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
|
||||||
PYLON_4211.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
|
||||||
PYLON_4211.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//SOC (100.00%)
|
//SOC (100.00%)
|
||||||
PYLON_4210.data.u8[6] = (datalayer.battery.status.reported_soc / 100); //Remove decimals
|
PYLON_4210.data.u8[6] = (datalayer.battery.status.reported_soc / 100); //Remove decimals
|
||||||
PYLON_4211.data.u8[6] = (datalayer.battery.status.reported_soc / 100); //Remove decimals
|
PYLON_4211.data.u8[6] = (datalayer.battery.status.reported_soc / 100); //Remove decimals
|
||||||
|
@ -217,7 +209,41 @@ void update_values_can_inverter() { //This function maps all the values fetched
|
||||||
PYLON_4210.data.u8[7] = (datalayer.battery.status.soh_pptt / 100);
|
PYLON_4210.data.u8[7] = (datalayer.battery.status.soh_pptt / 100);
|
||||||
PYLON_4211.data.u8[7] = (datalayer.battery.status.soh_pptt / 100);
|
PYLON_4211.data.u8[7] = (datalayer.battery.status.soh_pptt / 100);
|
||||||
|
|
||||||
#ifdef INVERT_LOW_HIGH_BYTES //Useful for Sofar inverters \
|
// Status=Bit 0,1,2= 0:Sleep, 1:Charge, 2:Discharge 3:Idle. Bit3 ForceChargeReq. Bit4 Balance charge Request
|
||||||
|
if (datalayer.battery.status.current_dA > 0) {
|
||||||
|
PYLON_4251.data.u8[0] = (0x11); // Charge
|
||||||
|
} else if (datalayer.battery.status.current_dA < 0) {
|
||||||
|
PYLON_4251.data.u8[0] = (0x12); // Discharge
|
||||||
|
} else if (datalayer.battery.status.current_dA == 0) {
|
||||||
|
PYLON_4251.data.u8[0] = (0x13); // Idle
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef INVERT_LOW_HIGH_BYTES //Useful for Sofar inverters
|
||||||
|
//Voltage (370.0)
|
||||||
|
PYLON_4210.data.u8[0] = (datalayer.battery.status.voltage_dV & 0x00FF);
|
||||||
|
PYLON_4210.data.u8[1] = (datalayer.battery.status.voltage_dV >> 8);
|
||||||
|
PYLON_4211.data.u8[0] = (datalayer.battery.status.voltage_dV & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[1] = (datalayer.battery.status.voltage_dV >> 8);
|
||||||
|
|
||||||
|
#ifdef SET_30K_OFFSET
|
||||||
|
//Current (15.0)
|
||||||
|
PYLON_4210.data.u8[2] = ((datalayer.battery.status.current_dA + 30000) & 0x00FF);
|
||||||
|
PYLON_4210.data.u8[3] = ((datalayer.battery.status.current_dA + 30000) >> 8);
|
||||||
|
PYLON_4211.data.u8[2] = ((datalayer.battery.status.current_dA + 30000) & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[3] = ((datalayer.battery.status.current_dA + 30000) >> 8);
|
||||||
|
#else
|
||||||
|
PYLON_4210.data.u8[2] = (datalayer.battery.status.current_dA & 0x00FF);
|
||||||
|
PYLON_4210.data.u8[3] = (datalayer.battery.status.current_dA >> 8);
|
||||||
|
PYLON_4211.data.u8[2] = (datalayer.battery.status.current_dA & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[3] = (datalayer.battery.status.current_dA >> 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// BMS Temperature (We dont have BMS temp, send max cell voltage instead)
|
||||||
|
PYLON_4210.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
||||||
|
PYLON_4210.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
||||||
|
PYLON_4211.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
||||||
|
|
||||||
//Maxvoltage (eg 400.0V = 4000 , 16bits long) Discharge Cutoff Voltage
|
//Maxvoltage (eg 400.0V = 4000 , 16bits long) Discharge Cutoff Voltage
|
||||||
PYLON_4220.data.u8[0] = (datalayer.battery.info.max_design_voltage_dV & 0x00FF);
|
PYLON_4220.data.u8[0] = (datalayer.battery.info.max_design_voltage_dV & 0x00FF);
|
||||||
PYLON_4220.data.u8[1] = (datalayer.battery.info.max_design_voltage_dV >> 8);
|
PYLON_4220.data.u8[1] = (datalayer.battery.info.max_design_voltage_dV >> 8);
|
||||||
|
@ -229,37 +255,168 @@ void update_values_can_inverter() { //This function maps all the values fetched
|
||||||
PYLON_4220.data.u8[3] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
PYLON_4220.data.u8[3] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
||||||
PYLON_4221.data.u8[2] = (datalayer.battery.info.min_design_voltage_dV & 0x00FF);
|
PYLON_4221.data.u8[2] = (datalayer.battery.info.min_design_voltage_dV & 0x00FF);
|
||||||
PYLON_4221.data.u8[3] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
PYLON_4221.data.u8[3] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
||||||
#else
|
|
||||||
//Minvoltage (eg 300.0V = 3000 , 16bits long) Charge Cutoff Voltage
|
|
||||||
PYLON_4220.data.u8[0] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
|
||||||
PYLON_4220.data.u8[1] = (datalayer.battery.info.min_design_voltage_dV & 0x00FF);
|
|
||||||
PYLON_4221.data.u8[0] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
|
||||||
PYLON_4221.data.u8[1] = (datalayer.battery.info.min_design_voltage_dV & 0x00FF);
|
|
||||||
|
|
||||||
//Maxvoltage (eg 400.0V = 4000 , 16bits long) Discharge Cutoff Voltage
|
#ifdef SET_30K_OFFSET
|
||||||
PYLON_4220.data.u8[2] = (datalayer.battery.info.max_design_voltage_dV >> 8);
|
//Max ChargeCurrent
|
||||||
PYLON_4220.data.u8[3] = (datalayer.battery.info.max_design_voltage_dV & 0x00FF);
|
PYLON_4220.data.u8[4] = ((datalayer.battery.info.max_charge_current + 30000) & 0x00FF);
|
||||||
PYLON_4221.data.u8[2] = (datalayer.battery.info.max_design_voltage_dV >> 8);
|
PYLON_4220.data.u8[5] = ((datalayer.battery.info.max_charge_current + 30000) >> 8);
|
||||||
PYLON_4221.data.u8[3] = (datalayer.battery.info.max_design_voltage_dV & 0x00FF);
|
PYLON_4221.data.u8[4] = ((datalayer.battery.info.max_charge_current + 30000) & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[5] = ((datalayer.battery.info.max_charge_current + 30000) >> 8);
|
||||||
|
|
||||||
|
//Max DishargeCurrent
|
||||||
|
PYLON_4220.data.u8[6] = ((datalayer.battery.max_discharge_current + 30000) & 0x00FF);
|
||||||
|
PYLON_4220.data.u8[7] = ((datalayer.battery.max_discharge_current + 30000) >> 8);
|
||||||
|
PYLON_4221.data.u8[6] = ((datalayer.battery.max_discharge_current + 30000) & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[7] = ((datalayer.battery.max_discharge_current + 30000) >> 8);
|
||||||
|
#else
|
||||||
|
//Max ChargeCurrent
|
||||||
|
PYLON_4220.data.u8[4] = (datalayer.battery.max_charge_current & 0x00FF);
|
||||||
|
PYLON_4220.data.u8[5] = (datalayer.battery.max_charge_current >> 8);
|
||||||
|
PYLON_4221.data.u8[4] = (datalayer.battery.max_charge_current & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[5] = (datalayer.battery.max_charge_current >> 8);
|
||||||
|
|
||||||
|
//Max DishargeCurrent
|
||||||
|
PYLON_4220.data.u8[6] = (datalayer.battery.max_discharge_current & 0x00FF);
|
||||||
|
PYLON_4220.data.u8[7] = (datalayer.battery.max_discharge_current >> 8);
|
||||||
|
PYLON_4221.data.u8[6] = (datalayer.battery.max_discharge_current & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[7] = (datalayer.battery.max_discharge_current >> 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Max/Min cell voltage
|
//Max cell voltage
|
||||||
PYLON_4230.data.u8[0] = (datalayer.battery.status.cell_max_voltage_mV >> 8);
|
PYLON_4230.data.u8[0] = (datalayer.battery.status.cell_max_voltage_mV & 0x00FF);
|
||||||
PYLON_4230.data.u8[1] = (datalayer.battery.status.cell_max_voltage_mV & 0x00FF);
|
PYLON_4230.data.u8[1] = (datalayer.battery.status.cell_max_voltage_mV >> 8);
|
||||||
PYLON_4230.data.u8[2] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
|
PYLON_4231.data.u8[0] = (datalayer.battery.status.cell_max_voltage_mV & 0x00FF);
|
||||||
PYLON_4230.data.u8[3] = (datalayer.battery.status.cell_min_voltage_mV & 0x00FF);
|
PYLON_4231.data.u8[1] = (datalayer.battery.status.cell_max_voltage_mV >> 8);
|
||||||
|
|
||||||
|
//Min cell voltage
|
||||||
|
PYLON_4230.data.u8[2] = (datalayer.battery.status.cell_min_voltage_mV & 0x00FF);
|
||||||
|
PYLON_4230.data.u8[3] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
|
||||||
|
PYLON_4231.data.u8[2] = (datalayer.battery.status.cell_min_voltage_mV & 0x00FF);
|
||||||
|
PYLON_4231.data.u8[3] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
|
||||||
|
|
||||||
|
//Max temperature per cell
|
||||||
|
PYLON_4240.data.u8[0] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
PYLON_4240.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
|
PYLON_4241.data.u8[0] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
PYLON_4241.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
|
|
||||||
//Max/Min temperature per cell
|
//Max/Min temperature per cell
|
||||||
|
PYLON_4240.data.u8[2] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
PYLON_4240.data.u8[3] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
|
PYLON_4240.data.u8[2] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
PYLON_4240.data.u8[3] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
|
|
||||||
|
//Max temperature per module
|
||||||
|
PYLON_4270.data.u8[0] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
PYLON_4270.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
|
PYLON_4271.data.u8[0] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
PYLON_4271.data.u8[1] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
|
|
||||||
|
//Min temperature per module
|
||||||
|
PYLON_4270.data.u8[2] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
PYLON_4270.data.u8[3] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
|
PYLON_4271.data.u8[2] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
PYLON_4271.data.u8[3] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
|
#else
|
||||||
|
//Voltage (370.0)
|
||||||
|
PYLON_4210.data.u8[0] = (datalayer.battery.status.voltage_dV >> 8;
|
||||||
|
PYLON_4210.data.u8[1] = (datalayer.battery.status.voltage_dV & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[0] = (datalayer.battery.status.voltage_dV >> 8);
|
||||||
|
PYLON_4211.data.u8[1] = (datalayer.battery.status.voltage_dV & 0x00FF);
|
||||||
|
|
||||||
|
#ifdef SET_30K_OFFSET
|
||||||
|
//Current (15.0)
|
||||||
|
PYLON_4210.data.u8[2] = ((datalayer.battery.status.current_dA + 30000) >> 8);
|
||||||
|
PYLON_4210.data.u8[3] = ((datalayer.battery.status.current_dA + 30000) & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[2] = ((datalayer.battery.status.current_dA + 30000) >> 8);
|
||||||
|
PYLON_4211.data.u8[3] = ((datalayer.battery.status.current_dA + 30000) & 0x00FF);
|
||||||
|
#else
|
||||||
|
PYLON_4210.data.u8[2] = (datalayer.battery.status.current_dA >> 8);
|
||||||
|
PYLON_4210.data.u8[3] = (datalayer.battery.status.current_dA & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[2] = (datalayer.battery.status.current_dA >> 8);
|
||||||
|
PYLON_4211.data.u8[3] = (datalayer.battery.status.current_dA & 0x00FF);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// BMS Temperature (We dont have BMS temp, send max cell voltage instead)
|
||||||
|
PYLON_4210.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
||||||
|
PYLON_4210.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
||||||
|
PYLON_4211.data.u8[4] = ((datalayer.battery.status.temperature_max_dC + 1000) >> 8);
|
||||||
|
PYLON_4211.data.u8[5] = ((datalayer.battery.status.temperature_max_dC + 1000) & 0x00FF);
|
||||||
|
|
||||||
|
//Maxvoltage (eg 400.0V = 4000 , 16bits long) Discharge Cutoff Voltage
|
||||||
|
PYLON_4220.data.u8[0] = (datalayer.battery.info.max_design_voltage_dV >> 8);
|
||||||
|
PYLON_4220.data.u8[1] = (datalayer.battery.info.max_design_voltage_dV & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[0] = (datalayer.battery.info.max_design_voltage_dV >> 8);
|
||||||
|
PYLON_4221.data.u8[1] = (datalayer.battery.info.max_design_voltage_dV & 0x00FF);
|
||||||
|
|
||||||
|
//Minvoltage (eg 300.0V = 3000 , 16bits long) Charge Cutoff Voltage
|
||||||
|
PYLON_4220.data.u8[2] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
||||||
|
PYLON_4220.data.u8[3] = (datalayer.battery.info.min_design_voltage_dV & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[2] = (datalayer.battery.info.min_design_voltage_dV >> 8);
|
||||||
|
PYLON_4221.data.u8[3] = (datalayer.battery.info.min_design_voltage_dV & 0x00FF);
|
||||||
|
|
||||||
|
#ifdef SET_30K_OFFSET
|
||||||
|
//Max ChargeCurrent
|
||||||
|
PYLON_4220.data.u8[4] = ((datalayer.battery.info.max_charge_current + 30000) >> 8);
|
||||||
|
PYLON_4220.data.u8[5] = ((datalayer.battery.info.max_charge_current + 30000) & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[4] = ((datalayer.battery.info.max_charge_current + 30000) >> 8);
|
||||||
|
PYLON_4221.data.u8[5] = ((datalayer.battery.info.max_charge_current + 30000) & 0x00FF);
|
||||||
|
|
||||||
|
//Max DishargeCurrent
|
||||||
|
PYLON_4220.data.u8[6] = ((datalayer.battery.max_discharge_current + 30000) >> 8);
|
||||||
|
PYLON_4220.data.u8[7] = ((datalayer.battery.max_discharge_current + 30000) & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[6] = ((datalayer.battery.max_discharge_current + 30000) >> 8);
|
||||||
|
PYLON_4221.data.u8[7] = ((datalayer.battery.max_discharge_current + 30000) & 0x00FF);
|
||||||
|
#else
|
||||||
|
//Max ChargeCurrent
|
||||||
|
PYLON_4220.data.u8[4] = (datalayer.battery.max_charge_current >> 8);
|
||||||
|
PYLON_4220.data.u8[5] = (datalayer.battery.max_charge_current & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[4] = (datalayer.battery.max_charge_current >> 8);
|
||||||
|
PYLON_4221.data.u8[5] = (datalayer.battery.max_charge_current & 0x00FF);
|
||||||
|
|
||||||
|
//Max DishargeCurrent
|
||||||
|
PYLON_4220.data.u8[6] = (datalayer.battery.max_discharge_current >> 8);
|
||||||
|
PYLON_4220.data.u8[7] = (datalayer.battery.max_discharge_current & 0x00FF);
|
||||||
|
PYLON_4221.data.u8[6] = (datalayer.battery.max_discharge_current >> 8);
|
||||||
|
PYLON_4221.data.u8[7] = (datalayer.battery.max_discharge_current & 0x00FF);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//Max cell voltage
|
||||||
|
PYLON_4230.data.u8[0] = (datalayer.battery.status.cell_max_voltage_mV >> 8);
|
||||||
|
PYLON_4230.data.u8[1] = (datalayer.battery.status.cell_max_voltage_mV & 0x00FF);
|
||||||
|
PYLON_4231.data.u8[0] = (datalayer.battery.status.cell_max_voltage_mV >> 8);
|
||||||
|
PYLON_4231.data.u8[1] = (datalayer.battery.status.cell_max_voltage_mV & 0x00FF);
|
||||||
|
|
||||||
|
//Min cell voltage
|
||||||
|
PYLON_4230.data.u8[2] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
|
||||||
|
PYLON_4230.data.u8[3] = (datalayer.battery.status.cell_min_voltage_mV & 0x00FF);
|
||||||
|
PYLON_4231.data.u8[2] = (datalayer.battery.status.cell_min_voltage_mV >> 8);
|
||||||
|
PYLON_4231.data.u8[3] = (datalayer.battery.status.cell_min_voltage_mV & 0x00FF);
|
||||||
|
|
||||||
|
//Max temperature per cell
|
||||||
PYLON_4240.data.u8[0] = (datalayer.battery.status.temperature_max_dC >> 8);
|
PYLON_4240.data.u8[0] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
PYLON_4240.data.u8[1] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
PYLON_4240.data.u8[1] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
PYLON_4241.data.u8[0] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
|
PYLON_4241.data.u8[1] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
|
||||||
|
//Max/Min temperature per cell
|
||||||
|
PYLON_4240.data.u8[2] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
|
PYLON_4240.data.u8[3] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
PYLON_4240.data.u8[2] = (datalayer.battery.status.temperature_min_dC >> 8);
|
PYLON_4240.data.u8[2] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
PYLON_4240.data.u8[3] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
PYLON_4240.data.u8[3] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
|
||||||
//Max/Min temperature per module
|
//Max temperature per module
|
||||||
PYLON_4270.data.u8[0] = (datalayer.battery.status.temperature_max_dC >> 8);
|
PYLON_4270.data.u8[0] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
PYLON_4270.data.u8[1] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
PYLON_4270.data.u8[1] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
PYLON_4271.data.u8[0] = (datalayer.battery.status.temperature_max_dC >> 8);
|
||||||
|
PYLON_4271.data.u8[1] = (datalayer.battery.status.temperature_max_dC & 0x00FF);
|
||||||
|
|
||||||
|
//Min temperature per module
|
||||||
PYLON_4270.data.u8[2] = (datalayer.battery.status.temperature_min_dC >> 8);
|
PYLON_4270.data.u8[2] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
PYLON_4270.data.u8[3] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
PYLON_4270.data.u8[3] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
PYLON_4271.data.u8[2] = (datalayer.battery.status.temperature_min_dC >> 8);
|
||||||
|
PYLON_4271.data.u8[3] = (datalayer.battery.status.temperature_min_dC & 0x00FF);
|
||||||
|
#endif
|
||||||
|
|
||||||
//In case we run into any errors/faults, we can set charge / discharge forbidden
|
//In case we run into any errors/faults, we can set charge / discharge forbidden
|
||||||
if (datalayer.battery.status.bms_status == FAULT) {
|
if (datalayer.battery.status.bms_status == FAULT) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue