From e49af3edd77a3494ff255c45eeee85bd8b287737 Mon Sep 17 00:00:00 2001 From: Thales1330 Date: Wed, 9 Nov 2016 17:38:02 -0200 Subject: Fixing reactive generation limit [2] --- Project/ElectricCalculation.cpp | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) (limited to 'Project/ElectricCalculation.cpp') diff --git a/Project/ElectricCalculation.cpp b/Project/ElectricCalculation.cpp index a68cc19..569a31e 100644 --- a/Project/ElectricCalculation.cpp +++ b/Project/ElectricCalculation.cpp @@ -159,6 +159,7 @@ bool ElectricCalculation::GetYBus(std::vector > void ElectricCalculation::UpdateElementsPowerFlow(std::vector > voltage, std::vector > power, std::vector busType, + std::vector reactiveLimit, double systemPowerBase) { // Buses voltages @@ -243,6 +244,7 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector syncGeneratorsOnBus; std::vector syncMotorsOnBus; std::complex loadPower(0.0, 0.0); + for(auto itsg = m_syncGeneratorList.begin(); itsg != m_syncGeneratorList.end(); itsg++) { SyncGenerator* syncGenerator = *itsg; if(bus == syncGenerator->GetParentList()[0] && syncGenerator->IsOnline()) @@ -309,8 +311,21 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vectorGetPUElectricalData(systemPowerBase); + + double reactivePower = (power[i].imag() + loadPower.imag()) * systemPowerBase; + + if(reactiveLimit[i].limitReached == RL_MAX_REACHED) + reactivePower *= (childData_PU.maxReactive / reactiveLimit[i].maxLimit); + + else if(reactiveLimit[i].limitReached == RL_MIN_REACHED) + reactivePower *= (childData_PU.minReactive / reactiveLimit[i].minLimit); + + else + reactivePower /= (double)(syncGeneratorsOnBus.size() + syncMotorsOnBus.size()); + switch(childData.reactivePowerUnit) { case UNIT_PU: { reactivePower /= systemPowerBase; @@ -343,8 +358,24 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vectorGetElectricalData(); if(busType[i] == BUS_PV || busType[i] == BUS_SLACK) { - double reactivePower = (power[i].imag() + loadPower.imag()) * systemPowerBase / - (double)(syncGeneratorsOnBus.size() + syncMotorsOnBus.size()); + // double reactivePower = (power[i].imag() + loadPower.imag()) * systemPowerBase / + // (double)(syncGeneratorsOnBus.size() + syncMotorsOnBus.size()); + + SyncMotorElectricalData childData_PU = syncMotor->GetPUElectricalData(systemPowerBase); + + double reactivePower = (power[i].imag() + loadPower.imag()) * systemPowerBase; + + // Bus reachd maximum reactive limit. + if(reactiveLimit[i].limitReached == RL_MAX_REACHED) + reactivePower *= (childData_PU.maxReactive / reactiveLimit[i].maxLimit); + // Bus reached minimum reactive limit. + else if(reactiveLimit[i].limitReached == RL_MIN_REACHED) + reactivePower *= (childData_PU.minReactive / reactiveLimit[i].minLimit); + // Bus didn't reach any limits + else { + reactivePower /= (double)(syncGeneratorsOnBus.size() + syncMotorsOnBus.size()); + } + switch(childData.reactivePowerUnit) { case UNIT_PU: { reactivePower /= systemPowerBase; -- cgit