- generalized heaters
This commit is contained in:
@@ -10,13 +10,16 @@ class HeaterHendi(AHeater):
|
|||||||
self.power_eff = 0
|
self.power_eff = 0
|
||||||
|
|
||||||
def get_power_min(self):
|
def get_power_min(self):
|
||||||
caps = self.hendi.getCapabilties()
|
return 0
|
||||||
return caps['pwr_watts_min']
|
|
||||||
|
|
||||||
def get_power_max(self):
|
def get_power_max(self):
|
||||||
caps = self.hendi.getCapabilties()
|
caps = self.hendi.getCapabilties()
|
||||||
return caps['pwr_watts_max']
|
return caps['pwr_watts_max']
|
||||||
|
|
||||||
|
def get_powers(self):
|
||||||
|
caps = self.hendi.getCapabilties()
|
||||||
|
return [0].extend(caps['pwr_list'])
|
||||||
|
|
||||||
def activate(self, enable):
|
def activate(self, enable):
|
||||||
if enable:
|
if enable:
|
||||||
self.hendi.remoteEnable(1)
|
self.hendi.remoteEnable(1)
|
||||||
|
|||||||
@@ -6,12 +6,16 @@ class HeaterSim(AHeater):
|
|||||||
AHeater.__init__(self)
|
AHeater.__init__(self)
|
||||||
self.power_set = 0
|
self.power_set = 0
|
||||||
self.power_eff = 0
|
self.power_eff = 0
|
||||||
|
self.powers = [0, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500]
|
||||||
|
|
||||||
def get_power_min(self):
|
def get_power_min(self):
|
||||||
return 500
|
return self.powers[0]
|
||||||
|
|
||||||
def get_power_max(self):
|
def get_power_max(self):
|
||||||
return 3500
|
return self.powers[-1]
|
||||||
|
|
||||||
|
def get_powers(self):
|
||||||
|
return self.powers
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
power = 100*round(self.power_set/100, 0)
|
power = 100*round(self.power_set/100, 0)
|
||||||
|
|||||||
@@ -18,17 +18,20 @@ class HendiCtrl:
|
|||||||
|
|
||||||
self.ser.timeout = 1.000
|
self.ser.timeout = 1.000
|
||||||
self.prompt = b':'
|
self.prompt = b':'
|
||||||
|
|
||||||
|
powers = [500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300,3400, 3500]
|
||||||
|
digits = [4092, 3840, 3700, 3440, 3300, 3060, 3000, 2930, 2860, 2780, 2640, 2510, 2430, 2360, 2190, 2130, 2030, 1980, 1880, 1730, 1630, 1560, 1480, 1400, 1240, 1150, 1150, 1080, 920, 740, 670]
|
||||||
self.caps = {
|
self.caps = {
|
||||||
"sw_id" : self.getSoftwareIdentifier(),
|
"sw_id" : self.getSoftwareIdentifier(),
|
||||||
"sw_ver" : self.getSoftwareVersion(),
|
"sw_ver" : self.getSoftwareVersion(),
|
||||||
"pwr_watts_min" : 500,
|
"pwr_watts_min" : powers[0],
|
||||||
"pwr_watts_max" : 3500,
|
"pwr_watts_max" : powers[-1],
|
||||||
|
"pwr_list" : powers,
|
||||||
"pwr_watts_step" : 100,
|
"pwr_watts_step" : 100,
|
||||||
"pwr_digits_min" : 4092,
|
"pwr_digits_min" : digits[0],
|
||||||
"pwr_digits_max" : 670
|
"pwr_digits_max" : digits[-1],
|
||||||
|
"digit_list" : digits
|
||||||
}
|
}
|
||||||
powers = [ 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300,3400, 3500]
|
|
||||||
digits = [4092, 3840, 3700, 3440, 3300, 3060, 3000, 2930, 2860, 2780, 2640, 2510, 2430, 2360, 2190, 2130, 2030, 1980, 1880, 1730, 1630, 1560, 1480, 1400, 1240, 1150, 1150, 1080, 920, 740, 670]
|
|
||||||
self.poly_w2d = np.polyfit(powers, digits, 5)
|
self.poly_w2d = np.polyfit(powers, digits, 5)
|
||||||
self.poly_d2w = np.polyfit(digits, powers, 5)
|
self.poly_d2w = np.polyfit(digits, powers, 5)
|
||||||
self.sw_id = self.getSoftwareIdentifier()
|
self.sw_id = self.getSoftwareIdentifier()
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ class AHeater(AttributeChange):
|
|||||||
def get_power_max(self):
|
def get_power_max(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get_powers(self):
|
||||||
|
pass
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def open(self):
|
def open(self):
|
||||||
try:
|
try:
|
||||||
|
|||||||
+28
-10
@@ -34,6 +34,20 @@ class HeaterTask(ATask):
|
|||||||
async def send(self, data):
|
async def send(self, data):
|
||||||
await self.msg_handler.send(data)
|
await self.msg_handler.send(data)
|
||||||
|
|
||||||
|
def get_next_smaller_power(self, power):
|
||||||
|
result = self.device.get_power_min()
|
||||||
|
p_list = [p for p in self.device.get_powers() if p <= power]
|
||||||
|
if len(p_list) > 0:
|
||||||
|
result = p_list[-1]
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_next_greater_power(self, power):
|
||||||
|
result = self.device.get_power_min()
|
||||||
|
p_list = [p for p in self.device.get_powers() if p > power]
|
||||||
|
if len(p_list) > 0:
|
||||||
|
result = p_list[0]
|
||||||
|
return result
|
||||||
|
|
||||||
async def on_process(self):
|
async def on_process(self):
|
||||||
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
||||||
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}})
|
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}})
|
||||||
@@ -45,22 +59,26 @@ class HeaterTask(ATask):
|
|||||||
|
|
||||||
with self.device.open():
|
with self.device.open():
|
||||||
while True:
|
while True:
|
||||||
|
# Combine power set from different sources
|
||||||
power_soll = max(self.power_soll, self.power_actor)
|
power_soll = max(self.power_soll, self.power_actor)
|
||||||
on_count = pulse_period_count
|
|
||||||
if self.device.get_power_min() > 0:
|
# Calculate duty cycle
|
||||||
on_count = pulse_period_count*min(1, power_soll / self.device.get_power_min())
|
power_low = self.get_next_smaller_power(power_soll)
|
||||||
|
power_high = self.get_next_greater_power(power_soll)
|
||||||
|
power_step = power_high - power_low
|
||||||
|
power_diff = power_soll - power_low
|
||||||
|
duty = power_diff / power_step
|
||||||
|
|
||||||
|
on_count = pulse_period_count*duty
|
||||||
|
|
||||||
self.pulse_counter += 1
|
self.pulse_counter += 1
|
||||||
if self.pulse_counter >= pulse_period_count:
|
if self.pulse_counter >= pulse_period_count:
|
||||||
self.pulse_counter = 0
|
self.pulse_counter = 0
|
||||||
|
|
||||||
if power_soll < self.device.get_power_min():
|
if power_soll == 0 or self.pulse_counter >= on_count:
|
||||||
if power_soll == 0 or self.pulse_counter >= on_count:
|
self.device.set_power(power_low)
|
||||||
self.device.set_power(0)
|
elif self.pulse_counter < on_count:
|
||||||
elif self.pulse_counter < on_count:
|
self.device.set_power(power_high)
|
||||||
self.device.set_power(self.device.get_power_min())
|
|
||||||
else:
|
|
||||||
self.device.set_power(power_soll)
|
|
||||||
|
|
||||||
self.device.process()
|
self.device.process()
|
||||||
await asyncio.sleep(self.interval)
|
await asyncio.sleep(self.interval)
|
||||||
|
|||||||
Reference in New Issue
Block a user