- added Temp controller
- use AttributeChange for Processing objects
This commit is contained in:
@@ -46,7 +46,7 @@ class TempSensorTask(ATask):
|
||||
self.kalman.initial((self.sensor.temperature(), 0))
|
||||
temp = ValueChanged(self.on_temp_changed, prec=1)
|
||||
temp_kalman = ValueChanged(self.on_temp_changed_kalman, prec=1)
|
||||
self.sensor.set_on_changed("temp", temp)
|
||||
self.sensor.set_on_changed("temp", temp.set)
|
||||
while True:
|
||||
self.sensor.process()
|
||||
Z = self.kalman.process_measurement((self.sensor.temperature(), 0), 0)
|
||||
@@ -64,6 +64,11 @@ class HeaterTask(ATask):
|
||||
self.msg_handler = msg_handler
|
||||
msg_handler.set_recv_handler(self.recv)
|
||||
self.heater = heater
|
||||
self.y = 0
|
||||
self.power_soll = 0
|
||||
|
||||
def actor(self, y):
|
||||
self.y = y
|
||||
|
||||
async def recv(self, data):
|
||||
print(data)
|
||||
@@ -82,6 +87,8 @@ class HeaterTask(ATask):
|
||||
|
||||
power = Value()
|
||||
while True:
|
||||
self.power_soll = 200 + self.heater.get_power_max()*self.y
|
||||
self.heater.setPower(self.power_soll)
|
||||
self.heater.process()
|
||||
power.set(round(self.heater.getPower()))
|
||||
if power.is_changed():
|
||||
@@ -125,6 +132,31 @@ class PotTask(ATask):
|
||||
await asyncio.sleep(self.interval)
|
||||
|
||||
|
||||
class TcTask(ATask):
|
||||
def __init__(self, tc: temp_controller.TempController, interval, msg_handler: MsgIo):
|
||||
ATask.__init__(self, interval)
|
||||
|
||||
self.msg_handler = msg_handler
|
||||
msg_handler.set_recv_handler(self.recv)
|
||||
self.tc = tc
|
||||
|
||||
async def recv(self, data):
|
||||
print(data)
|
||||
for pair in data.items():
|
||||
if 'Soll' in pair[0]:
|
||||
self.tc.set_theta_soll(pair[1])
|
||||
|
||||
async def send(self, data):
|
||||
await self.msg_handler.send(data)
|
||||
|
||||
async def on_process(self):
|
||||
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
||||
self.tc.set_theta_soll(20)
|
||||
while True:
|
||||
self.tc.process()
|
||||
await asyncio.sleep(self.interval)
|
||||
|
||||
|
||||
class TaskManager:
|
||||
def __init__(self):
|
||||
self.tasks = []
|
||||
@@ -166,7 +198,7 @@ if __name__ == '__main__':
|
||||
|
||||
# Sensor
|
||||
sensor = TempSensorSim()
|
||||
taskmgr.add(TempSensorTask(sensor, 0.2, dispatcher.msgio_get("Sensor"), kalman))
|
||||
taskmgr.add(TempSensorTask(sensor, 1.0, dispatcher.msgio_get("Sensor"), kalman))
|
||||
|
||||
# Plant
|
||||
pot_params = {
|
||||
@@ -179,13 +211,14 @@ if __name__ == '__main__':
|
||||
"kn" : 0.2
|
||||
}
|
||||
pot = Pot(pot_params)
|
||||
pot.set_on_changed("temp", ValueChanged(sensor.set_fake_temp, prec=1))
|
||||
taskmgr.add(PotTask(pot, 0.1, dispatcher.msgio_get("Pot")))
|
||||
pot.set_on_changed("temp", ValueChanged(sensor.set_fake_temp, prec=1).set)
|
||||
taskmgr.add(PotTask(pot, 1.0, dispatcher.msgio_get("Pot")))
|
||||
|
||||
# Heater
|
||||
heater = Heater()
|
||||
heater.set_on_changed("power_eff", ValueChanged(pot.setPower, prec=0))
|
||||
taskmgr.add(HeaterTask(heater, 0.02, dispatcher.msgio_get("Heater")))
|
||||
heater.set_on_changed("power_eff", ValueChanged(pot.setPower, prec=0).set)
|
||||
heater_task = HeaterTask(heater, 1.0, dispatcher.msgio_get("Heater"))
|
||||
taskmgr.add(heater_task)
|
||||
|
||||
# Temperature Controller
|
||||
tc_params = {
|
||||
@@ -208,7 +241,12 @@ if __name__ == '__main__':
|
||||
}
|
||||
}
|
||||
tc = temp_controller.TempController(tc_params)
|
||||
tc.set_on_changed("y_hold", heater_task.actor)
|
||||
tc_task = TcTask(tc, 1.0, dispatcher.msgio_get("Tc"))
|
||||
taskmgr.add(tc_task)
|
||||
sensor.set_on_changed("temp", ValueChanged(tc.set_theta_ist, prec=1).set)
|
||||
|
||||
# Message dispatcher
|
||||
h_dispatcher = taskmgr.start()
|
||||
h_server = server.listen("localhost", 8765)
|
||||
asyncio.gather(h_dispatcher, h_server)
|
||||
|
||||
Reference in New Issue
Block a user