From 2ade313e301d626a7e4a4ec9534d910464f03865 Mon Sep 17 00:00:00 2001 From: mackelec Date: Mon, 20 Nov 2023 12:10:18 +1000 Subject: [PATCH 1/2] Add files via upload --- Software/src/battery/BATTERIES.h | 5 ++ .../SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp | 86 +++++++++++++++++++ .../SERIAL-LINK-RECEIVER-FROM-BATTERY.h | 51 +++++++++++ 3 files changed, 142 insertions(+) create mode 100644 Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp create mode 100644 Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h diff --git a/Software/src/battery/BATTERIES.h b/Software/src/battery/BATTERIES.h index d68a892f..1880d8e8 100644 --- a/Software/src/battery/BATTERIES.h +++ b/Software/src/battery/BATTERIES.h @@ -32,4 +32,9 @@ #ifdef TEST_FAKE_BATTERY #include "TEST-FAKE-BATTERY.h" //See this file for more Fake battery settings #endif + +#ifdef SERIAL_LINK_RECEIVER_FROM_BATTERY +#include "SERIAL-LINK-RECEIVER-FROM-BATTERY.h" +#endif + #endif diff --git a/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp new file mode 100644 index 00000000..55641393 --- /dev/null +++ b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp @@ -0,0 +1,86 @@ +// SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp + +#include "SERIAL-LINK-RECEIVER-FROM-BATTERY.h" + +#define INVERTER_SEND_NUM_VARIABLES 3 //--- comment out if nothing to send +#define INVERTER_RECV_NUM_VARIABLES 16 + +#ifdef INVERTER_SEND_NUM_VARIABLES + const uint8_t sendingNumVariables = INVERTER_SEND_NUM_VARIABLES; +#else + const uint8_t sendingNumVariables = 0; +#endif + +// txid,rxid, num_send,num_recv +SerialDataLink dataLinkReceive(Serial2, 0, 0x01, sendingNumVariables, + INVERTER_RECV_NUM_VARIABLES); // ... + + + + +void __getData() +{ + SOC = (uint16_t) dataLinkReceive.getReceivedData(0); + StateOfHealth = (uint16_t) dataLinkReceive.getReceivedData(1); + battery_voltage = (uint16_t) dataLinkReceive.getReceivedData(2); + battery_current = (uint16_t) dataLinkReceive.getReceivedData(3); + capacity_Wh = (uint16_t) dataLinkReceive.getReceivedData(4); + remaining_capacity_Wh = (uint16_t) dataLinkReceive.getReceivedData(5); + max_target_discharge_power = (uint16_t) dataLinkReceive.getReceivedData(6); + max_target_charge_power = (uint16_t) dataLinkReceive.getReceivedData(7); + bms_status = (uint16_t) dataLinkReceive.getReceivedData(8); + bms_char_dis_status = (uint16_t) dataLinkReceive.getReceivedData(9); + stat_batt_power = (uint16_t) dataLinkReceive.getReceivedData(10); + temperature_min = (uint16_t) dataLinkReceive.getReceivedData(11); + temperature_max = (uint16_t) dataLinkReceive.getReceivedData(12); + cell_max_voltage = (uint16_t) dataLinkReceive.getReceivedData(13); + cell_min_voltage = (uint16_t) dataLinkReceive.getReceivedData(14); + batteryAllowsContactorClosing = (uint16_t) dataLinkReceive.getReceivedData(15); +} + +void updateData() +{ + // --- update with fresh data + /* + dataLinkReceive.updateData(0,var1); + dataLinkReceive.updateData(1,var2); + dataLinkReceive.updateData(2,var3); + */ +} + + +/* +* @ 9600bps, assume void manageSerialLinkReceiver() +* is called every 1mS +*/ + +void manageSerialLinkReceiver() +{ + dataLinkReceive.run(); + bool readError = dataLinkReceive.checkReadError(true); // check for error & clear error flag + if (dataLinkReceive.checkNewData(true)) // true = clear Flag + { + __getData(); + } + + + + #ifdef INVERTER_SEND_NUM_VARIABLES + static bool initLink=false; + static unsigned long updateTime = 0; + if (! initLink) + { + initLink = true; + // sends variables every 5000mS even if no change + dataLinkReceive.setUpdateInterval(5000); + } + unsigned long currentTime = millis(); + if (currentTime - updateTime > 100) + { + updateTime = currentTime; + dataLinkReceive.run(); + bool sendError = dataLinkReceive.checkTransmissionError(true); // check for error & clear error flag + updateData(); + } + #endif +} diff --git a/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h new file mode 100644 index 00000000..04ebe799 --- /dev/null +++ b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h @@ -0,0 +1,51 @@ +// SERIAL-LINK-RECEIVER-FROM-BATTERY.h + +#ifndef SERIAL_LINK_RECEIVER_FROM_BATTERY_H +#define SERIAL_LINK_RECEIVER_FROM_BATTERY_H + +#include +#include "../../USER_SETTINGS.h" +#include "../lib/SerialDataLink/SerialDataLink.h" + +// https://github.com/mackelec/SerialDataLink + +#define ABSOLUTE_MAX_VOLTAGE \ + 4040 // 404.4V,if battery voltage goes over this, charging is not possible (goes into forced discharge) +#define ABSOLUTE_MIN_VOLTAGE 3100 // 310.0V if battery voltage goes under this, discharging further is disabled + + +// These parameters need to be mapped for the inverter +extern uint16_t SOC; //SOC%, 0-100.00 (0-10000) +extern uint16_t StateOfHealth; //SOH%, 0-100.00 (0-10000) +extern uint16_t battery_voltage; //V+1, 0-500.0 (0-5000) +extern uint16_t battery_current; //A+1, Goes thru convert2unsignedint16 function (5.0A = 50, -5.0A = 65485) +extern uint16_t capacity_Wh; //Wh, 0-60000 +extern uint16_t remaining_capacity_Wh; //Wh, 0-60000 +extern uint16_t max_target_discharge_power; //W, 0-60000 +extern uint16_t max_target_charge_power; //W, 0-60000 +extern uint16_t bms_status; //Enum, 0-5 +extern uint16_t bms_char_dis_status; //Enum, 0-2 +extern uint16_t stat_batt_power; //W, Goes thru convert2unsignedint16 function (5W = 5, -5W = 65530) +extern uint16_t temperature_min; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385) +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 bool batteryAllowsContactorClosing; //Bool, 1=true, 0=false + + + + + + +void manageSerialLinkReceiver(); + + + + + + + + + + +#endif \ No newline at end of file From f1f0917626b2791b77a14ba3a88d9e2057b0b279 Mon Sep 17 00:00:00 2001 From: mackelec Date: Mon, 20 Nov 2023 12:11:51 +1000 Subject: [PATCH 2/2] Add files via upload --- Software/src/inverter/INVERTERS.h | 4 + .../SERIAL-LINK-TRANSMITTER-INVERTER.cpp | 81 +++++++++++++++++++ .../SERIAL-LINK-TRANSMITTER-INVERTER.h | 41 ++++++++++ 3 files changed, 126 insertions(+) create mode 100644 Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.cpp create mode 100644 Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.h diff --git a/Software/src/inverter/INVERTERS.h b/Software/src/inverter/INVERTERS.h index 97527c2b..9d8825f7 100644 --- a/Software/src/inverter/INVERTERS.h +++ b/Software/src/inverter/INVERTERS.h @@ -29,4 +29,8 @@ #include "SOLAX-CAN.h" #endif +#ifdef SERIAL_LINK_TRANSMITTER_INVERTER +#include "SERIAL-LINK-TRANSMITTER-INVERTER.h" +#endif + #endif diff --git a/Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.cpp b/Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.cpp new file mode 100644 index 00000000..f25479cd --- /dev/null +++ b/Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.cpp @@ -0,0 +1,81 @@ +//SERIAL-LINK-TRANSMITTER-INVERTER.cpp + +#include "SERIAL-LINK-TRANSMITTER-INVERTER.h" + +/* +* SerialDataLink +* txid=1, rxid=0 gives this the startup transmit priority_queue +* Will transmit max 16 int variable - receive none +*/ + +#define BATTERY_SEND_NUM_VARIABLES 16 +#define BATTERY_RECV_NUM_VARIABLES 3 //--- comment out if nothing to receive + +#ifdef BATTERY_RECV_NUM_VARIABLES + const uint8_t receivingNumVariables = BATTERY_RECV_NUM_VARIABLES; +#else + const uint8_t receivingNumVariables = 0; +#endif + +// txid,rxid,num_tx,num_rx +SerialDataLink dataLinkTransmit(Serial2, 0x01, 0, BATTERY_SEND_NUM_VARIABLES, + receivingNumVariables ); + + +void _getData() +{ + /* + var1 = dataLinkTransmit.getReceivedData(0); + var2 = dataLinkTransmit.getReceivedData(1); + var3 = dataLinkTransmit.getReceivedData(2); + */ +} + + +void manageSerialLinkTransmitter() +{ + static bool initLink=false; + static unsigned long updateTime = 0; + + dataLinkTransmit.run(); + + #ifdef BATTERY_RECV_NUM_VARIABLES + bool readError = dataLinkTransmit.checkReadError(true); // check for error & clear error flag + if (dataLinkTransmit.checkNewData(true)) // true = clear Flag + { + _getData(); + } + #endif + + if (millis() - updateTime > 100) + { + updateTime = millis(); + if (! initLink) + { + initLink = true; + // sends variables every 5000mS even if no change + dataLinkTransmit.setUpdateInterval(5000); + } + bool sendError = dataLinkTransmit.checkTransmissionError(true); + // todo some error management - LEDS etc + + dataLinkTransmit.updateData(0,SOC); + dataLinkTransmit.updateData(1,StateOfHealth); + dataLinkTransmit.updateData(2,battery_voltage); + dataLinkTransmit.updateData(3,battery_current); + dataLinkTransmit.updateData(4,capacity_Wh); + dataLinkTransmit.updateData(5,remaining_capacity_Wh); + dataLinkTransmit.updateData(6,max_target_discharge_power); + dataLinkTransmit.updateData(7,max_target_charge_power); + dataLinkTransmit.updateData(8,bms_status); + dataLinkTransmit.updateData(9,bms_char_dis_status); + dataLinkTransmit.updateData(10,stat_batt_power); + dataLinkTransmit.updateData(11,temperature_min); + dataLinkTransmit.updateData(12,temperature_max); + dataLinkTransmit.updateData(13,cell_max_voltage); + dataLinkTransmit.updateData(14,cell_min_voltage); + dataLinkTransmit.updateData(15,batteryAllowsContactorClosing); + } + + +} \ No newline at end of file diff --git a/Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.h b/Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.h new file mode 100644 index 00000000..8a54741e --- /dev/null +++ b/Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.h @@ -0,0 +1,41 @@ +//SERIAL-LINK-TRANSMITTER-INVERTER.h + +#ifndef SERIAL_LINK_TRANSMITTER_INVERTER_H +#define SERIAL_LINK_TRANSMITTER_INVERTER_H + + +#include +#include "../../USER_SETTINGS.h" +#include "../lib/SerialDataLink/SerialDataLink.h" + + +// These parameters need to be mapped for the inverter +extern uint16_t SOC; //SOC%, 0-100.00 (0-10000) +extern uint16_t StateOfHealth; //SOH%, 0-100.00 (0-10000) +extern uint16_t battery_voltage; //V+1, 0-500.0 (0-5000) +extern uint16_t battery_current; //A+1, Goes thru convert2unsignedint16 function (5.0A = 50, -5.0A = 65485) +extern uint16_t capacity_Wh; //Wh, 0-60000 +extern uint16_t remaining_capacity_Wh; //Wh, 0-60000 +extern uint16_t max_target_discharge_power; //W, 0-60000 +extern uint16_t max_target_charge_power; //W, 0-60000 +extern uint16_t bms_status; //Enum, 0-5 +extern uint16_t bms_char_dis_status; //Enum, 0-2 +extern uint16_t stat_batt_power; //W, Goes thru convert2unsignedint16 function (5W = 5, -5W = 65530) +extern uint16_t temperature_min; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385) +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 bool batteryAllowsContactorClosing; //Bool, 1=true, 0=false + + + +void manageSerialLinkTransmitter(); + + + + + + + + +#endif \ No newline at end of file