Ticket #6240: DynamicOverconstrainedConnectors2.mo

File DynamicOverconstrainedConnectors2.mo, 6.8 KB (added by Francesco Casella, 4 years ago)
Line 
1package DynamicOverconstrainedConnectors2
2 import SI = Modelica.SIunits;
3 import CM = Modelica.ComplexMath;
4 constant SI.Frequency f_n = 50 "Nominal grid frequency";
5 constant SI.PerUnit pi = Modelica.Constants.pi;
6 final constant SI.AngularVelocity omega_n = 2*pi*f_n;
7
8 type ReferenceAngularSpeed "Overconstrained type for per-unit reference angular speed"
9 extends SI.PerUnit;
10 function equalityConstraint
11 input ReferenceAngularSpeed omega1;
12 input ReferenceAngularSpeed omega2;
13 output SI.PerUnit residue[0] "No constraints";
14 end equalityConstraint;
15 function reconnectable
16 input ReferenceFrequency f1;
17 input ReferenceFrequency f2;
18 output Boolean canReconnect;
19 protected
20 constant Real eps = 1e-6;
21 algorithm
22 canReconnect := abs(f1 - f2) < eps;
23 end reconnectable;
24 end ReferenceAngularSpeed;
25
26 connector ACPort "Port for per unit 3-phase AC systems"
27 SI.ComplexPerUnit v "Per unit voltage phasor referred to phase";
28 flow SI.ComplexPerUnit i "Per unit current phasor referred to phase";
29 ReferenceAngularSpeed omegaRef "Reference per-unit angular speed";
30 end ACPort;
31
32 model Load "AC load model"
33 ACPort port;
34 SI.PerUnit P = 0 "Active per unit power";
35 Real Q = 0 "Reactive per unit power";
36 equation
37 port.v*CM.conj(port.i) = Complex(P,Q);
38 end Load;
39
40 model TransmissionLine "Purely inductive transmission line model"
41 parameter SI.PerUnit B = -5.0 "Line series per unit susceptance";
42 discrete SI.PerUnit B_act "Actual value of per unit susceptance including breaker status";
43 Boolean closed "State of line breaker";
44 Boolean open = false "Command to open the line breaker";
45 Boolean close = false "Command to close the line breaker";
46 ACPort port_a;
47 ACPort port_b;
48 initial equation
49 closed = true;
50 B_act = B;
51 equation
52 port_a.i + port_b.i = Complex(0);
53 port_a.i = Complex(0,B_act)*(port_a.v - port_b.v);
54 when open then
55 closed = false;
56 B_act = 0;
57 elsewhen close then
58 closed = true;
59 B_act = B;
60 end when;
61 port_a.omegaRef = port_b.omegaRef;
62 Connections.branch(port_a.omegaRef, port_b.omegaRef);
63 end TransmissionLine;
64
65 model TransmissionLineVariableBranch "Purely inductive transmission line model with time-varying connection branch"
66 parameter SI.PerUnit B = -5.0 "Line series per unit susceptance";
67 discrete SI.PerUnit B_act "Actual value of per unit susceptance including breaker status";
68 Boolean closed "State of line breaker";
69 Boolean open = false "Command to open the line breaker";
70 Boolean close = false "Command to close the line breaker";
71 ACPort port_a;
72 ACPort port_b;
73 initial equation
74 closed = true;
75 B_act = B;
76 equation
77 port_a.i + port_b.i = Complex(0);
78 port_a.i = Complex(0,B_act)*(port_a.v - port_b.v);
79 when open then
80 closed = false;
81 B_act = 0;
82 elsewhen close then
83 closed = true;
84 B_act = B;
85 end when;
86 // This if-equation is not valid according to Modelica 3.5
87 // Section 8.3.4 but it would according to this extension proposal
88 if closed then
89 port_a.omegaRef = port_b.omegaRef;
90 Connections.branch(port_a.omegaRef, port_b.omegaRef);
91 end if;
92 end TransmissionLineVariableBranch;
93
94 model Generator "Idealized synchronous generator with ideal voltage control and basic primary frequency control"
95 parameter SI.PerUnit V = 1 "Fixed rotor per unit voltage magnitude";
96 parameter SI.Time Ta = 10 "Acceleration time of turbogenerator Ta = J*omega^2/Pnom";
97 parameter SI.PerUnit droop = 0.05 "Droop coefficient of primary frequency control";
98 ACPort port;
99 SI.PerUnit Ps = 1 "Active power output set point";
100 SI.PerUnit Pc "Primary frequency control power in per unit";
101 SI.PerUnit Pe "Electrical power output";
102 SI.Angle theta(start = 0, fixed = true) "Machine angle relative to port.theta";
103 SI.PerUnit omega(start = 1, fixed = true) "Per unit angular speed";
104 equation
105 der(theta) = (omega - port.omegaRef)*omega_n;
106 Ta*omega*der(omega) = Ps + Pc - Pe;
107 port.v = CM.fromPolar(V, theta);
108 Pe = -CM.real(port.v*CM.conj(port.i));
109 Pc = -(omega-1)/droop;
110 Connections.potentialRoot(port.omegaRef);
111 if Connections.isRoot(port.omegaRef) then
112 port.omegaRef = omega;
113 end if;
114 end Generator;
115
116 model System1 "Two generators, one line, fixed branches"
117 Generator G1;
118 Generator G2;
119 Load L1(P = 1);
120 Load L2(P = if time < 1 then 1 else 0.8);
121 TransmissionLine T;
122 equation
123 connect(G1.port, L1.port);
124 connect(G2.port, L2.port);
125 connect(G1.port, T.port_a);
126 connect(G2.port, T.port_b);
127 annotation(experiment(StopTime = 50, Interval = 0.02));
128 end System1;
129
130 model System2 "Two generators, two-parallel and one series lines, fixed branches"
131 Generator G1;
132 Generator G2;
133 Load L1(P = 1);
134 Load L2(P = if time < 1 then 1 else 0.8);
135 TransmissionLine T1a(B = -5.0);
136 TransmissionLine T1b(B = -5.0);
137 TransmissionLine T2(B = -10.0);
138 equation
139 connect(G1.port, L1.port);
140 connect(G2.port, L2.port);
141 connect(G1.port, T1a.port_a);
142 connect(G1.port, T1b.port_a);
143 connect(T1a.port_b, T2.port_a);
144 connect(T1b.port_b, T2.port_a);
145 connect(G2.port, T2.port_b);
146 annotation(experiment(StopTime = 50, Interval = 0.02));
147 end System2;
148
149 model System3 "Two generators, two-parallel and one series line with breaker, fixed branches"
150 Generator G1;
151 Generator G2;
152 Load L1(P = 1);
153 Load L2(P = if time < 1 then 1 else 0.8);
154 TransmissionLine T1a(B = -5.0);
155 TransmissionLine T1b(B = -5.0);
156 TransmissionLine T2(B = -10.0, open = if time < 10 then false else true);
157 equation
158 connect(G1.port, L1.port);
159 connect(G2.port, L2.port);
160 connect(G1.port, T1a.port_a);
161 connect(G1.port, T1b.port_a);
162 connect(T1a.port_b, T2.port_a);
163 connect(T1b.port_b, T2.port_a);
164 connect(G2.port, T2.port_b);
165 annotation(experiment(StopTime = 50, Interval = 0.02));
166 end System3;
167
168 model System4 "Two generators, two-parallel and one series line with breaker, fixed branches"
169 Generator G1;
170 Generator G2;
171 Load L1(P = 1);
172 Load L2(P = if time < 1 then 1 else 0.8);
173 TransmissionLine T1a(B = -5.0);
174 TransmissionLine T1b(B = -5.0);
175 TransmissionLineVariableBranch T2(B = -10.0, open = if time < 10 then false else true);
176 equation
177 connect(G1.port, L1.port);
178 connect(G2.port, L2.port);
179 connect(G1.port, T1a.port_a);
180 connect(G1.port, T1b.port_a);
181 connect(T1a.port_b, T2.port_a);
182 connect(T1b.port_b, T2.port_a);
183 connect(G2.port, T2.port_b);
184 annotation(experiment(StopTime = 50, Interval = 0.02));
185 end System4;
186 annotation(uses(Modelica(version="3.2.3")));
187end DynamicOverconstrainedConnectors2;