package mods.eln.sim; import mods.eln.misc.FunctionTable; import mods.eln.sim.mna.component.VoltageSource; import mods.eln.sim.mna.state.VoltageState; public class BatteryProcess implements IProcess { VoltageState positiveLoad, negativeLoad; public FunctionTable voltageFunction; public double Q = 0, QNominal = 0; public double uNominal = 0; public double life = 1.0; //public double efficiency = 1.0; public VoltageSource voltageSource; public boolean isRechargeable = true; public double IMax = 20; public BatteryProcess(VoltageState positiveLoad, VoltageState negativeLoad, FunctionTable voltageFunction, double IMax, VoltageSource voltageSource) { this.positiveLoad = positiveLoad; this.negativeLoad = negativeLoad; this.voltageFunction = voltageFunction; this.IMax = IMax; this.voltageSource = voltageSource; } @Override public void process(double time) { // Utils.print("*"); Q -= voltageSource.getCurrent() * time / QNominal; double voltage = computeVoltage(); voltageSource.setU(voltage); /*double Cequ = (positiveLoad.getC() * negativeLoad.getC()) / (positiveLoad.getC() + negativeLoad.getC()); double QNeeded = (voltage - (positiveLoad.Uc - negativeLoad.Uc)) * Cequ; //Q -= QNeeded > 0 ? QNeeded : QNeeded * efficiency; if (isRechargeable == true || QNeeded > 0) { double I = QNeeded / time; if (I > IMax) I = IMax; if (I < -IMax) I = -IMax; ElectricalLoad.moveCurrent(I, negativeLoad, positiveLoad); Q -= I * time; dischargeCurrentMesure = I; } else { dischargeCurrentMesure = 0; }*/ } double computeVoltage() { double voltage = voltageFunction.getValue(Q / life); return Math.max(0, voltage * uNominal); } public double getQRatio() { return Q; } public void changeLife(double newLife) { if (newLife < life) { Q *= newLife / life; } life = newLife; } public double getCharge() { return Q / life; } public void setCharge(double charge) { Q = life * charge; } public double getEnergy() { int stepNbr = 50; double chargeStep = getCharge() / stepNbr; double chargeIntegrator = 0; double energy = 0; double QperStep = QNominal * life * chargeStep; for (int step = 0; step < stepNbr; step++) { double voltage = voltageFunction.getValue(chargeIntegrator) * uNominal; energy += voltage * QperStep; chargeIntegrator += chargeStep; } return energy; /*double probeU = (positiveLoad.Uc - negativeLoad.Uc); double q = 0, dq = 0.00001; double e = 0; double u; while ((u = voltageFunction.getValue(q) * uNominal) < probeU) { e += u * dq * QNominal; q += dq; //if (e > 1) break; } return e * life; */ } public double getEnergyMax() { int stepNbr = 50; double chargeStep = 1.0 / stepNbr; double chargeIntegrator = 0; double energy = 0; double QperStep = QNominal * life * 1.0 / stepNbr; for (int step = 0; step < stepNbr; step++) { double voltage = voltageFunction.getValue(chargeIntegrator) * uNominal; energy += voltage * QperStep; chargeIntegrator += chargeStep; } return energy; } public double getU() { return computeVoltage(); } public double getDischargeCurrent() { return voltageSource.getI(); } }