summaryrefslogtreecommitdiffstats
path: root/Project/SyncMotor.h
blob: f6f21c4d0e750c165bcf712f28e20a78aab69959 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef SYNCMOTOR_H
#define SYNCMOTOR_H

#include "Machines.h"

class SyncMachineForm;

struct SyncMotorElectricalData {
    // General
    wxString name = "";
    double nominalPower = 100.0;
    ElectricalUnit nominalPowerUnit = UNIT_MVA;
    double nominalVoltage = 13.8;
    ElectricalUnit nominalVoltageUnit = UNIT_kV;
    double activePower = 100.0;
    ElectricalUnit activePowerUnit = UNIT_MW;
    double reactivePower = 0.0;
    ElectricalUnit reactivePowerUnit = UNIT_MVAr;
    bool haveMaxReactive = false;
    double maxReactive = 9999.0;
    ElectricalUnit maxReactiveUnit = UNIT_MVAr;
    bool haveMinReactive = false;
    double minReactive = -9999.0;
    ElectricalUnit minReactiveUnit = UNIT_MVAr;
    bool useMachineBase = true;

    // Fault
    double positiveResistance = 0.0;
    double positiveReactance = 1.0;
    double negativeResistance = 0.0;
    double negativeReactance = 1.0;
    double zeroResistance = 0.0;
    double zeroReactance = 1.0;
    double groundResistance = 0.0;
    double groundReactance = 0.0;
    bool groundNeutral = true;
    // p.u. fault data
    std::complex<double> faultCurrent[3] = {std::complex<double>(0.0, 0.0), std::complex<double>(0.0, 0.0),
                                            std::complex<double>(0.0, 0.0)};

    // Stability
    bool plotSyncMachine = false;
    double inertia = 1.0;
    double damping = 0.0;
    bool useAVR = false;
    bool useSpeedGovernor = false;

    double armResistance = 0.0;
    double potierReactance = 0.0;
    double satFactor = 0.0;

    double syncXd = 0.0;
    double syncXq = 0.0;
    double transXd = 1.0;
    double transXq = 0.0;
    double transTd0 = 0.0;
    double transTq0 = 0.0;
    double subXd = 0.0;
    double subXq = 0.0;
    double subTd0 = 0.0;
    double subTq0 = 0.0;

    // Machine state variables
    std::complex<double> terminalVoltage;
    std::vector<std::complex<double> > terminalVoltageVector;
    std::complex<double> electricalPower;
    std::vector<std::complex<double> > electricalPowerVector;
    double pm;
    std::vector<double> mechanicalPowerVector;
    double speed;
    std::vector<double> freqVector;
    double fieldVoltage;
    std::vector<double> fieldVoltageVector;
    double delta;
    std::vector<double> deltaVector;

    double initialFieldVoltage;

    // Internal machine variables
    double tranEq;
    double tranEd;
    double subEq;
    double subEd;
    double pe;

    // Variables to extrapolate
    double oldId;
    double oldIq;
    double oldPe;

    // Integration constants
    IntegrationConstant icSpeed;
    IntegrationConstant icDelta;
    IntegrationConstant icTranEq;
    IntegrationConstant icTranEd;
    IntegrationConstant icSubEq;
    IntegrationConstant icSubEd;

    // Control
    ControlElementContainer* avr = NULL;
    ControlElementContainer* speedGov = NULL;

    // Control solvers
    ControlElementSolver* avrSolver = NULL;
    ControlElementSolver* speedGovSolver = NULL;

    Machines::SyncMachineModel model = Machines::SM_MODEL_1;
};

class SyncMotor : public Machines
{
   public:
    SyncMotor();
    SyncMotor(wxString name);
    ~SyncMotor();

    virtual Element* GetCopy();
    virtual void DrawSymbol() const;
    virtual bool GetContextMenu(wxMenu& menu);
    virtual wxString GetTipText() const;
    virtual SyncMotorElectricalData GetElectricalData() { return m_electricalData; }
    virtual SyncMotorElectricalData GetPUElectricalData(double systemPowerBase);
    virtual void SetNominalVoltage(std::vector<double> nominalVoltage, std::vector<ElectricalUnit> nominalVoltageUnit);
    virtual void SetElectricalData(SyncMotorElectricalData electricalData) { m_electricalData = electricalData; }
    virtual bool ShowForm(wxWindow* parent, Element* element);

   protected:
    SyncMotorElectricalData m_electricalData;
};

#endif  // SYNCMOTOR_H