summaryrefslogtreecommitdiffstats
path: root/Project/Electromechanical.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/Electromechanical.cpp')
-rw-r--r--Project/Electromechanical.cpp79
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));