1
+ using Test
1
2
using ModelingToolkit, ModelingToolkitStandardLibrary, OrdinaryDiffEq
2
3
using ModelingToolkitStandardLibrary. Blocks
3
4
using OrdinaryDiffEq: ReturnCode. Success
@@ -12,9 +13,13 @@ an integrator with a constant input is often used together with the system under
12
13
=#
13
14
14
15
@testset " Constant" begin
15
- @named c = Constant (; k = 1 )
16
- @named int = Integrator (x = 1 )
17
- @named iosys = ODESystem (connect (c. output, int. input), t, systems = [int, c])
16
+ pars = @parameters begin
17
+ k = 1
18
+ x = 1
19
+ end
20
+ @named c = Constant (; k)
21
+ @named int = Integrator (; x)
22
+ @named iosys = ODESystem (connect (c. output, int. input), t, [], pars; systems = [int, c])
18
23
sys = structural_simplify (iosys)
19
24
prob = ODEProblem (sys, Pair[], (0.0 , 1.0 ))
20
25
sol = solve (prob, Rodas4 ())
167
172
end
168
173
169
174
@testset " PID" begin
175
+
176
+ @parameters Ti= 0.5 Td= 1 / 100
177
+ @named pid_controller = PID (; k = 3 , Ti, Td)
178
+
170
179
re_val = 2
171
- @named ref = Constant (; k = re_val)
172
- @named pid_controller = PID (k = 3 , Ti = 0.5 , Td = 1 / 100 )
180
+ @named ref = Constant (; k = re_val)
173
181
@named plant = Plant ()
174
182
@named fb = Feedback ()
175
183
@named model = ODESystem ([
178
186
connect (fb. output, pid_controller. err_input),
179
187
connect (pid_controller. ctr_output, plant. input),
180
188
],
181
- t,
182
- systems = [pid_controller, plant, ref, fb])
189
+ t, [], [Ti, Td]; systems = [pid_controller, plant, ref, fb])
183
190
sys = structural_simplify (model)
184
191
prob = ODEProblem (sys, Pair[], (0.0 , 100.0 ))
185
192
sol = solve (prob, Rodas4 ())
@@ -188,15 +195,14 @@ end
188
195
@test sol[plant. output. u][end ]≈ re_val atol= 1e-3 # zero control error after 100s
189
196
190
197
@testset " PI" begin
191
- @named pid_controller = PID (k = 3 , Ti = 0.5 , Td = false )
198
+ @named pid_controller = PID (" PI " ; k = 3 , Ti)
192
199
@named model = ODESystem ([
193
200
connect (ref. output, fb. input1),
194
201
connect (plant. output, fb. input2),
195
202
connect (fb. output, pid_controller. err_input),
196
203
connect (pid_controller. ctr_output, plant. input),
197
204
],
198
- t,
199
- systems = [pid_controller, plant, ref, fb])
205
+ t, [], [Ti]; systems = [pid_controller, plant, ref, fb])
200
206
sys = structural_simplify (model)
201
207
prob = ODEProblem (sys, Pair[], (0.0 , 100.0 ))
202
208
sol = solve (prob, Rodas4 ())
206
212
end
207
213
208
214
@testset " PD" begin
209
- @named pid_controller = PID (k = 10 , Ti = false , Td = 1 )
215
+ @named pid_controller = PID (" PD " ; k = 10 , Td = 1 )
210
216
@named model = ODESystem ([
211
217
connect (ref. output, fb. input1),
212
218
connect (plant. output, fb. input2),
284
290
@testset " LimPID" begin
285
291
re_val = 1
286
292
@named ref = Constant (; k = re_val)
287
- @named pid_controller = LimPID (k = 3 , Ti = 0.5 , Td = 1 / 100 , u_max = 1.5 , u_min = - 1.5 ,
293
+ @named pid_controller = LimPID (; k = 3 , Ti = 0.5 , Td = 1 / 100 , u_max = 1.5 , u_min = - 1.5 ,
288
294
Ni = 0.1 / 0.5 )
289
295
@named plant = Plant ()
290
296
@named model = ODESystem ([
305
311
@test all (- 1.5 .<= sol[pid_controller. ctr_output. u] .<= 1.5 ) # test limit
306
312
307
313
@testset " PI" begin
308
- @named pid_controller = LimPID (k = 3 , Ti = 0.5 , Td = false , u_max = 1.5 ,
314
+ @named pid_controller = LimPID (; k = 3 , Ti = 0.5 , Td = false , u_max = 1.5 ,
309
315
u_min = - 1.5 , Ni = 0.1 / 0.5 )
310
316
@named model = ODESystem ([
311
317
connect (ref. output, pid_controller. reference),
325
331
@test all (- 1.5 .<= sol[pid_controller. ctr_output. u] .<= 1.5 ) # test limit
326
332
end
327
333
@testset " PD" begin
328
- @named pid_controller = LimPID (k = 10 , Ti = false , Td = 1 , u_max = 1.5 ,
334
+ @named pid_controller = LimPID (; k = 10 , Ti = false , Td = 1 , u_max = 1.5 ,
329
335
u_min = - 1.5 )
330
336
@named model = ODESystem ([
331
337
connect (ref. output, pid_controller. reference),
346
352
end
347
353
@testset " set-point weights" begin
348
354
@testset " wp" begin
349
- @named pid_controller = LimPID (k = 3 , Ti = 0.5 , Td = 1 / 100 , u_max = 1.5 ,
355
+ @named pid_controller = LimPID (; k = 3 , Ti = 0.5 , Td = 1 / 100 , u_max = 1.5 ,
350
356
u_min = - 1.5 , Ni = 0.1 / 0.5 , wp = 0 , wd = 1 )
351
357
@named model = ODESystem ([
352
358
connect (ref. output, pid_controller. reference),
367
373
@test all (- 1.5 .<= sol[pid_controller. ctr_output. u] .<= 1.5 ) # test limit
368
374
end
369
375
@testset " wd" begin
370
- @named pid_controller = LimPID (k = 3 , Ti = 0.5 , Td = 1 / 100 , u_max = 1.5 ,
376
+ @named pid_controller = LimPID (; k = 3 , Ti = 0.5 , Td = 1 / 100 , u_max = 1.5 ,
371
377
u_min = - 1.5 , Ni = 0.1 / 0.5 , wp = 1 , wd = 0 )
372
378
@named model = ODESystem ([
373
379
connect (ref. output, pid_controller. reference),
389
395
end
390
396
end
391
397
@testset " PI without AWM" begin
392
- @named pid_controller = LimPID (k = 3 , Ti = 0.5 , Td = false , u_max = 1.5 ,
398
+ @named pid_controller = LimPID (; k = 3 , Ti = 0.5 , Td = false , u_max = 1.5 ,
393
399
u_min = - 1.5 , Ni = Inf )
394
400
@named model = ODESystem ([
395
401
connect (ref. output, pid_controller. reference),
0 commit comments