# use yield statement
# https: // colab.research.google.com / github / jckantor / CBE30338 / blob / master / docs / 04.01 - Implementing_PID_Control_with_Python_Yield_Statement.ipynb # scrollTo=x_FzBMUc8pUN
[docs]
def proportional(kp, sp):
mv = 0
while True:
pv = yield mv
mv = kp * (sp - pv)
[docs]
def PID(Kp, Ki, Kd, MV_bar=0):
# initialize stored data
e_prev = 0
t_prev = -100
I = 0
# initial control
MV = MV_bar
while True:
# yield MV, wait for new t, PV, SP
t, PV, SP = yield MV
# PID calculations
e = SP - PV
P = Kp * e
I = I + Ki * e * (t - t_prev)
D = Kd * (e - e_prev) / (t - t_prev)
MV = MV_bar + P + I + D
# update stored data for next iteration
e_prev = e
t_prev = t
[docs]
def numbers_gen():
yield 0
yield 1
yield 2.71
yield 3.14
[docs]
def texter_gen():
a = yield "Started"
print(a)
b = yield a
print(a, b)
yield b
if __name__ == "__main__":
num = numbers_gen()
print(next(num))
print(next(num))
print(next(num))
print(next(num))
num = numbers_gen()
print(num.send(None))
print(num.send(None))
print(num.send(None))
print(num.send(None))
# texter = texter_gen()
# print(texter.send(None))
# print(texter.send("Hello, World"))
# print(texter.send("Go Irish"))
controller1 = proportional(10, 40)
print(controller1.send(None))
controller2 = proportional(1, 40)
print(controller2.send(None))
PV = 35
print("Controller 1: MV = ", controller1.send(PV))
print("Controller 2: MV = ", controller2.send(PV))