18#include "../../forms/SyncMachineForm.h"
20#include "../controlElement/ControlElementContainer.h"
25 m_elementType = TYPE_SYNC_MOTOR;
28SyncMotor::SyncMotor(wxString name) :
Machines()
30 m_elementType = TYPE_SYNC_MOTOR;
31 m_electricalData.name = name;
34SyncMotor::~SyncMotor()
36 if (m_electricalData.avr)
delete m_electricalData.avr;
37 if (m_electricalData.speedGov)
delete m_electricalData.speedGov;
38 if (m_electricalData.avrSolver)
delete m_electricalData.avrSolver;
39 if (m_electricalData.speedGovSolver)
delete m_electricalData.speedGovSolver;
43void SyncMotor::DrawDCSymbol(wxGraphicsContext* gc)
const
45 DrawDCArc(m_position, 12, 30, 330, 10, gc);
48void SyncMotor::DrawDCSymbol(wxDC& dc)
const
50 DrawDCArc(m_position, 12, 30, 330, dc);
57 wxMenu* textMenu =
new wxMenu();
59 textMenu->Append(ID_TXT_NAME, _(
"Name"));
60 textMenu->Append(ID_TXT_ACTIVE_POWER, _(
"Active power"));
61 textMenu->Append(ID_TXT_REACTIVE_POWER, _(
"Reactive power"));
62 textMenu->SetClientData(menu.GetClientData());
63 menu.AppendSubMenu(textMenu, _(
"Add text"));
73 syncMotorForm.SetTitle(_(
"Synchronous Condenser"));
74 syncMotorForm.CenterOnParent();
75 if (syncMotorForm.ShowModal() == wxID_OK) {
84 double machineBasePower = 1.0;
85 if (data.useMachineBase) { machineBasePower = GetValueFromUnit(data.nominalPower, data.nominalPowerUnit); }
88 double activePower = GetValueFromUnit(data.activePower, data.activePowerUnit);
89 if (!m_online) activePower = 0.0;
91 if (data.useMachineBase) data.activePower = (activePower * machineBasePower) / systemPowerBase;
94 data.activePower = activePower / systemPowerBase;
99 double reactivePower = GetValueFromUnit(data.reactivePower, data.reactivePowerUnit);
100 if (!m_online) reactivePower = 0.0;
102 if (data.useMachineBase) data.reactivePower = (reactivePower * machineBasePower) / systemPowerBase;
105 data.reactivePower = reactivePower / systemPowerBase;
110 double maxReactive = GetValueFromUnit(data.maxReactive, data.maxReactiveUnit);
112 if (data.useMachineBase) data.maxReactive = (maxReactive * machineBasePower) / systemPowerBase;
115 data.maxReactive = maxReactive / systemPowerBase;
120 double minReactive = GetValueFromUnit(data.minReactive, data.minReactiveUnit);
122 if (data.useMachineBase) data.minReactive = (minReactive * machineBasePower) / systemPowerBase;
125 data.minReactive = minReactive / systemPowerBase;
129 double baseVoltage = GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
130 double systemBaseImpedance = (baseVoltage * baseVoltage) / systemPowerBase;
131 double machineBaseImpedance = (baseVoltage * baseVoltage) / machineBasePower;
134 if (data.useMachineBase) {
135 data.positiveResistance = (data.positiveResistance * machineBaseImpedance) / systemBaseImpedance;
136 data.positiveReactance = (data.positiveReactance * machineBaseImpedance) / systemBaseImpedance;
137 data.negativeResistance = (data.negativeResistance * machineBaseImpedance) / systemBaseImpedance;
138 data.negativeReactance = (data.negativeReactance * machineBaseImpedance) / systemBaseImpedance;
139 data.zeroResistance = (data.zeroResistance * machineBaseImpedance) / systemBaseImpedance;
140 data.zeroReactance = (data.zeroReactance * machineBaseImpedance) / systemBaseImpedance;
141 data.groundResistance = (data.groundResistance * machineBaseImpedance) / systemBaseImpedance;
142 data.groundReactance = (data.groundReactance * machineBaseImpedance) / systemBaseImpedance;
146 data.faultCurrent[0] = std::complex<double>(0, 0);
147 data.faultCurrent[1] = std::complex<double>(0, 0);
148 data.faultCurrent[2] = std::complex<double>(0, 0);
156 if (nominalVoltage.size() > 0) {
157 m_electricalData.nominalVoltage = nominalVoltage[0];
158 m_electricalData.nominalVoltageUnit = nominalVoltageUnit[0];
166 auto data = copy->GetElectricalData();
167 data.avrSolver =
nullptr;
168 data.speedGovSolver =
nullptr;
170 if (m_electricalData.avr) {
171 std::vector<std::shared_ptr<ConnectionLine>> cLineList;
172 std::vector<std::shared_ptr<ControlElement>> elementList;
174 m_electricalData.avr->GetContainerCopy(elementList, cLineList);
177 avrCopy->FillContainer(elementList, cLineList);
185 if (m_electricalData.speedGov) {
186 std::vector<std::shared_ptr<ConnectionLine>> cLineList;
187 std::vector<std::shared_ptr<ControlElement>> elementList;
189 m_electricalData.speedGov->GetContainerCopy(elementList, cLineList);
192 speedGovCopy->FillContainer(elementList, cLineList);
194 data.speedGov = speedGovCopy;
197 data.speedGov =
nullptr;
200 copy->SetElectricalData(data);
207 wxString tipText = m_electricalData.name;
209 double activePower = m_electricalData.activePower;
210 if (!m_online) activePower = 0.0;
211 tipText += _(
"\nP = ") + wxString::FromDouble(activePower, 5);
212 switch (m_electricalData.activePowerUnit) {
214 tipText += _(
" p.u.");
228 double reactivePower = m_electricalData.reactivePower;
229 if (!m_online) reactivePower = 0.0;
230 tipText += _(
"\nQ = ") + wxString::FromDouble(reactivePower, 5);
231 switch (m_electricalData.reactivePowerUnit) {
233 tipText += _(
" p.u.");
236 tipText += _(
" var");
239 tipText += _(
" kvar");
242 tipText += _(
" Mvar");
251rapidxml::xml_node<>* SyncMotor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
253 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"SyncMotor");
254 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
256 SaveCADProperties(doc, elementNode);
258 auto electricalProp = XMLParser::AppendNode(doc, elementNode,
"ElectricalProperties");
259 auto isOnline = XMLParser::AppendNode(doc, electricalProp,
"IsOnline");
260 XMLParser::SetNodeValue(doc, isOnline, m_online);
261 auto name = XMLParser::AppendNode(doc, electricalProp,
"Name");
262 XMLParser::SetNodeValue(doc, name, m_electricalData.name);
263 auto nominalPower = XMLParser::AppendNode(doc, electricalProp,
"NominalPower");
264 XMLParser::SetNodeValue(doc, nominalPower, m_electricalData.nominalPower);
265 XMLParser::SetNodeAttribute(doc, nominalPower,
"UnitID",
static_cast<int>(m_electricalData.nominalPowerUnit));
266 auto activePower = XMLParser::AppendNode(doc, electricalProp,
"ActivePower");
267 XMLParser::SetNodeValue(doc, activePower, m_electricalData.activePower);
268 XMLParser::SetNodeAttribute(doc, activePower,
"UnitID",
static_cast<int>(m_electricalData.activePowerUnit));
269 auto reactivePower = XMLParser::AppendNode(doc, electricalProp,
"ReactivePower");
270 XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
271 XMLParser::SetNodeAttribute(doc, reactivePower,
"UnitID",
static_cast<int>(m_electricalData.reactivePowerUnit));
272 auto haveMaxReactive = XMLParser::AppendNode(doc, electricalProp,
"HaveMaxReactive");
273 XMLParser::SetNodeValue(doc, haveMaxReactive, m_electricalData.haveMaxReactive);
274 auto maxReactive = XMLParser::AppendNode(doc, electricalProp,
"MaxReactive");
275 XMLParser::SetNodeValue(doc, maxReactive, m_electricalData.maxReactive);
276 XMLParser::SetNodeAttribute(doc, maxReactive,
"UnitID",
static_cast<int>(m_electricalData.maxReactiveUnit));
277 auto haveMinReactive = XMLParser::AppendNode(doc, electricalProp,
"HaveMinReactive");
278 XMLParser::SetNodeValue(doc, haveMinReactive, m_electricalData.haveMinReactive);
279 auto minReactive = XMLParser::AppendNode(doc, electricalProp,
"MinReactive");
280 XMLParser::SetNodeValue(doc, minReactive, m_electricalData.minReactive);
281 XMLParser::SetNodeAttribute(doc, minReactive,
"UnitID",
static_cast<int>(m_electricalData.minReactiveUnit));
282 auto useMachineBase = XMLParser::AppendNode(doc, electricalProp,
"UseMachineBase");
283 XMLParser::SetNodeValue(doc, useMachineBase, m_electricalData.useMachineBase);
285 auto fault = XMLParser::AppendNode(doc, electricalProp,
"Fault");
286 auto positiveResistance = XMLParser::AppendNode(doc, fault,
"PositiveResistance");
287 XMLParser::SetNodeValue(doc, positiveResistance, m_electricalData.positiveResistance);
288 auto positiveReactance = XMLParser::AppendNode(doc, fault,
"PositiveReactance");
289 XMLParser::SetNodeValue(doc, positiveReactance, m_electricalData.positiveReactance);
290 auto negativeResistance = XMLParser::AppendNode(doc, fault,
"NegativeResistance");
291 XMLParser::SetNodeValue(doc, negativeResistance, m_electricalData.negativeResistance);
292 auto negativeReactance = XMLParser::AppendNode(doc, fault,
"NegativeReactance");
293 XMLParser::SetNodeValue(doc, negativeReactance, m_electricalData.negativeReactance);
294 auto zeroResistance = XMLParser::AppendNode(doc, fault,
"ZeroResistance");
295 XMLParser::SetNodeValue(doc, zeroResistance, m_electricalData.zeroResistance);
296 auto zeroReactance = XMLParser::AppendNode(doc, fault,
"ZeroReactance");
297 XMLParser::SetNodeValue(doc, zeroReactance, m_electricalData.zeroReactance);
298 auto groundResistance = XMLParser::AppendNode(doc, fault,
"GroundResistance");
299 XMLParser::SetNodeValue(doc, groundResistance, m_electricalData.groundResistance);
300 auto groundReactance = XMLParser::AppendNode(doc, fault,
"GroundReactance");
301 XMLParser::SetNodeValue(doc, groundReactance, m_electricalData.groundReactance);
302 auto groundNeutral = XMLParser::AppendNode(doc, fault,
"GroundNeutral");
303 XMLParser::SetNodeValue(doc, groundNeutral, m_electricalData.groundNeutral);
308bool SyncMotor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
310 if (!OpenCADProperties(elementNode, parentList))
return false;
312 auto electricalProp = elementNode->first_node(
"ElectricalProperties");
313 if (!electricalProp)
return false;
315 SetOnline(XMLParser::GetNodeValueInt(electricalProp,
"IsOnline"));
316 m_electricalData.name = electricalProp->first_node(
"Name")->value();
317 m_electricalData.nominalPower = XMLParser::GetNodeValueDouble(electricalProp,
"NominalPower");
318 m_electricalData.nominalPowerUnit =
319 static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp,
"NominalPower",
"UnitID"));
320 m_electricalData.activePower = XMLParser::GetNodeValueDouble(electricalProp,
"ActivePower");
321 m_electricalData.activePowerUnit =
322 static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp,
"ActivePower",
"UnitID"));
323 m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp,
"ReactivePower");
324 m_electricalData.reactivePowerUnit =
325 static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp,
"ReactivePower",
"UnitID"));
326 m_electricalData.haveMaxReactive = XMLParser::GetNodeValueInt(electricalProp,
"HaveMaxReactive");
327 m_electricalData.maxReactive = XMLParser::GetNodeValueDouble(electricalProp,
"MaxReactive");
328 m_electricalData.maxReactiveUnit =
329 static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp,
"MaxReactive",
"UnitID"));
330 m_electricalData.haveMinReactive = XMLParser::GetNodeValueInt(electricalProp,
"HaveMinReactive");
331 m_electricalData.minReactive = XMLParser::GetNodeValueDouble(electricalProp,
"MinReactive");
332 m_electricalData.minReactiveUnit =
333 static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp,
"MinReactive",
"UnitID"));
334 m_electricalData.useMachineBase = XMLParser::GetNodeValueInt(electricalProp,
"UseMachineBase");
336 auto fault = electricalProp->first_node(
"Fault");
337 if (!fault)
return false;
338 m_electricalData.positiveResistance = XMLParser::GetNodeValueDouble(fault,
"PositiveResistance");
339 m_electricalData.positiveReactance = XMLParser::GetNodeValueDouble(fault,
"PositiveReactance");
340 m_electricalData.negativeResistance = XMLParser::GetNodeValueDouble(fault,
"NegativeResistance");
341 m_electricalData.negativeReactance = XMLParser::GetNodeValueDouble(fault,
"NegativeReactance");
342 m_electricalData.zeroResistance = XMLParser::GetNodeValueDouble(fault,
"ZeroResistance");
343 m_electricalData.zeroReactance = XMLParser::GetNodeValueDouble(fault,
"ZeroReactance");
344 m_electricalData.groundResistance = XMLParser::GetNodeValueDouble(fault,
"GroundResistance");
345 m_electricalData.groundReactance = XMLParser::GetNodeValueDouble(fault,
"GroundReactance");
346 m_electricalData.groundNeutral = XMLParser::GetNodeValueInt(fault,
"GroundNeutral");
ElectricalUnit
Electrical units.
Class that can contain all control elements. Can identify (using RTTI) the elements from a generic li...
Base class of all elements of the program. This class is responsible for manage graphical and his dat...
virtual void GeneralMenuItens(wxMenu &menu)
Insert general itens to context menu.
bool SetOnline(bool online=true)
Set if the element is online or offline.
Abstract class for rotary machines power elements.
Synchronous motor (synchronous compensator) power element.
virtual Element * GetCopy()
Get a the element copy.
virtual void SetNominalVoltage(std::vector< double > nominalVoltage, std::vector< ElectricalUnit > nominalVoltageUnit)
Set nominal voltage of the element.
virtual wxString GetTipText() const
Get the tip text.
virtual bool GetContextMenu(wxMenu &menu)
Get the element contex menu.
virtual bool ShowForm(wxWindow *parent, Element *element, wxWindow *workspace=nullptr)
Show element data form.