summaryrefslogtreecommitdiffstats
path: root/Project/Electromechanical.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/Electromechanical.cpp')
-rw-r--r--Project/Electromechanical.cpp105
1 files changed, 65 insertions, 40 deletions
diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp
index 8d683c4..9830de9 100644
--- a/Project/Electromechanical.cpp
+++ b/Project/Electromechanical.cpp
@@ -394,15 +394,17 @@ std::complex<double> Electromechanical::GetSyncMachineAdmittance(SyncGenerator*
double xq = 0.0;
double ra = data.armResistance * k;
- switch(GetMachineModel(generator)) {
- case SM_MODEL_1:
- case SM_MODEL_2:
- case SM_MODEL_3: {
+ switch(data.model) {
+ case Machines::SM_MODEL_1: {
+ xq = data.transXd * k;
+ } break;
+ case Machines::SM_MODEL_2:
+ case Machines::SM_MODEL_3: {
xd = data.transXd * k;
xq = data.transXq * k;
} break;
- case SM_MODEL_4:
- case SM_MODEL_5: {
+ case Machines::SM_MODEL_4:
+ case Machines::SM_MODEL_5: {
xd = data.subXd * k;
xq = data.subXq * k;
} break;
@@ -432,6 +434,8 @@ bool Electromechanical::InitializeDynamicElements()
k = m_powerSystemBase / oldBase;
}
data.terminalVoltage = static_cast<Bus*>(syncGenerator->GetParentList()[0])->GetElectricalData().voltage;
+
+ data.model = GetMachineModel(syncGenerator);
std::complex<double> conjS(dataPU.activePower, -dataPU.reactivePower);
std::complex<double> conjV = std::conj(data.terminalVoltage);
@@ -440,6 +444,8 @@ bool Electromechanical::InitializeDynamicElements()
double xd = data.syncXd * k;
double xq = data.syncXq * k;
double ra = data.armResistance * k;
+
+ if(data.model == Machines::SM_MODEL_1) xq = data.transXd * k;
// Initialize state variables
std::complex<double> eq0 = data.terminalVoltage + std::complex<double>(ra, xq) * ia;
@@ -459,14 +465,17 @@ bool Electromechanical::InitializeDynamicElements()
data.pe = data.pm;
data.electricalPower = std::complex<double>(dataPU.activePower, dataPU.reactivePower);
- switch(GetMachineModel(syncGenerator)) {
- case SM_MODEL_1: {
- data.tranEq = 0.0;
+ switch(data.model) {
+ case Machines::SM_MODEL_1: {
+ double tranXd = data.transXd * k;
+
+ data.tranEq = data.initialFieldVoltage - tranXd * id0;
+ wxMessageBox(wxString::Format("%.5f", data.tranEq));
data.tranEd = 0.0;
data.subEq = 0.0;
data.subEd = 0.0;
} break;
- case SM_MODEL_2: {
+ case Machines::SM_MODEL_2: {
double tranXd = data.transXd * k;
data.tranEq = data.initialFieldVoltage + (xd - tranXd) * id0;
@@ -474,7 +483,7 @@ bool Electromechanical::InitializeDynamicElements()
data.subEd = 0.0;
data.subEq = 0.0;
} break;
- case SM_MODEL_3: {
+ case Machines::SM_MODEL_3: {
double tranXd = data.transXd * k;
double tranXq = data.transXq * k;
@@ -484,7 +493,7 @@ bool Electromechanical::InitializeDynamicElements()
data.subEd = 0.0;
data.subEq = 0.0;
} break;
- case SM_MODEL_4: {
+ case Machines::SM_MODEL_4: {
double tranXd = data.transXd * k;
double subXd = data.subXd * k;
double subXq = data.subXq * k;
@@ -494,7 +503,7 @@ bool Electromechanical::InitializeDynamicElements()
data.subEq = data.tranEq + (tranXd - subXd) * id0;
data.subEd = -(xq - subXq) * iq0;
} break;
- case SM_MODEL_5: {
+ case Machines::SM_MODEL_5: {
double tranXd = data.transXd * k;
double tranXq = data.transXq * k;
double subXd = data.subXd * k;
@@ -570,16 +579,19 @@ void Electromechanical::CalculateMachinesCurrents()
std::complex<double> iInj = m_iBus[n];
double xdq = 0.0;
- switch(GetMachineModel(syncGenerator)) {
- case SM_MODEL_1:
- case SM_MODEL_2:
- case SM_MODEL_3: {
+ switch(data.model) {
+ case Machines::SM_MODEL_1: {
+ DQ0toABC(data.tranEd, data.tranEq, data.delta, e);
+ xq = data.transXd * k;
+ } break;
+ case Machines::SM_MODEL_2:
+ case Machines::SM_MODEL_3: {
DQ0toABC(data.tranEd, data.tranEq, data.delta, e);
xd = data.transXd * k;
xq = data.transXq * k;
} break;
- case SM_MODEL_4:
- case SM_MODEL_5: {
+ case Machines::SM_MODEL_4:
+ case Machines::SM_MODEL_5: {
DQ0toABC(data.subEd, data.subEq, data.delta, e);
xd = data.subXd * k;
xq = data.subXq * k;
@@ -633,24 +645,37 @@ void Electromechanical::CalculateIntegrationConstants(SyncGenerator* syncGenerat
data.icDelta.c = data.delta + data.icDelta.m * (data.speed - 2.0f * w0);
// Eq'
- data.icTranEq.m = m_timeStep / (2.0f * data.transTd0 + m_timeStep);
- data.icTranEq.c = (1.0f - 2.0 * data.icTranEq.m) * data.tranEq +
- data.icTranEq.m * (data.fieldVoltage + (data.syncXd * k - data.transXd * k) * id);
+ 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 * data.transTd0 + m_timeStep);
+ data.icTranEq.c = (1.0f - 2.0 * data.icTranEq.m) * data.tranEq +
+ data.icTranEq.m * (data.fieldVoltage + (data.syncXd * k - data.transXd * k) * id);
+ }
// Ed'
- data.icTranEd.m = m_timeStep / (2.0f * data.transTq0 + m_timeStep);
- data.icTranEd.c =
- (1.0f - 2.0f * data.icTranEd.m) * data.tranEd - data.icTranEd.m * (data.syncXq * k - data.transXq * k) * iq;
+ 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 * data.transTq0 + m_timeStep);
+ data.icTranEd.c =
+ (1.0f - 2.0f * data.icTranEd.m) * data.tranEd - data.icTranEd.m * (data.syncXq * k - data.transXq * k) * iq;
+ }
// Eq''
- data.icSubEq.m = m_timeStep / (2.0f * data.subTd0 + m_timeStep);
- data.icSubEq.c = (1.0f - 2.0f * data.icSubEq.m) * data.subEq +
- data.icSubEq.m * (data.tranEq + (data.transXd * k - data.subXd * k) * id);
-
+ if(data.model == Machines::SM_MODEL_4 || data.model == Machines::SM_MODEL_5) {
+ data.icSubEq.m = m_timeStep / (2.0f * data.subTd0 + m_timeStep);
+ data.icSubEq.c = (1.0f - 2.0f * data.icSubEq.m) * data.subEq +
+ data.icSubEq.m * (data.tranEq + (data.transXd * k - data.subXd * k) * id);
+ }
// Ed''
- data.icSubEd.m = m_timeStep / (2.0f * data.subTq0 + m_timeStep);
- data.icSubEd.c = (1.0f - 2.0f * data.icSubEd.m) * data.subEd +
- data.icSubEd.m * (data.tranEd - (data.transXq * k - data.subXq * k) * iq);
+ if(data.model == Machines::SM_MODEL_4) {
+ data.icSubEd.m = m_timeStep / (2.0f * data.subTq0 + m_timeStep);
+ data.icSubEd.c =
+ (1.0f - 2.0f * data.icSubEd.m) * data.subEd - data.icSubEd.m * (data.syncXq * k - data.subXq * k) * iq;
+ }
+ if(data.model == Machines::SM_MODEL_5) {
+ data.icSubEd.m = m_timeStep / (2.0f * data.subTq0 + m_timeStep);
+ data.icSubEd.c = (1.0f - 2.0f * data.icSubEd.m) * data.subEd +
+ data.icSubEd.m * (data.tranEd - (data.transXq * k - data.subXq * k) * iq);
+ }
syncGenerator->SetElectricalData(data);
}
@@ -719,11 +744,11 @@ bool Electromechanical::SolveSynchronousMachines()
double delta = data.icDelta.c + data.icDelta.m * w;
error = std::max(error, std::abs(data.delta - delta));
+ m_deltaError += std::abs(data.delta - delta);
+
data.speed = w;
data.delta = delta;
- m_deltaError += std::abs(data.delta - delta);
-
// Electric power.
double id, iq, vd, vq, pe;
ABCtoDQ0(data.terminalVoltage, data.delta, vd, vq);
@@ -741,13 +766,13 @@ bool Electromechanical::SolveSynchronousMachines()
data.pe = pe;
// Electrical differential equations
- switch(GetMachineModel(syncGenerator)) {
- case SM_MODEL_1: {
+ switch(data.model) {
+ case Machines::SM_MODEL_1: {
// There is no differential equations.
} break;
- case SM_MODEL_2: {
+ case Machines::SM_MODEL_2: {
} break;
- case SM_MODEL_3: {
+ case Machines::SM_MODEL_3: {
double tranEq = data.icTranEq.c +
data.icTranEq.m * (data.fieldVoltage + (data.syncXd * k - data.transXd * k) * id);
error = std::max(error, std::abs(data.tranEq - tranEq));
@@ -768,9 +793,9 @@ bool Electromechanical::SolveSynchronousMachines()
data.terminalVoltage = e;
}
} break;
- case SM_MODEL_4: {
+ case Machines::SM_MODEL_4: {
} break;
- case SM_MODEL_5: {
+ case Machines::SM_MODEL_5: {
} break;
}