summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Project/ControlEditor.cpp37
-rw-r--r--Project/ControlEditor.h4
-rw-r--r--Project/ControlElementSolver.cpp44
-rw-r--r--Project/Electromechanical.cpp24
-rw-r--r--Project/ElementPlotData.cpp2
-rw-r--r--Project/GeneratorStabForm.cpp9
-rw-r--r--Project/IOControl.cpp13
-rw-r--r--Project/IOControlForm.cpp18
-rw-r--r--Project/Project.mk2
9 files changed, 83 insertions, 70 deletions
diff --git a/Project/ControlEditor.cpp b/Project/ControlEditor.cpp
index d127a63..3244bad 100644
--- a/Project/ControlEditor.cpp
+++ b/Project/ControlEditor.cpp
@@ -237,51 +237,50 @@ void ControlEditor::AddElement(ControlElementButtonID id)
switch(id) {
case ID_IO: {
m_mode = MODE_INSERT;
- IOControl* io = new IOControl(m_ioFlags, m_lastElementID);
+ IOControl* io = new IOControl(m_ioFlags, GetNextID());
m_elementList.push_back(io);
} break;
case ID_TF: {
m_mode = MODE_INSERT;
- TransferFunction* tf = new TransferFunction(m_lastElementID);
+ TransferFunction* tf = new TransferFunction(GetNextID());
m_elementList.push_back(tf);
} break;
case ID_SUM: {
m_mode = MODE_INSERT;
- Sum* sum = new Sum(m_lastElementID);
+ Sum* sum = new Sum(GetNextID());
m_elementList.push_back(sum);
} break;
case ID_CONST: {
m_mode = MODE_INSERT;
- Constant* constant = new Constant(m_lastElementID);
+ Constant* constant = new Constant(GetNextID());
m_elementList.push_back(constant);
} break;
case ID_LIMITER: {
m_mode = MODE_INSERT;
- Limiter* limiter = new Limiter(m_lastElementID);
+ Limiter* limiter = new Limiter(GetNextID());
m_elementList.push_back(limiter);
} break;
case ID_GAIN: {
m_mode = MODE_INSERT;
- Gain* gain = new Gain(m_lastElementID);
+ Gain* gain = new Gain(GetNextID());
m_elementList.push_back(gain);
} break;
case ID_MULT: {
m_mode = MODE_INSERT;
- Multiplier* mult = new Multiplier(m_lastElementID);
+ Multiplier* mult = new Multiplier(GetNextID());
m_elementList.push_back(mult);
} break;
case ID_EXP: {
m_mode = MODE_INSERT;
- Exponential* exp = new Exponential(m_lastElementID);
+ Exponential* exp = new Exponential(GetNextID());
m_elementList.push_back(exp);
} break;
case ID_RATELIM: {
m_mode = MODE_INSERT;
- RateLimiter* rateLim = new RateLimiter(m_lastElementID);
+ RateLimiter* rateLim = new RateLimiter(GetNextID());
m_elementList.push_back(rateLim);
} break;
}
- m_lastElementID++;
}
void ControlEditor::OnPaint(wxPaintEvent& event)
@@ -366,8 +365,7 @@ void ControlEditor::OnLeftClickDown(wxMouseEvent& event)
Node* node = *itN;
if(node->Contains(m_camera->ScreenToWorld(clickPoint))) {
m_mode = MODE_INSERT_LINE;
- ConnectionLine* line = new ConnectionLine(node, m_lastElementID);
- m_lastElementID++;
+ ConnectionLine* line = new ConnectionLine(node, GetNextID());
m_connectionList.push_back(line);
element->AddChild(line);
line->AddParent(element);
@@ -757,8 +755,6 @@ void ControlEditor::OnImportClick(wxCommandEvent& event)
wxOK | wxCENTRE | wxICON_ERROR);
msgDialog.ShowModal();
}
-
- SetLastElementID();
Redraw();
event.Skip();
}
@@ -881,16 +877,17 @@ void ControlEditor::ConsolidateTexts()
}
}
-void ControlEditor::SetLastElementID()
+int ControlEditor::GetNextID()
{
int id = 0;
for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) {
- int elementID = (*it)->GetID();
- if(id < elementID) id = elementID;
+ ControlElement* element = *it;
+ if(element->GetID() > id) id = element->GetID();
}
for(auto it = m_connectionList.begin(), itEnd = m_connectionList.end(); it != itEnd; ++it) {
- int elementID = (*it)->GetID();
- if(id < elementID) id = elementID;
+ ConnectionLine* line = *it;
+ if(line->GetID() > id) id = line->GetID();
}
- m_lastElementID = ++id;
+ id++;
+ return id;
}
diff --git a/Project/ControlEditor.h b/Project/ControlEditor.h
index dfa76ab..315efec 100644
--- a/Project/ControlEditor.h
+++ b/Project/ControlEditor.h
@@ -140,7 +140,7 @@ class ControlEditor : public ControlEditorBase
void BuildControlElementPanel();
void SetViewport();
void ConsolidateTexts();
- void SetLastElementID();
+ int GetNextID();
std::vector<ConnectionLine*>::iterator DeleteLineFromList(std::vector<ConnectionLine*>::iterator& it);
@@ -160,8 +160,6 @@ class ControlEditor : public ControlEditorBase
bool m_firstDraw = true;
int m_ioFlags;
- int m_lastElementID = 0;
-
int m_inputType = 0;
double m_startTime = 1.0;
double m_slope = 1.0;
diff --git a/Project/ControlElementSolver.cpp b/Project/ControlElementSolver.cpp
index 42fb2d3..ad2e79b 100644
--- a/Project/ControlElementSolver.cpp
+++ b/Project/ControlElementSolver.cpp
@@ -85,7 +85,7 @@ void ControlElementSolver::Initialize(wxWindow* parent, double timeStep, double
m_timeStep = timeStep;
m_integrationError = integrationError;
if(!fail) {
- if(!InitializeValues(false)) {
+ if(!InitializeValues(true)) {
fail = true;
m_failMessage = _("It was not possible to initialize the control system.");
}
@@ -178,7 +178,7 @@ void ControlElementSolver::SolveNextStep()
// Get first node connection
ConnectionLine* firstConn = static_cast<ConnectionLine*>(m_inputControl->GetChildList()[0]);
/*m_inputControl->SetSolved();
- firstConn->SetValue(input);
+ firstConn->SetValue(1);
firstConn->SetSolved();
FillAllConnectedChildren(firstConn);*/
@@ -202,7 +202,10 @@ void ControlElementSolver::SolveNextStep()
if(io->GetChildList().size() == 1) {
io->SetSolved();
ConnectionLine* child = static_cast<ConnectionLine*>(io->GetChildList()[0]);
+ if(m_inputControl == io) firstConn = child;
+ bool inputType = true;
switch(io->GetValue()) {
+ io->SetSolved();
case IOControl::IN_TERMINAL_VOLTAGE: {
child->SetValue(m_terminalVoltage);
} break;
@@ -224,11 +227,14 @@ void ControlElementSolver::SolveNextStep()
case IOControl::IN_INITIAL_VELOCITY: {
child->SetValue(m_initVelocity);
} break;
- default:
- break;
+ default: {
+ inputType = false;
+ } break;
+ }
+ if(inputType) {
+ child->SetSolved();
+ FillAllConnectedChildren(child);
}
- child->SetSolved();
- FillAllConnectedChildren(child);
}
}
@@ -262,12 +268,32 @@ void ControlElementSolver::SolveNextStep()
}
}
- // Set the control system step output.
- if(m_outputControl->GetChildList().size() == 1) {
+ // Set the control system output.
+ /*if(m_outputControl->GetChildList().size() == 1) {
ConnectionLine* cLine = static_cast<ConnectionLine*>(m_outputControl->GetChildList()[0]);
m_solutions.push_back(cLine->GetValue());
} else
- m_solutions.push_back(0.0);
+ m_solutions.push_back(0.0);*/
+ for(auto it = ioList.begin(), itEnd = ioList.end(); it != itEnd; ++it) {
+ IOControl* io = *it;
+ if(io->GetChildList().size() == 1) {
+ io->SetSolved();
+ ConnectionLine* child = static_cast<ConnectionLine*>(io->GetChildList()[0]);
+ switch(io->GetValue()) {
+ io->SetSolved();
+ case IOControl::OUT_MEC_POWER: {
+ m_mecPower = child->GetValue();
+ m_solutions.push_back(m_mecPower);
+ } break;
+ case IOControl::OUT_FIELD_VOLTAGE: {
+ m_fieldVoltage = child->GetValue();
+ m_solutions.push_back(m_fieldVoltage);
+ } break;
+ default:
+ break;
+ }
+ }
+ }
}
void ControlElementSolver::FillAllConnectedChildren(ConnectionLine* parent)
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<double>(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<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
@@ -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);
}
diff --git a/Project/ElementPlotData.cpp b/Project/ElementPlotData.cpp
index d08108b..577ae23 100644
--- a/Project/ElementPlotData.cpp
+++ b/Project/ElementPlotData.cpp
@@ -33,7 +33,7 @@ void ElementPlotData::AddData(std::vector<double> values, wxString name)
data->SetAxis(0);
data->SetColour(*wxBLACK);
data->SetPenType(wxPENSTYLE_SOLID);
- data->SetThick(2);
+ data->SetThick(1);
m_elementData.push_back(data);
}
diff --git a/Project/GeneratorStabForm.cpp b/Project/GeneratorStabForm.cpp
index 34f8027..82d85ab 100644
--- a/Project/GeneratorStabForm.cpp
+++ b/Project/GeneratorStabForm.cpp
@@ -69,7 +69,8 @@ void GeneratorStabForm::OnEditAVRButtonClick(wxCommandEvent& event)
}
ControlEditor* cEditor = new ControlEditor(
m_parent, IOControl::IN_TERMINAL_VOLTAGE | IOControl::IN_ACTIVE_POWER | IOControl::IN_REACTIVE_POWER |
- IOControl::IN_INITIAL_TERMINAL_VOLTAGE | IOControl::OUT_FIELD_VOLTAGE);
+ IOControl::IN_INITIAL_TERMINAL_VOLTAGE | IOControl::IN_VELOCITY | IOControl::IN_INITIAL_VELOCITY |
+ IOControl::OUT_FIELD_VOLTAGE);
cEditor->SetElementsList(data.avr->GetControlElementsList());
cEditor->SetConnectionsList(data.avr->GetConnectionLineList());
cEditor->SetControlContainer(data.avr);
@@ -88,9 +89,9 @@ void GeneratorStabForm::OnSpeedGovernorButtonClick(wxCommandEvent& event)
data.speedGov = new ControlElementContainer();
m_syncGenerator->SetElectricalData(data);
}
- ControlEditor* cEditor =
- new ControlEditor(m_parent, IOControl::IN_VELOCITY | IOControl::IN_ACTIVE_POWER | IOControl::IN_REACTIVE_POWER |
- IOControl::IN_INITIAL_VELOCITY | IOControl::OUT_MEC_POWER);
+ ControlEditor* cEditor = new ControlEditor(
+ m_parent, IOControl::IN_VELOCITY | IOControl::IN_ACTIVE_POWER | IOControl::IN_REACTIVE_POWER |
+ IOControl::IN_INITIAL_VELOCITY | IOControl::IN_INITIAL_MEC_POWER | IOControl::OUT_MEC_POWER);
cEditor->SetElementsList(data.speedGov->GetControlElementsList());
cEditor->SetConnectionsList(data.speedGov->GetConnectionLineList());
cEditor->SetControlContainer(data.speedGov);
diff --git a/Project/IOControl.cpp b/Project/IOControl.cpp
index da3ef03..2479f47 100644
--- a/Project/IOControl.cpp
+++ b/Project/IOControl.cpp
@@ -152,6 +152,7 @@ void IOControl::Rotate(bool clockwise)
wxString IOControl::GenerateText()
{
wxString omega = wxString::FromUTF8("\xCF\x89");
+ wxString subZero = wxString::FromUTF8("\xE2\x82\x92");
switch(m_value) {
case IN_TERMINAL_VOLTAGE: {
@@ -179,12 +180,16 @@ wxString IOControl::GenerateText()
return _("Pm");
} break;
case IN_INITIAL_TERMINAL_VOLTAGE: {
- m_ioNodeType = Node::NODE_IN;
- return _("Vt0");
+ m_ioNodeType = Node::NODE_OUT;
+ return _("Vt") + subZero;
} break;
case IN_INITIAL_MEC_POWER: {
- m_ioNodeType = Node::NODE_IN;
- return _("Pm0");
+ m_ioNodeType = Node::NODE_OUT;
+ return _("Pm") + subZero;
+ } break;
+ case IN_INITIAL_VELOCITY: {
+ m_ioNodeType = Node::NODE_OUT;
+ return omega + subZero;
} break;
}
return "";
diff --git a/Project/IOControlForm.cpp b/Project/IOControlForm.cpp
index 592c5be..bb049a1 100644
--- a/Project/IOControlForm.cpp
+++ b/Project/IOControlForm.cpp
@@ -60,22 +60,22 @@ IOControlForm::IOControlForm(wxWindow* parent, IOControl* ioControl) : IOControl
}
if(ioFlags & IOControl::IN_INITIAL_MEC_POWER) {
- m_choiceOutput->Append(_("Initial mechanical power"));
- m_outputFlags.push_back(IOControl::IN_INITIAL_MEC_POWER);
- if(m_ioControl->GetValue() == IOControl::IN_INITIAL_MEC_POWER) outChoiceNumber = (int)m_outputFlags.size() - 1;
+ m_choiceInput->Append(_("Initial mechanical power"));
+ m_inputFlags.push_back(IOControl::IN_INITIAL_MEC_POWER);
+ if(m_ioControl->GetValue() == IOControl::IN_INITIAL_MEC_POWER) inChoiceNumber = (int)m_inputFlags.size() - 1;
}
if(ioFlags & IOControl::IN_INITIAL_TERMINAL_VOLTAGE) {
- m_choiceOutput->Append(_("Initial terminal voltage"));
- m_outputFlags.push_back(IOControl::IN_INITIAL_TERMINAL_VOLTAGE);
+ m_choiceInput->Append(_("Initial terminal voltage"));
+ m_inputFlags.push_back(IOControl::IN_INITIAL_TERMINAL_VOLTAGE);
if(m_ioControl->GetValue() == IOControl::IN_INITIAL_TERMINAL_VOLTAGE)
- outChoiceNumber = (int)m_outputFlags.size() - 1;
+ inChoiceNumber = (int)m_inputFlags.size() - 1;
}
if(ioFlags & IOControl::IN_INITIAL_VELOCITY) {
- m_choiceOutput->Append(_("Initial velocity"));
- m_outputFlags.push_back(IOControl::IN_INITIAL_VELOCITY);
- if(m_ioControl->GetValue() == IOControl::IN_INITIAL_VELOCITY) outChoiceNumber = (int)m_outputFlags.size() - 1;
+ m_choiceInput->Append(_("Initial velocity"));
+ m_inputFlags.push_back(IOControl::IN_INITIAL_VELOCITY);
+ if(m_ioControl->GetValue() == IOControl::IN_INITIAL_VELOCITY) inChoiceNumber = (int)m_inputFlags.size() - 1;
}
if(inChoiceNumber != -1) {
diff --git a/Project/Project.mk b/Project/Project.mk
index 6bb12a0..d64dd8c 100644
--- a/Project/Project.mk
+++ b/Project/Project.mk
@@ -13,7 +13,7 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=NDSE-69
-Date :=06/10/2017
+Date :=07/10/2017
CodeLitePath :="C:/Program Files/CodeLite"
LinkerName :=C:/TDM-GCC-64/bin/g++.exe
SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC