def run(self): print "Thread PID no", self.taskid, "is readry!\n > Based on James Ward's PID algorithm" drive = 0.0 lastdrive = 0.0 #based on James Ward's PID algorithm while not self._stopevent.isSet(): #PID computation #timestamp next = time.time() #get current boiler temp latestTemp = self.maximBoiler.getTemp() #controle de la chaudiere lastdrive = drive #if temperature read is correct, start algorithm if (latestTemp > 0.5): #calculate next time step next += self.m_timeStep #get current target temperature cTargetTemp = self.getTargetTemp() #calculate PID update #boost mode only if boiler target temp is higher than 100C (ECO mode is 90) if ((BOILER_BOOST_MODE == 1) and (cTargetTemp > 100)): tgroupe = self.maximGroupe.getTemp() #stop the boost mode when group temp is higher than boiler temp - 30C (approximate) bBoostLimit = cTargetTemp - 30 #boost boiler target temperature if we are under a certain value if ((tgroupe > 0.5) and (tgroupe < bBoostLimit)): drive = self.pid_update(BOILER_MAX_TEMP - latestTemp, latestTemp) else: drive = self.pid_update(cTargetTemp - latestTemp, latestTemp) else: drive = self.pid_update(cTargetTemp - latestTemp, latestTemp) #drive = self.pid_update( self.getTargetTemp() - latestTemp, latestTemp ) #clamp the output power to sensible range if (drive > 1.0): drive = 1.0 if (drive < 0.0): drive = 0.0 #update the boiler power (with PWM) if last state changed if (drive != lastdrive): drv = int(drive * 100) self.setCurrentDrive(drv) SSRControl.setBoilerPWM(drv) #wait the remaining time (typically, slot = 1 second) remain = next - time.time() if (remain > 0.0): self._stopevent.wait(remain)
def run(self): print "Thread PID no", self.taskid, "is readry!\n > Based on James Ward's PID algorithm" drive = 0.0 lastdrive = 0.0 #based on James Ward's PID algorithm while not self._stopevent.isSet(): #PID computation #timestamp next = time.time() #get current boiler temp latestTemp = self.maximBoiler.getTemp() #controle de la chaudiere lastdrive = drive #if temperature read is correct, start algorithm if ( latestTemp > 0.5 ): #calculate next time step next += self.m_timeStep #get current target temperature cTargetTemp = self.getTargetTemp() #calculate PID update #boost mode only if boiler target temp is higher than 100C (ECO mode is 90) if((BOILER_BOOST_MODE == 1) and (cTargetTemp > 100)): tgroupe = self.maximGroupe.getTemp() #stop the boost mode when group temp is higher than boiler temp - 30C (approximate) bBoostLimit = cTargetTemp - 30 #boost boiler target temperature if we are under a certain value if ((tgroupe > 0.5) and (tgroupe < bBoostLimit)): drive = self.pid_update( BOILER_MAX_TEMP - latestTemp, latestTemp ) else: drive = self.pid_update( cTargetTemp - latestTemp, latestTemp ) else: drive = self.pid_update( cTargetTemp - latestTemp, latestTemp ) #drive = self.pid_update( self.getTargetTemp() - latestTemp, latestTemp ) #clamp the output power to sensible range if ( drive > 1.0 ): drive = 1.0 if ( drive < 0.0 ): drive = 0.0 #update the boiler power (with PWM) if last state changed if ( drive != lastdrive ): drv = int(drive * 100) self.setCurrentDrive( drv ) SSRControl.setBoilerPWM( drv ) #wait the remaining time (typically, slot = 1 second) remain = next - time.time() if ( remain > 0.0 ): self._stopevent.wait(remain)
def quitApplicationNicely(): done = True #be sure to shut down the boiler as well SSRControl.setBoilerPWM(0) saveSettings() task1.stop() task2.stop() task3.stop() task4.stop() task5.stop() task7.stop() task6PID.stop() time.sleep(0.1) pygame.quit() sys.exit(0)
def quitApplicationNicely(): done = True #be sure to shut down the boiler as well SSRControl.setBoilerPWM(0) saveSettings() task1.stop() # task2.stop() # task3.stop() task4.stop() task5.stop() task7.stop() task6PID.stop() task8.stop() time.sleep(0.1) pygame.quit() sys.exit(0)
def run(self): print "Thread PID no", self.taskid, "is readry!\n > PID pump power!" drive = 0.0 lastdrive = 0.0 #based on James Ward's PID algorithm while not self._stopevent.isSet(): #get user entry # rlist, _, _ = select([sys.stdin], [], [], 0.005) rlist = 0 if rlist: cP = cI = cD = 0.0 s = sys.stdin.readline() try: sP, sI, sD = s.split(" ") cP = float(sP) cI = float(sI) cD = float(sD) except ValueError: print "Error conversion, NaN" # print "Entered:",s," cP=",cP," cI=",cI," cD=",cD # print "***********************************************************" # print "oldP=",self.m_pGain,"oldI=",self.m_iGain,"oldD=",self.m_dGain # print "newcP=",cP," cI=",cI," cD=",cD # print "***********************************************************" self.m_pGain = cP self.m_iGain = cI self.m_dGain = cD #PID computation #timestamp next = time.time() #get current pressure latestPressure = self.dataPump.getRange() #controle de la pompe lastdrive = drive #calculate next time step next += self.m_timeStep #get current target pressure cTargetPressure = self.getTargetPressure() #calculate PID update drive = self.pid_update(cTargetPressure - latestPressure, latestPressure, 0) #clamp the output power to sensible range if (drive > self.m_PIDBASE): drive = self.m_PIDBASE if (drive < -self.m_PIDBASE): drive = -self.m_PIDBASE #update the pump power (with PWM) if last state changed if (1): #drive != lastdrive ): drv = self.m_latestPower + drive # drv = 50 + drive if (drv < 50): drv = 50 if (drv > 100): drv = 100 #reduce pump power at lower pressures when going up if ((cTargetPressure < 11) and (cTargetPressure > latestPressure)): if (cTargetPressure == 10): maxdrive = 50 + 25 if (cTargetPressure == 9): maxdrive = 50 + 22 if (cTargetPressure == 8): maxdrive = 50 + 19 if (cTargetPressure < 8): maxdrive = 50 + (cTargetPressure + (cTargetPressure + 1)) #SANS CAFE #target=4 max=7 #target=5 max=8 #target=6 max=9 #target=7 max=10 #target=8 max=12 #target=9 max=15 #target=10 max=20 if (drv > maxdrive): drv = maxdrive print "Bar/", latestPressure, "/Target/", cTargetPressure, "/Real drv% to SSR/", drv, "/raw drive/", drive #SSRControl.setPumpPWM( 50 + (drv/2) ) #moyenne #drv = (drv + self.m_latestPower + self.m_latestPower2)/3 self.setCurrentDrive(drv) if (self.m_latestPower != drv): SSRControl.setPumpPWM(drv) self.m_latestPower2 = self.m_latestPower self.m_latestPower = drv #wait the remaining time (typically, slot = 1 second) remain = next - time.time() if (remain > 0.0): # print "sleeping ", remain self._stopevent.wait(remain)