From bca44990ffe1b39d16bb709fc36a236197cfe472 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 25 Mar 2019 07:22:22 +0000 Subject: [PATCH] - use thread for controller - leave plot stuff in main thread git-svn-id: http://moon:8086/svn/projects/HendiControl@127 fda53097-d464-4ada-af97-ba876c37ca34 --- Control/brewpi/brewpi.py | 34 ++++++++++++++++++++++--- Control/brewpi/controller.py | 49 ++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/Control/brewpi/brewpi.py b/Control/brewpi/brewpi.py index 4100a4b..f394ce6 100644 --- a/Control/brewpi/brewpi.py +++ b/Control/brewpi/brewpi.py @@ -2,11 +2,37 @@ import time import json -import configparser -from pid import Pid from controller import Controller from mass import Mass from stirrer import Stirrer +from matplotlib.pyplot import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show, subplot + +def results_plot(self): + + figure(1) + subplot(4, 1, 1) + plot(self.time_v, self.theta_v, 'b-', linewidth=1) + title('Temperature') + grid(True) + ylabel('°C') + subplot(4, 1, 2) + plot(self.time_v, self.power_v, 'r-', linewidth=1) + title('Power') + grid(True) + ylabel('W') + subplot(4, 1, 3) + plot(self.time_v, self.error_v, 'b-', linewidth=1) + title('Error') + grid(True) + ylabel('°C') + subplot(4, 1, 4) + plot(self.time_v, self.heatrate_v, 'r-', linewidth=1) + title('Heatrate') + grid(True) + ylabel('°C/min') + xlabel('t/min') + show() + if __name__ == '__main__': @@ -21,7 +47,9 @@ if __name__ == '__main__': recipeJson = json.load(fp) ablauf.start(recipeJson) - ablauf.stop() + ablauf.wait_finished() + + results_plot(ablauf) print ("End of program.") diff --git a/Control/brewpi/controller.py b/Control/brewpi/controller.py index c7de17d..13a5c65 100644 --- a/Control/brewpi/controller.py +++ b/Control/brewpi/controller.py @@ -2,9 +2,9 @@ import numpy as np import json from enum import Enum from pid import Pid -from matplotlib.pyplot import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show, subplot from utils import Smoother, Stable import time +import threading ovenStates = Enum('ovenStates', 'NOP HEAT HOLD') controllerStates = Enum('controllerStates', 'ACQU TRACK') @@ -33,6 +33,9 @@ class Controller(): self.sim_warp_factor = 100 self.report_interval = 1.0 self.report_last_time = 0 + self.thread = None + self.rast_abort = False + self.receipe_sema = threading.Semaphore(0) def log(self, s): now = time.time() @@ -54,6 +57,22 @@ class Controller(): def start(self, recipe): print(json.dumps({recipe['Name'] : recipe}, indent=4, sort_keys=True)) + self.thread = threading.Thread(target=self.receipe_run, args=(recipe,)) + self.thread.start() + + def stop(self): + if self.thread != None: + self.rast_abort = True + self.thread.join() + self.thread = None + self.rast_abort = False + + def wait_finished(self): + self.receipe_sema.acquire() + pass + + def receipe_run(self, recipe): + # Stirrer self.stirrRpmHeat = recipe['stirrRpmHeat'] self.stirrRpmRast = recipe['stirrRpmRast'] @@ -65,30 +84,7 @@ class Controller(): for rast in recipe['Rasten']: self.rast(rast) - def stop(self): - figure(1) - subplot(4, 1, 1) - plot(self.time_v, self.theta_v, 'b-', linewidth=1) - title('Temperature') - grid(True) - ylabel('°C') - subplot(4, 1, 2) - plot(self.time_v, self.power_v, 'r-', linewidth=1) - title('Power') - grid(True) - ylabel('W') - subplot(4, 1, 3) - plot(self.time_v, self.error_v, 'b-', linewidth=1) - title('Error') - grid(True) - ylabel('°C') - subplot(4, 1, 4) - plot(self.time_v, self.heatrate_v, 'r-', linewidth=1) - title('Heatrate') - grid(True) - ylabel('°C/min') - xlabel('t/min') - show() + self.receipe_sema.release() def rast(self, rast): @@ -113,6 +109,9 @@ class Controller(): theta_err_sm = Smoother(0.5) heatrate_err_sm = Smoother(0.5) while(doLoop): + if self.rast_abort: + break + time_start = time.time() controllerStateNext = self.controllerState