Fix charge allowed message

This commit is contained in:
Daniel 2024-02-15 21:38:44 +02:00
parent a238c8b925
commit 2408da389c
2 changed files with 74 additions and 11 deletions

View file

@ -2,6 +2,8 @@
#include "../lib/miwagner-ESP32-Arduino-CAN/CAN_config.h"
#include "../lib/miwagner-ESP32-Arduino-CAN/ESP32CAN.h"
/* TODO: Map error bits in 0x158 */
/* Do not change code below unless you are sure what you are doing */
static unsigned long previousMillis100ms = 0; // will store last time a 100ms CAN Message was send
static const int interval100ms = 100; // interval (ms) at which send CAN Messages
@ -94,10 +96,12 @@ CAN_frame_t SMA_158 = {.FIR = {.B =
.MsgID = 0x158,
.data = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x6A, 0xAA, 0xAA}};
static int discharge_current = 0;
static int charge_current = 0;
static int temperature_average = 0;
static int ampere_hours_remaining = 0;
static int16_t discharge_current = 0;
static int16_t charge_current = 0;
static int16_t temperature_average = 0;
static int16_t temp_min = 0;
static int16_t temp_max = 0;
static uint16_t ampere_hours_remaining = 0;
void update_values_can_sma() { //This function maps all the values fetched from battery CAN to the correct CAN messages
//Calculate values
@ -111,7 +115,9 @@ void update_values_can_sma() { //This function maps all the values fetched from
//The above calculation results in (30 000*10)/3700=81A
discharge_current = (discharge_current * 10); //Value needs a decimal before getting sent to inverter (81.0A)
temperature_average = ((temperature_max + temperature_min) / 2);
temp_min = temperature_min; //Convert from unsigned to signed
temp_max = temperature_max;
temperature_average = ((temp_max + temp_min) / 2);
ampere_hours_remaining =
((remaining_capacity_Wh / battery_voltage) * 100); //(WH[10000] * V+1[3600])*100 = 270 (27.0Ah)
@ -149,10 +155,63 @@ void update_values_can_sma() { //This function maps all the values fetched from
//Temperature average
SMA_4D8.data.u8[4] = (temperature_average >> 8);
SMA_4D8.data.u8[5] = (temperature_average & 0x00FF);
//Battery ready
if (bms_status == ACTIVE) {
SMA_4D8.data.u8[6] = READY_STATE;
} else {
SMA_4D8.data.u8[6] = STOP_STATE;
}
//Error bits
/*
//SMA_158.data.u8[0] = //bit12 Fault high temperature, bit34Battery cellundervoltage, bit56 Battery cell overvoltage, bit78 batterysystemdefect
//TODO: add all error bits. Sending message with all 0xAA until that.
0x158 can be used to send error messages or warnings.
Each message is defined of two bits:
01=message triggered
10=no message triggered
0xA9=10101001, triggers first message
0xA6=10100110, triggers second message
0x9A=10011010, triggers third message
0x6A=01101010, triggers forth message
bX defines the byte
b0 A9 Battery system defect
b0 A6 Battery cell overvoltage fault
b0 9A Battery cell undervoltage fault
b0 6A Battery high temperature fault
b1 A9 Battery low temperature fault
b1 A6 Battery high temperature fault
b1 9A Battery low temperature fault
b1 6A Overload (reboot required)
b2 A9 Overload (reboot required)
b2 A6 Incorrect switch position for the battery disconnection point
b2 9A Battery system short circuit
b2 6A Internal battery hardware fault
b3 A9 Battery imbalancing fault
b3 A6 Battery service life expiry
b3 9A Battery system thermal management defective
b3 6A Internal battery hardware fault
b4 A9 Battery system defect (warning)
b4 A6 Battery cell overvoltage fault (warning)
b4 9A Battery cell undervoltage fault (warning)
b4 6A Battery high temperature fault (warning)
b5 A9 Battery low temperature fault (warning)
b5 A6 Battery high temperature fault (warning)
b5 9A Battery low temperature fault (warning)
b5 6A Self-diagnosis (warning)
b6 A9 Self-diagnosis (warning)
b6 A6 Incorrect switch position for the battery disconnection point (warning)
b6 9A Battery system short circuit (warning)
b6 6A Internal battery hardware fault (warning)
b7 A9 Battery imbalancing fault (warning)
b7 A6 Battery service life expiry (warning)
b7 9A Battery system thermal management defective (warning)
b7 6A Internal battery hardware fault (warning)
*/
}
void receive_can_sma(CAN_frame_t rx_frame) {
@ -164,11 +223,11 @@ void receive_can_sma(CAN_frame_t rx_frame) {
case 0x420: //Message originating from SMA inverter - Timestamp
//Frame0-3 Timestamp
break;
case 0x660: //Message originating from SMA inverter
case 0x3E0: //Message originating from SMA inverter - ?
break;
case 0x5E0: //Message originating from SMA inverter
case 0x5E0: //Message originating from SMA inverter - String
break;
case 0x560: //Message originating from SMA inverter
case 0x560: //Message originating from SMA inverter - Init
break;
default:
break;
@ -185,9 +244,9 @@ void send_can_sma() {
ESP32Can.CANWriteFrame(&SMA_558);
ESP32Can.CANWriteFrame(&SMA_598);
ESP32Can.CANWriteFrame(&SMA_5D8);
ESP32Can.CANWriteFrame(&SMA_618_1);
ESP32Can.CANWriteFrame(&SMA_618_2);
ESP32Can.CANWriteFrame(&SMA_618_3);
ESP32Can.CANWriteFrame(&SMA_618_1); // TODO, should these 3x
ESP32Can.CANWriteFrame(&SMA_618_2); // be sent as batch?
ESP32Can.CANWriteFrame(&SMA_618_3); // or alternate on each send?
ESP32Can.CANWriteFrame(&SMA_358);
ESP32Can.CANWriteFrame(&SMA_3D8);
ESP32Can.CANWriteFrame(&SMA_458);

View file

@ -19,11 +19,15 @@ extern uint16_t temperature_min; //C+1, Goes thru convert2unsignedint16 funct
extern uint16_t temperature_max; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385)
extern uint16_t cell_max_voltage; //mV, 0-4350
extern uint16_t cell_min_voltage; //mV, 0-4350
extern uint8_t bms_status;
extern uint16_t min_voltage;
extern uint16_t max_voltage;
extern bool batteryAllowsContactorClosing; //Bool, 1=true, 0=false
extern bool inverterAllowsContactorClosing; //Bool, 1=true, 0=false
#define READY_STATE 0x03
#define STOP_STATE 0x02
void update_values_can_sma();
void send_can_sma();
void receive_can_sma(CAN_frame_t rx_frame);