diff options
-rw-r--r-- | Project/ControlEditor.cpp | 37 | ||||
-rw-r--r-- | Project/ControlEditor.h | 4 | ||||
-rw-r--r-- | Project/ControlElementSolver.cpp | 44 | ||||
-rw-r--r-- | Project/Electromechanical.cpp | 24 | ||||
-rw-r--r-- | Project/ElementPlotData.cpp | 2 | ||||
-rw-r--r-- | Project/GeneratorStabForm.cpp | 9 | ||||
-rw-r--r-- | Project/IOControl.cpp | 13 | ||||
-rw-r--r-- | Project/IOControlForm.cpp | 18 | ||||
-rw-r--r-- | Project/Project.mk | 2 |
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 |