diff options
Diffstat (limited to 'Project/Electromechanical.cpp')
-rw-r--r-- | Project/Electromechanical.cpp | 79 |
1 files changed, 37 insertions, 42 deletions
diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index 4b8a711..b1d0e2f 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -513,11 +513,6 @@ bool Electromechanical::InitializeDynamicElements() double epq = vq0 + ra * iq0 - xp * id0; sd = 1.0 + satF * std::pow(epq, 6); xds = (xd - xp) / sd + xp; - /*CalculateSyncMachineSaturation(syncGenerator, id0, iq0, sq, sd, true, k); - xqs = (xq - xp) / sq + xp; - xds = (xd - xp) / sd + xp; - eq0 = data.terminalVoltage + std::complex<double>(ra, xqs) * ia; - delta = std::arg(eq0);*/ } double ef0 = vq0 + ra * iq0 - xds * id0; @@ -541,14 +536,8 @@ bool Electromechanical::InitializeDynamicElements() data.oldSd = sd; data.oldSq = sq; - m_sdC = sd; - m_sqC = sq; - switch(data.model) { case Machines::SM_MODEL_1: { - // double tranXd = data.transXd * k; - - // data.tranEq = data.initialFieldVoltage + (xd - tranXd) * id0; data.tranEq = std::abs(eq0); data.tranEd = 0.0; @@ -606,10 +595,18 @@ bool Electromechanical::InitializeDynamicElements() // Initialize controllers if(data.useAVR) { if(data.avrSolver) delete data.avrSolver; - data.avrSolver = new ControlElementSolver(data.avr, m_timeStep * m_ctrlTimeStepMultiplier, m_tolerance, - false, std::abs(data.terminalVoltage), m_parent); + data.avrSolver = + new ControlElementSolver(data.avr, m_timeStep * m_ctrlTimeStepMultiplier, m_tolerance, m_parent); + data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage)); + data.avrSolver->SetInitialTerminalVoltage(std::abs(data.terminalVoltage)); + data.avrSolver->SetActivePower(dataPU.activePower); + data.avrSolver->SetReactivePower(dataPU.reactivePower); + data.avrSolver->SetVelocity(data.speed); + data.avrSolver->SetInitialVelocity(data.speed); + data.avrSolver->InitializeValues(false); if(!data.avrSolver->IsOK()) { - m_errorMsg = _("Error on initializate the AVR of \"") + data.name + _("\"."); + m_errorMsg = _("Error on initializate the AVR of \"") + data.name + wxT("\".\n") + + data.avrSolver->GetErrorMessage(); syncGenerator->SetElectricalData(data); return false; } @@ -617,9 +614,16 @@ bool Electromechanical::InitializeDynamicElements() if(data.useSpeedGovernor) { if(data.speedGovSolver) delete data.speedGovSolver; data.speedGovSolver = new ControlElementSolver(data.speedGov, m_timeStep * m_ctrlTimeStepMultiplier, - m_tolerance, false, data.speed, m_parent); + m_tolerance, m_parent); + data.speedGovSolver->SetActivePower(dataPU.activePower); + data.speedGovSolver->SetReactivePower(dataPU.reactivePower); + data.speedGovSolver->SetVelocity(data.speed); + data.speedGovSolver->SetInitialVelocity(data.speed); + data.speedGovSolver->SetInitialMecPower(data.pm); + data.speedGovSolver->InitializeValues(false); if(!data.speedGovSolver->IsOK()) { - m_errorMsg = _("Error on initializate the speed governor of \"") + data.name + _("\"."); + m_errorMsg = _("Error on initializate the speed governor of \"") + data.name + wxT("\".\n") + + data.speedGovSolver->GetErrorMessage(); syncGenerator->SetElectricalData(data); return false; } @@ -686,7 +690,6 @@ bool Electromechanical::CalculateMachinesCurrents() xdqs = 0.5 * (xds + xqs); std::complex<double> y0 = std::complex<double>(ra, -xdq) / std::complex<double>(ra * ra + xd * xq, 0.0); - // std::complex<double> iUnadjusted = y0 * e; std::complex<double> iUnadjusted = y0 * v; // [Ref] Arrillaga, J.; Arnold, C. P.. "Computer Modelling of Electrical Power Systems". Pg. 225-226 @@ -765,8 +768,6 @@ void Electromechanical::CalculateIntegrationConstants(SyncGenerator* syncGenerat if(data.model == Machines::SM_MODEL_2 || data.model == Machines::SM_MODEL_3 || data.model == Machines::SM_MODEL_4 || data.model == Machines::SM_MODEL_5) { data.icTranEq.m = m_timeStep / (2.0f * transTd0 + m_timeStep); - // data.icTranEq.c = (1.0f - 2.0 * data.icTranEq.m) * data.tranEq + - // data.icTranEq.m * (data.fieldVoltage + (syncXd - transXd) * id); data.icTranEq.c = (1.0 - data.icTranEq.m * (1.0 + data.sd)) * data.tranEq + data.icTranEq.m * (data.fieldVoltage + (syncXd - transXd) * id); } @@ -774,7 +775,6 @@ void Electromechanical::CalculateIntegrationConstants(SyncGenerator* syncGenerat // Ed' if(data.model == Machines::SM_MODEL_3 || data.model == Machines::SM_MODEL_4 || data.model == Machines::SM_MODEL_5) { data.icTranEd.m = m_timeStep / (2.0f * transTq0 + m_timeStep); - // data.icTranEd.c = (1.0f - 2.0f * data.icTranEd.m) * data.tranEd - data.icTranEd.m * (syncXq - transXq) * iq; data.icTranEd.c = (1.0 - data.icTranEd.m * (1.0 + data.sq)) * data.tranEd - data.icTranEd.m * (syncXq - transXq) * iq; } @@ -782,22 +782,17 @@ void Electromechanical::CalculateIntegrationConstants(SyncGenerator* syncGenerat // Eq'' if(data.model == Machines::SM_MODEL_4 || data.model == Machines::SM_MODEL_5) { data.icSubEq.m = m_timeStep / (2.0f * subTd0 + m_timeStep); - // data.icSubEq.c = - // (1.0f - 2.0f * data.icSubEq.m) * data.subEq + data.icSubEq.m * (data.tranEq + (transXd - subXd) * id); data.icSubEq.c = (1.0 - data.icSubEq.m * (1.0 + data.sd)) * data.subEq + data.icSubEq.m * (data.sd * data.tranEq + (transXd - subXd) * id); } // Ed'' if(data.model == Machines::SM_MODEL_4) { data.icSubEd.m = m_timeStep / (2.0f * subTq0 + m_timeStep); - // data.icSubEd.c = (1.0f - 2.0f * data.icSubEd.m) * data.subEd - data.icSubEd.m * (syncXq - subXq) * iq; data.icSubEd.c = (1.0f - data.icSubEd.m * (1.0 + data.sq)) * data.subEd - data.icSubEd.m * (syncXq - subXq) * iq; } if(data.model == Machines::SM_MODEL_5) { data.icSubEd.m = m_timeStep / (2.0f * subTq0 + m_timeStep); - // data.icSubEd.c = - // (1.0f - 2.0f * data.icSubEd.m) * data.subEd + data.icSubEd.m * (data.tranEd - (transXq - subXq) * iq); data.icSubEd.c = (1.0f - data.icSubEd.m * (1.0 + data.sq)) * data.subEd + data.icSubEd.m * (data.sq * data.tranEd - (transXq - subXq) * iq); } @@ -836,17 +831,12 @@ bool Electromechanical::SolveSynchronousMachines() sd = 2.0 * sd - data.oldSd; sq = 2.0 * sq - data.oldSq; - m_sdC = sd; - m_sqC = sq; - CalculateSyncMachineIntVariables(syncGenerator, id, iq, sd, sq, pe, k); } else { CalculateIntegrationConstants(syncGenerator, 0.0f, 0.0f); } } - m_wError = 0; - double error = 1.0; int iterations = 0; while(error > m_tolerance) { @@ -893,7 +883,6 @@ bool Electromechanical::SolveSynchronousMachines() return false; } } - m_numIt = iterations; // Solve controllers. int ctrlRatio = static_cast<int>(1 / m_ctrlTimeStepMultiplier); @@ -901,13 +890,26 @@ bool Electromechanical::SolveSynchronousMachines() SyncGenerator* syncGenerator = *it; auto data = syncGenerator->GetElectricalData(); if(data.useAVR && data.avrSolver) { - for(int i = 0; i < ctrlRatio; ++i) data.avrSolver->SolveNextStep(std::abs(data.terminalVoltage)); - data.fieldVoltage = data.initialFieldVoltage + data.avrSolver->GetLastSolution(); + data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage)); + data.avrSolver->SetDeltaActivePower(data.electricalPower.real() - data.avrSolver->GetActivePower()); + data.avrSolver->SetActivePower(data.electricalPower.real()); + data.avrSolver->SetReactivePower(data.electricalPower.imag()); + data.avrSolver->SetDeltaVelocity(data.speed - data.avrSolver->GetVelocity()); + data.avrSolver->SetVelocity(data.speed); + + for(int i = 0; i < ctrlRatio; ++i) data.avrSolver->SolveNextStep(); + + data.fieldVoltage = data.initialFieldVoltage + data.avrSolver->GetFieldVoltage(); } if(data.useSpeedGovernor && data.speedGovSolver) { - for(int i = 0; i < ctrlRatio; ++i) data.speedGovSolver->SolveNextStep(data.speed); - data.pm = data.speedGovSolver->GetLastSolution(); + data.speedGovSolver->SetVelocity(data.speed); + data.speedGovSolver->SetActivePower(data.electricalPower.real()); + data.speedGovSolver->SetReactivePower(data.electricalPower.imag()); + + for(int i = 0; i < ctrlRatio; ++i) data.speedGovSolver->SolveNextStep(); + + data.pm = data.speedGovSolver->GetMechanicalPower(); } syncGenerator->SetElectricalData(data); } @@ -938,11 +940,6 @@ void Electromechanical::SaveData() bus->SetElectricalData(data); } } - - m_wErrorVector.push_back(m_wError); - m_numItVector.push_back(m_numIt); - m_sdCVector.push_back(m_sdC); - m_sqCVector.push_back(m_sqC); } void Electromechanical::SetSyncMachinesModel() @@ -1012,8 +1009,6 @@ double Electromechanical::CalculateSyncMachineIntVariables(SyncGenerator* syncGe double w = data.icSpeed.c + data.icSpeed.m * (data.pm - pe); error = std::max(error, std::abs(data.speed - w) / m_refSpeed); - m_wError += std::abs(data.speed - w) / m_refSpeed; - double delta = data.icDelta.c + data.icDelta.m * w; error = std::max(error, std::abs(data.delta - delta)); |