- refactored
This commit is contained in:
@@ -93,10 +93,10 @@ class HeaterTask(ATask):
|
|||||||
|
|
||||||
while True:
|
while True:
|
||||||
if self.power_soll < self.heater.get_power_min():
|
if self.power_soll < self.heater.get_power_min():
|
||||||
self.heater.setPower(self.heater.get_power_min())
|
self.heater.set_power(self.heater.get_power_min())
|
||||||
self.heater.activate(False)
|
self.heater.activate(False)
|
||||||
else:
|
else:
|
||||||
self.heater.setPower(self.power_soll)
|
self.heater.set_power(self.power_soll)
|
||||||
self.heater.activate(True)
|
self.heater.activate(True)
|
||||||
|
|
||||||
on_count = pulse_period_count
|
on_count = pulse_period_count
|
||||||
@@ -262,7 +262,7 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
# Heater
|
# Heater
|
||||||
heater = HeaterFactory.create("sim")
|
heater = HeaterFactory.create("sim")
|
||||||
heater.set_on_changed("power_eff", ChangedFloat(pot.setPower, prec=0).set)
|
heater.set_on_changed("power_eff", ChangedFloat(pot.set_power, prec=0).set)
|
||||||
heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater"))
|
heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater"))
|
||||||
taskmgr.add(heater_task)
|
taskmgr.add(heater_task)
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ class StirrerFactory:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def create(name, dt):
|
def create(name, dt):
|
||||||
if "sim" in name:
|
if "sim" in name:
|
||||||
from components.actor.stirrer_sim import Stirrer_sim
|
from components.actor.stirrersim import StirrerSim
|
||||||
return Stirrer_sim(dt)
|
return StirrerSim(dt)
|
||||||
elif "1376" in name:
|
elif "1376" in name:
|
||||||
from components.actor.stirrer_pololu1376 import Stirrer_pololu1376
|
from components.actor.stirrerpololu1376 import StirrerPololu1376
|
||||||
return Stirrer_pololu1376(dt, '/dev/ttyUSB0', 115200)
|
return StirrerPololu1376(dt, '/dev/ttyUSB0', 115200)
|
||||||
|
|||||||
@@ -33,9 +33,9 @@ class HeaterHendi(AHeater):
|
|||||||
power_eff = self.power_set if self.is_active else 0
|
power_eff = self.power_set if self.is_active else 0
|
||||||
self.hendi.setPowerWatts(power_eff)
|
self.hendi.setPowerWatts(power_eff)
|
||||||
|
|
||||||
def setPower(self, power):
|
def set_power(self, power):
|
||||||
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
|
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
|
||||||
|
|
||||||
def getPower(self):
|
def get_power(self):
|
||||||
result = self.hendi.getPowerWatts()
|
result = self.hendi.getPowerWatts()
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ class HeaterSim(AHeater):
|
|||||||
def process(self):
|
def process(self):
|
||||||
self.power_eff = self.power_set if self.is_active else 0
|
self.power_eff = self.power_set if self.is_active else 0
|
||||||
|
|
||||||
def setPower(self, power):
|
def set_power(self, power):
|
||||||
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
|
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
|
||||||
|
|
||||||
def getPower(self):
|
def get_power(self):
|
||||||
return self.power_eff
|
return self.power_eff
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ import time
|
|||||||
import serial
|
import serial
|
||||||
|
|
||||||
|
|
||||||
class Stirrer_pololu1376(AStirrer):
|
class StirrerPololu1376(AStirrer):
|
||||||
def name(self):
|
def name(self):
|
||||||
return "Pololu1376"
|
return "Pololu1376"
|
||||||
|
|
||||||
def __init__(self, dt, port, baudrate):
|
def __init__(self, dt, port, baudrate):
|
||||||
super(Stirrer_pololu1376, self).__init__(dt)
|
super(StirrerPololu1376, self).__init__(dt)
|
||||||
self.isMasterOn = 0
|
self.isMasterOn = 0
|
||||||
|
|
||||||
self.ser_speed = baudrate
|
self.ser_speed = baudrate
|
||||||
@@ -17,7 +17,7 @@ class Stirrer_pololu1376(AStirrer):
|
|||||||
self.ser.set_output_flow_control(False)
|
self.ser.set_output_flow_control(False)
|
||||||
try:
|
try:
|
||||||
self.ser.open()
|
self.ser.open()
|
||||||
except:
|
except serial.SerialException:
|
||||||
self.ser.close()
|
self.ser.close()
|
||||||
self.ser.open()
|
self.ser.open()
|
||||||
|
|
||||||
@@ -28,10 +28,10 @@ class Stirrer_pololu1376(AStirrer):
|
|||||||
self.ser.write((cmd + '\r\n').encode())
|
self.ser.write((cmd + '\r\n').encode())
|
||||||
|
|
||||||
def ser_recv(self):
|
def ser_recv(self):
|
||||||
s = self.ser.readline().decode("utf-8").replace("\n", '').replace("\r", '')
|
data = self.ser.readline().decode("utf-8").replace("\n", '').replace("\r", '')
|
||||||
return s
|
return data
|
||||||
|
|
||||||
def getSpeed(self):
|
def get_speed(self):
|
||||||
if self.isOn and self.is_activated():
|
if self.isOn and self.is_activated():
|
||||||
return self.speed
|
return self.speed
|
||||||
return 0
|
return 0
|
||||||
@@ -40,33 +40,33 @@ class Stirrer_pololu1376(AStirrer):
|
|||||||
self.ser_send("go")
|
self.ser_send("go")
|
||||||
print("on_activate {}".format(enable))
|
print("on_activate {}".format(enable))
|
||||||
|
|
||||||
def onSetSpeed(self, speed):
|
def on_set_speed(self, speed):
|
||||||
self.ser_send("F" + str(speed) + "%")
|
self.ser_send("F" + str(speed) + "%")
|
||||||
print("Set speed to {} %".format(speed))
|
print("Set speed to {} %".format(speed))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
s = Stirrer_pololu1376(dt=1.0, port="/dev/ttyACM0", baudrate=115200)
|
s = StirrerPololu1376(dt=1.0, port="/dev/ttyACM0", baudrate=115200)
|
||||||
s.activate(True)
|
s.activate(True)
|
||||||
|
|
||||||
print ("Set some speeds")
|
print("Set some speeds")
|
||||||
s.setSpeed(50)
|
s.set_speed(50)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
s.setSpeed(20)
|
s.set_speed(20)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
s.setSpeed(50)
|
s.set_speed(50)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
print ("Pulsed operation, duty cycle = 50%")
|
print("Pulsed operation, duty cycle = 50%")
|
||||||
s.setDutyCycle(0.5)
|
s.set_duty_cycle(0.5)
|
||||||
s.setCycleTime(10)
|
s.set_cycle_time(10)
|
||||||
for i in range(1, 30):
|
for i in range(1, 30):
|
||||||
s.process()
|
s.process()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
print ("Pulsed operation, duty cycle = 20%")
|
print("Pulsed operation, duty cycle = 20%")
|
||||||
s.setDutyCycle(0.2)
|
s.set_duty_cycle(0.2)
|
||||||
s.setCycleTime(10)
|
s.set_cycle_time(10)
|
||||||
for i in range(1, 30):
|
for i in range(1, 30):
|
||||||
s.process()
|
s.process()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
@@ -2,12 +2,12 @@ from components import AStirrer
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
|
|
||||||
class Stirrer_sim(AStirrer):
|
class StirrerSim(AStirrer):
|
||||||
def name(self):
|
def name(self):
|
||||||
return "FakeStirrer"
|
return "FakeStirrer"
|
||||||
|
|
||||||
def __init__(self, dt):
|
def __init__(self, dt):
|
||||||
super(Stirrer_sim, self).__init__(dt)
|
super(StirrerSim, self).__init__(dt)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
self.activate(False)
|
self.activate(False)
|
||||||
@@ -15,37 +15,37 @@ class Stirrer_sim(AStirrer):
|
|||||||
def on_activate(self, enable):
|
def on_activate(self, enable):
|
||||||
print("on_activate {}".format(enable))
|
print("on_activate {}".format(enable))
|
||||||
|
|
||||||
def getSpeed(self):
|
def get_speed(self):
|
||||||
if self.isOn and self.is_activated():
|
if self.isOn and self.is_activated():
|
||||||
return self.speed
|
return self.speed
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def onSetSpeed(self, speed):
|
def on_set_speed(self, speed):
|
||||||
print("Set speed to {} %".format(speed))
|
print("Set speed to {} %".format(speed))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
s = Stirrer_sim(1.0)
|
s = StirrerSim(1.0)
|
||||||
s.activate(True)
|
s.activate(True)
|
||||||
|
|
||||||
print ("Set some speeds")
|
print("Set some speeds")
|
||||||
s.setSpeed(50)
|
s.set_speed(50)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
s.setSpeed(100)
|
s.set_speed(100)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
s.setSpeed(50)
|
s.set_speed(50)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
print ("Pulsed operation, duty cycle = 50%")
|
print("Pulsed operation, duty cycle = 50%")
|
||||||
s.setDutyCycle(0.5)
|
s.set_duty_cycle(0.5)
|
||||||
s.setCycleTime(10)
|
s.set_cycle_time(10)
|
||||||
for i in range(1, 30):
|
for i in range(1, 30):
|
||||||
s.process()
|
s.process()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
print ("Pulsed operation, duty cycle = 20%")
|
print("Pulsed operation, duty cycle = 20%")
|
||||||
s.setDutyCycle(0.2)
|
s.set_duty_cycle(0.2)
|
||||||
s.setCycleTime(10)
|
s.set_cycle_time(10)
|
||||||
for i in range(1, 30):
|
for i in range(1, 30):
|
||||||
s.process()
|
s.process()
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
@@ -27,9 +27,9 @@ class AHeater(AttributeChange):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def setPower(self, power):
|
def set_power(self, power):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def getPower(self):
|
def get_power(self):
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ class APlant(AttributeChange):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def setPower(self, power):
|
def set_power(self, power):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def getPower(self):
|
def get_power(self):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def getTemperature(self):
|
def get_temperature(self):
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -34,21 +34,25 @@ class AStirrer:
|
|||||||
|
|
||||||
self.isOn = isOn
|
self.isOn = isOn
|
||||||
|
|
||||||
def setSpeed(self, speed):
|
def set_speed(self, speed):
|
||||||
self.speed = speed
|
self.speed = speed
|
||||||
if self.isOn or self.dutyCycle == 1:
|
if self.isOn or self.dutyCycle == 1:
|
||||||
self.onSetSpeed(speed)
|
self.on_set_speed(speed)
|
||||||
|
|
||||||
def setCycleTime(self, time):
|
def set_cycle_time(self, time):
|
||||||
self.cycleTime = time
|
self.cycleTime = time
|
||||||
|
|
||||||
def setDutyCycle(self, dutyCycle):
|
def set_duty_cycle(self, dutyCycle):
|
||||||
self.dutyCycle = dutyCycle
|
self.dutyCycle = dutyCycle
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def getSpeed(self):
|
def get_speed(self):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def on_set_speed(self, speed):
|
||||||
|
pass
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def on_activate(self, enable):
|
def on_activate(self, enable):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -167,13 +167,13 @@ if __name__ == '__main__':
|
|||||||
hold_counter -= 1
|
hold_counter -= 1
|
||||||
ctrl.process()
|
ctrl.process()
|
||||||
plant.process()
|
plant.process()
|
||||||
temp_ist = plant.getTemperature() + 0.0*np.random.randn()
|
temp_ist = plant.get_temperature() + 0.0 * np.random.randn()
|
||||||
ctrl.set_theta_ist(temp_ist)
|
ctrl.set_theta_ist(temp_ist)
|
||||||
|
|
||||||
y = 3500*ctrl.get_power()
|
y = 3500*ctrl.get_power()
|
||||||
power = max(0, 250+y)
|
power = max(0, 250+y)
|
||||||
plant.setPower(power)
|
plant.set_power(power)
|
||||||
fb = plant.getPower()
|
fb = plant.get_power()
|
||||||
if abs(temp_ist - temp_soll) < 0.1:
|
if abs(temp_ist - temp_soll) < 0.1:
|
||||||
hold = True
|
hold = True
|
||||||
|
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ class Pot(APlant):
|
|||||||
leak = 1/self.M * self.L * (self.theta_amb - self.temp)/self.theta_amb
|
leak = 1/self.M * self.L * (self.theta_amb - self.temp)/self.theta_amb
|
||||||
self.temp += (self.power_actual / (self.M * self.C) + leak) * self.dt
|
self.temp += (self.power_actual / (self.M * self.C) + leak) * self.dt
|
||||||
|
|
||||||
def setPower(self, power):
|
def set_power(self, power):
|
||||||
self.power_set = power
|
self.power_set = power
|
||||||
|
|
||||||
def getPower(self):
|
def get_power(self):
|
||||||
return round(self.power_actual, 1)
|
return round(self.power_actual, 1)
|
||||||
|
|
||||||
def getTemperature(self):
|
def get_temperature(self):
|
||||||
return self.temp
|
return self.temp
|
||||||
|
|||||||
Reference in New Issue
Block a user