1
1
import sys
2
2
import time
3
+ import stime
3
4
import pytest
4
5
from simple_pid import PID
5
6
@@ -25,59 +26,65 @@ def test_P_negative_setpoint():
25
26
26
27
27
28
def test_I ():
28
- pid = PID (0 , 10 , 0 , setpoint = 10 , sample_time = 0.1 )
29
- time .sleep (0.1 )
29
+ stime .reset (0 )
30
+ pid = PID (0 , 10 , 0 , setpoint = 10 , sample_time = 0.1 , time_fn = stime .monotonic )
31
+ stime .reset (0.1 )
30
32
31
33
assert round (pid (0 )) == 10.0 # Make sure we are close to expected value
32
- time . sleep (0.1 )
34
+ stime . reset (0.2 )
33
35
34
36
assert round (pid (0 )) == 20.0
35
37
36
38
37
39
def test_I_negative_setpoint ():
38
- pid = PID (0 , 10 , 0 , setpoint = - 10 , sample_time = 0.1 )
39
- time .sleep (0.1 )
40
+ stime .reset (0 )
41
+ pid = PID (0 , 10 , 0 , setpoint = - 10 , sample_time = 0.1 , time_fn = stime .monotonic )
42
+ stime .reset (0.1 )
43
+
40
44
41
45
assert round (pid (0 )) == - 10.0
42
- time . sleep (0.1 )
46
+ stime . reset (0.2 )
43
47
44
48
assert round (pid (0 )) == - 20.0
45
49
46
50
47
51
def test_D ():
48
- pid = PID (0 , 0 , 0.1 , setpoint = 10 , sample_time = 0.1 )
52
+ stime .reset (0 )
53
+ pid = PID (0 , 0 , 0.1 , setpoint = 10 , sample_time = 0.1 , time_fn = stime .monotonic )
49
54
50
55
# Should not compute derivative when there is no previous input (don't assume 0 as first input)
51
56
assert pid (0 ) == 0
52
- time .sleep (0.1 )
57
+ stime .reset (0.1 )
58
+
53
59
54
60
# Derivative is 0 when input is the same
55
61
assert pid (0 ) == 0
56
62
assert pid (0 ) == 0
57
- time . sleep (0.1 )
63
+ stime . reset (0.2 )
58
64
59
65
assert round (pid (5 )) == - 5
60
- time . sleep (0.1 )
66
+ stime . reset (0.3 )
61
67
assert round (pid (15 )) == - 10
62
68
63
69
64
70
def test_D_negative_setpoint ():
65
- pid = PID (0 , 0 , 0.1 , setpoint = - 10 , sample_time = 0.1 )
66
- time .sleep (0.1 )
71
+ stime .reset (0 )
72
+ pid = PID (0 , 0 , 0.1 , setpoint = - 10 , sample_time = 0.1 , time_fn = stime .monotonic )
73
+ stime .reset (0.1 )
67
74
68
75
# Should not compute derivative when there is no previous input (don't assume 0 as first input)
69
76
assert pid (0 ) == 0
70
- time . sleep (0.1 )
77
+ stime . reset (0.2 )
71
78
72
79
# Derivative is 0 when input is the same
73
80
assert pid (0 ) == 0
74
81
assert pid (0 ) == 0
75
- time . sleep (0.1 )
82
+ stime . reset (0.3 )
76
83
77
84
assert round (pid (5 )) == - 5
78
- time . sleep (0.1 )
85
+ stime . reset (0.4 )
79
86
assert round (pid (- 5 )) == 10
80
- time . sleep (0.1 )
87
+ stime . reset (0.5 )
81
88
assert round (pid (- 15 )) == 10
82
89
83
90
@@ -89,11 +96,12 @@ def test_desired_state():
89
96
90
97
91
98
def test_output_limits ():
92
- pid = PID (100 , 20 , 40 , setpoint = 10 , output_limits = (0 , 100 ), sample_time = None )
93
- time .sleep (0.1 )
99
+ stime .reset (0 )
100
+ pid = PID (100 , 20 , 40 , setpoint = 10 , output_limits = (0 , 100 ), sample_time = None , time_fn = stime .monotonic )
101
+ stime .reset (0.1 )
94
102
95
103
assert 0 <= pid (0 ) <= 100
96
- time . sleep (0.1 )
104
+ stime . reset (0.2 )
97
105
98
106
assert 0 <= pid (- 100 ) <= 100
99
107
@@ -156,7 +164,8 @@ def test_starting_output():
156
164
157
165
158
166
def test_auto_mode ():
159
- pid = PID (1 , 0 , 0 , setpoint = 10 , sample_time = None )
167
+ stime .reset (0 )
168
+ pid = PID (1 , 0 , 0 , setpoint = 10 , sample_time = None , time_fn = stime .monotonic )
160
169
161
170
# Ensure updates happen by default
162
171
assert pid (0 ) == 10
@@ -175,7 +184,7 @@ def test_auto_mode():
175
184
176
185
# Last update time should be reset to avoid huge dt
177
186
pid .auto_mode = False
178
- time . sleep (1 )
187
+ stime . reset (1 )
179
188
pid .auto_mode = True
180
189
assert pid .time_fn () - pid ._last_time < 0.01
181
190
@@ -186,11 +195,12 @@ def test_auto_mode():
186
195
187
196
188
197
def test_separate_components ():
189
- pid = PID (1 , 0 , 1 , setpoint = 10 , sample_time = 0.1 )
198
+ stime .reset (0 )
199
+ pid = PID (1 , 0 , 1 , setpoint = 10 , sample_time = 0.1 , time_fn = stime .monotonic )
190
200
191
201
assert pid (0 ) == 10
192
202
assert pid .components == (10 , 0 , 0 )
193
- time . sleep (0.1 )
203
+ stime . reset (0.1 )
194
204
195
205
assert round (pid (5 )) == - 45
196
206
assert tuple (round (term ) for term in pid .components ) == (5 , 0 , - 50 )
@@ -236,46 +246,45 @@ def test_repr():
236
246
237
247
238
248
def test_converge_system ():
239
- TIME_TO_CONVERGE = 12
240
-
241
- pid = PID (1 , 0.8 , 0.04 , setpoint = 5 , output_limits = (- 5 , 5 ))
249
+ stime .reset (0 )
250
+ pid = PID (1 , 0.8 , 0.04 , setpoint = 5 , output_limits = (- 5 , 5 ), time_fn = stime .monotonic )
242
251
pv = 0 # Process variable
243
252
244
253
def update_system (c , dt ):
245
254
# Calculate a simple system model
246
255
return pv + c * dt - 1 * dt
247
256
248
- start_time = time .time ()
257
+ start_time = stime .time ()
249
258
last_time = start_time
250
259
251
- while time .time () - start_time < TIME_TO_CONVERGE :
260
+ for _ in range (5 ):
261
+ stime .tick ()
252
262
c = pid (pv )
253
- pv = update_system (c , time .time () - last_time )
263
+ pv = update_system (c , stime .time () - last_time )
254
264
255
- last_time = time .time ()
265
+ last_time = stime .time ()
256
266
257
267
# Check if system has converged
258
268
assert abs (pv - 5 ) < 0.1
259
269
260
-
261
270
def test_converge_diff_on_error ():
262
- TIME_TO_CONVERGE = 12
263
-
264
- pid = PID (1 , 0.8 , 0.04 , setpoint = 5 , output_limits = (- 5 , 5 ), differential_on_measurement = False )
271
+ stime .reset (0 )
272
+ pid = PID (1 , 0.8 , 0.04 , setpoint = 5 , output_limits = (- 5 , 5 ), differential_on_measurement = False , time_fn = stime .monotonic )
265
273
pv = 0 # Process variable
266
274
267
275
def update_system (c , dt ):
268
276
# Calculate a simple system model
269
277
return pv + c * dt - 1 * dt
270
278
271
- start_time = time .time ()
279
+ start_time = stime .time ()
272
280
last_time = start_time
273
281
274
- while time .time () - start_time < TIME_TO_CONVERGE :
282
+ for _ in range (5 ):
283
+ stime .tick ()
275
284
c = pid (pv )
276
- pv = update_system (c , time .time () - last_time )
285
+ pv = update_system (c , stime .time () - last_time )
277
286
278
- last_time = time .time ()
287
+ last_time = stime .time ()
279
288
280
289
# Check if system has converged
281
290
assert abs (pv - 5 ) < 0.1
0 commit comments