/// <summary> /// Berechnet den für den Zeitschlitz zutreffenden Anteil der Selbstentladung des Energieträgers /// </summary> /// <param name="state">Zustandseigenschaften der Batterie</param> /// <param name="seconds">Zeitschlitz in Sekunden</param> private void SetSelfDischarge(BatteryFields initial, BatteryFields now, float seconds) { // Umrechnung sdr pro Jahr in sdr pro Sekunde: [ / Tag * h * min * s] [ / 365 * 24 * 60 * 60]; -> "31536000" var availableCharge = initial.Charge - now.Charge; var selfDischarge = availableCharge * now.SDR; selfDischarge /= 31536000; selfDischarge *= seconds; now.SelfDischarge = selfDischarge; }
/// <summary> /// /// </summary> /// <param name="state"></param> /// <param name="qt">Charge of a time span t</param> /// <returns></returns> private void SetStateOfDischarge(BatteryFields initial, BatteryFields now, float qt) { /* * Berechnung des neuen State-Of-Discharge mittels des neuen timeSlots * SOD = SOD_0 + ((1 - SOD_0) / Q_0) * (qn) <--- PRÜFEN * * SOD -> aktuell berechneter State-of-Discharge * SOD_0 -> initiale Selbstentladung "init_sod" * Q_0 -> initiale el. Ladung des BatteriePacks "Initial.Charge" */ now.SoD = initial.SoD + ((1 - initial.SoD) / initial.Charge) * (qt + now.Charge); }
private float GetChargeConsumption(BatteryFields state, float seconds, float current) { /* * Berechnung des Ladungsverbrauchs für den Zeitraum t: * ----------------------------------------------------- * qt = (i * t * at * bt) + (at * gt) * * qt -> verbrauchte Ladung für den Zeitraum t * i -> Strom ("mA") * t -> Zeitraum in h, damit sich mAh ergeben * at -> Korrekturfaktor alpha_t (Temperaturkorrekturfaktor) * bt -> Korrekturfaktor beta_t (Stromkorrekturfaktor) * gt -> Korrekturfaktor gamma_t (Selbstentladungsfaktor) * * qn = Summe aller qt über die Zeit, quasi die gesamte verbrauchte Ladung */ return((current * (seconds / 3600) * state.TemperaturFactor * state.CurrentFactor) + (state.TemperaturFactor * state.SelfDischarge)); }
/// <summary> /// /// </summary> /// <returns>the resulting voltage </returns> private float GetDischargeVoltage(BatteryPack battery, BatteryFields now) { /* * Berechnung des Entladeverhaltens: * --------------------------------- * Polynom-Funktion des n ten-Grades, bestimmt durch die Länge des Arrays "polynomials" * die Laufvariable i entspricht der Potenz: * [0] -> x^0 | [1] -> x^1 | [2] -> x^2 ... * * resultierende Formel: * -------------------- * v = poly.[0] + poly.[1] * sod ^ 1 + poly.[2] * sod ^ [2] ... * v *= Temperaturkorrektur */ float v = 0; for (int i = 0; i < battery.Polynom.Length; i++) { v += (float)(battery.Polynom[i] * Math.Pow(now.SoD, i)); } v *= now.TemperaturFactor; return(v); }
// --constructors public BatteryState(BatteryFields fields) { Initial = fields; Now = fields.Copy(); Now.Charge = 0; // actual used load should be zero and will be increased during simulation }