Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
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()
	time.sleep(0.1)
	pygame.quit()
        sys.exit(0)
Пример #4
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)
Пример #5
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)