From ae9530685962e8d4d88c871ec7f5f896dd0b4a93 Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Fri, 6 Oct 2017 22:23:09 -0300 Subject: Several new implementation, not working --- Project/Electromechanical.cpp | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'Project/Electromechanical.cpp') diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index 4b8a711..b925234 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -606,10 +606,16 @@ 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->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 +623,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; } @@ -901,12 +914,22 @@ 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.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage)); + data.avrSolver->SetActivePower(data.electricalPower.real()); + data.avrSolver->SetReactivePower(data.electricalPower.imag()); + + for(int i = 0; i < ctrlRatio; ++i) data.avrSolver->SolveNextStep(); + data.fieldVoltage = data.initialFieldVoltage + data.avrSolver->GetLastSolution(); } if(data.useSpeedGovernor && data.speedGovSolver) { - for(int i = 0; i < ctrlRatio; ++i) data.speedGovSolver->SolveNextStep(data.speed); + 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->GetLastSolution(); } syncGenerator->SetElectricalData(data); -- cgit From 2552edfb5608ae15600aac38622354fe46701002 Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Sat, 7 Oct 2017 17:56:03 -0300 Subject: MIMO fully implemented Electromechanical adjusted Some control editor bugfixes --- Project/Electromechanical.cpp | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) (limited to 'Project/Electromechanical.cpp') diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index b925234..909642b 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(ra, xqs) * ia; - delta = std::arg(eq0);*/ } double ef0 = vq0 + ra * iq0 - xds * id0; @@ -546,9 +541,6 @@ bool Electromechanical::InitializeDynamicElements() 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; @@ -612,6 +604,8 @@ bool Electromechanical::InitializeDynamicElements() 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 + wxT("\".\n") + @@ -699,7 +693,6 @@ bool Electromechanical::CalculateMachinesCurrents() xdqs = 0.5 * (xds + xqs); std::complex y0 = std::complex(ra, -xdq) / std::complex(ra * ra + xd * xq, 0.0); - // std::complex iUnadjusted = y0 * e; std::complex iUnadjusted = y0 * v; // [Ref] Arrillaga, J.; Arnold, C. P.. "Computer Modelling of Electrical Power Systems". Pg. 225-226 @@ -778,8 +771,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); } @@ -787,7 +778,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; } @@ -795,22 +785,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); } @@ -917,10 +902,11 @@ bool Electromechanical::SolveSynchronousMachines() data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage)); data.avrSolver->SetActivePower(data.electricalPower.real()); data.avrSolver->SetReactivePower(data.electricalPower.imag()); + data.avrSolver->SetVelocity(data.speed); for(int i = 0; i < ctrlRatio; ++i) data.avrSolver->SolveNextStep(); - data.fieldVoltage = data.initialFieldVoltage + data.avrSolver->GetLastSolution(); + data.fieldVoltage = data.initialFieldVoltage + data.avrSolver->GetFieldVoltage(); } if(data.useSpeedGovernor && data.speedGovSolver) { @@ -930,7 +916,7 @@ bool Electromechanical::SolveSynchronousMachines() for(int i = 0; i < ctrlRatio; ++i) data.speedGovSolver->SolveNextStep(); - data.pm = data.speedGovSolver->GetLastSolution(); + data.pm = data.speedGovSolver->GetMechanicalPower(); } syncGenerator->SetElectricalData(data); } -- cgit From aa2378020ee0bbfd041681cfdbe62a8d028687f3 Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Sun, 8 Oct 2017 22:49:52 -0300 Subject: Velocity variaton input implemented For PSS control on AVR --- Project/Electromechanical.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Project/Electromechanical.cpp') diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index 909642b..dfd95d9 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -902,6 +902,7 @@ bool Electromechanical::SolveSynchronousMachines() data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage)); 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(); -- cgit From eea796f53f5d9dc1444a620713b3326f04b73339 Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Mon, 9 Oct 2017 22:17:10 -0300 Subject: Divider control element implemented Abstract class math operations implemented Divider need to be redesigned Expor/import divider functions implemented but supressed --- Project/Electromechanical.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'Project/Electromechanical.cpp') diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index dfd95d9..3210842 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -900,6 +900,7 @@ bool Electromechanical::SolveSynchronousMachines() auto data = syncGenerator->GetElectricalData(); if(data.useAVR && data.avrSolver) { 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()); -- cgit From 7fb65c6ec6148a75830ad25b7f76500c17db0f3b Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Wed, 11 Oct 2017 19:25:34 -0300 Subject: Divider save bug fixed Control icons updated Version to download updated --- Project/Electromechanical.cpp | 16 ---------------- 1 file changed, 16 deletions(-) (limited to 'Project/Electromechanical.cpp') diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index 3210842..b1d0e2f 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -536,9 +536,6 @@ bool Electromechanical::InitializeDynamicElements() data.oldSd = sd; data.oldSq = sq; - m_sdC = sd; - m_sqC = sq; - switch(data.model) { case Machines::SM_MODEL_1: { data.tranEq = std::abs(eq0); @@ -834,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) { @@ -891,7 +883,6 @@ bool Electromechanical::SolveSynchronousMachines() return false; } } - m_numIt = iterations; // Solve controllers. int ctrlRatio = static_cast(1 / m_ctrlTimeStepMultiplier); @@ -949,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() @@ -1023,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)); -- cgit