class ProcessControlOvfProcess(ProcessControlProcessTemplate): def __init__(self): super(ProcessControlOvfProcess, self).__init__() self.conditions=ConditionsContainer() self.formContainer=FormContainer(self) self.configurationFile="processControlOvfProcess.tmp" self.dryRun=False #---------------------------------------------------------------------- # Accessors for the command line def configurationFile(self): return self.formContainer.configurationFile def setConfigurationFile(self, str): self.formContainer.configurationFile=str self.conditions.configurationFile=str configurationFile=property(configurationFile, setConfigurationFile) def actuatorPv(self): return self.formContainer.actuatorPv def setActuatorPv(self, str): self.formContainer.actuatorPv=str actuatorPv=property(actuatorPv, setActuatorPv) def readbackPv(self): return self.formContainer.readbackPv def setReadbackPv(self, str): self.formContainer.readbackPv=str readbackPv=property(readbackPv, setReadbackPv) def holdValue(self): return self.formContainer.holdValue def setHoldValue(self, float): self.formContainer.holdValue=float holdValue=property(holdValue, setHoldValue) def numberOfSamplesPerIteration(self): return self.formContainer.numberOfSamplesPerIteration def setNumberOfSamplesPerIteration(self, int): self.formContainer.numberOfSamplesPerIteration=int numberOfSamplesPerIteration=property(numberOfSamplesPerIteration, setNumberOfSamplesPerIteration) def samplingRate(self): return self.formContainer.samplingRate def setSamplingRate(self, float): self.formContainer.samplingRate=float samplingRate=property(samplingRate, setSamplingRate) def actionUpperLimit(self): return self.formContainer.actionUpperLimit def setActionUpperLimit(self, float): self.formContainer.actionUpperLimit=float actionUpperLimit=property(actionUpperLimit, setActionUpper) def actionLowerLimit(self): return self.formContainer.actionLowerLimit def setActionLowerLimit(self, float): self.formContainer.actionLowerLimit=float actionLower=property(actionLowerLimit, setActionLower) def numberOfPreviousSamples(self): return self.formContainer.numberOfPreviousSamples def setNumberOfPreviousSamples(self, int): self.formContainer.numberOfPreviousSamples=int numberOfPreviousSamples=property(numberOfPreviousSamples, setNumberOfPreviousSamples) def operation(self): return self.formContainer.operation def setOperation(self, int): self.formContainer.operation=int operation=property(operation, setOperation) def gain(self): return self.formContainer.gain def setGain(self, float): self.formContainer.gain=float gain=property(gain, setGain) def offsetPv(self): return self.formContainer.offsetPv def setOffsetPv(self, str): self.formContainer.offsetPv=str offsetPv=property(offsetPv, setOffsetPv) def numberOfIterations(self): return self.formContainer.numberOfIterations def setNumberOfIterations(self, int): self.formContainer.numberOfIterations numberOfIterations=property(numberOfIterations, setNumberOfIterations) def pauseBetweenIterations(self): return self.formContainer.pauseBetweenIterations def setPauseBetweenIterations(self, float): self.formContainer.pauseBetweenIterations=float pauseBetweenIterations=property(pauseBetweenIterations, setPauseBetweenIterations) def conditions(self): return self.conditions @LtiInAndOut(debug) def setConditions(self, list): self.conditions=ConditionsContainer() for conditionArg in list: if debug: print conditionArg pvName, minimum, maximum, description=conditionArg.split(',') condition=Condition() condition.pvName=pvName condition.minimum=float(minimum) condition.maximum=float(maximum) condition.description=description self.conditions.conditions.append(condition) #---------------------------------------------------------------------- @LtiInAndOut(debug) def loadFromConfigurationFile(self): self.conditions.loadFromConfigurationFile() self.formContainer.loadFromConfigurationFile() @LtiInAndOut(debug) def runProcess(self): exception=None try: self.processIsRunning=True iteration=0 # Get local version so attributes are not volatile! conditions=copy.deepcopy(self.conditions) formContainer=copy.deepcopy(self.formContainer) if debug: print "\n" print formContainer print "\n" print conditions print "\n" print "dryRun=%s" % self.dryRun ans=raw_input("Ready? [y]/n") # Connect Pvs actuatorPv=LtiEpicsPv(formContainer.actuatorPv) readbackPv=LtiEpicsPv(formContainer.readbackPv) offsetPv=LtiEpicsPv(formContainer.offsetPv) time.sleep(1) if actuatorPv.connected: if debug: print "Connected to %s" % formContainer.actuatorPv else: print actuatorPv raise LtiEpicsCaError('Actuator Pv (%s) not connected' % formContainer.actuatorPv) if readbackPv.connected: if debug: print "Connected to %s" % formContainer.readbackPv else: print readbackPv raise LtiEpicsCaError('Readback Pv (%s) not connected' % formContainer.readbackPv) if offsetPv.connected: if debug: print "Connected to %s" % formContainer.offsetPv else: print offsetPv raise LtiEpicsCaError('Readback Pv (%s) not connected' % formContainer.offsetPv) conditions.connectPvs() # Get fifo sampleFifo=LtiFifoStack() sampleFifo.size=formContainer.numberOfSamplesPerIteration+formContainer.numberOfPreviousSamples while (self.processIsRunning and iteration<formContainer.numberOfIterations): if (not self.processIsPaused) : try: timestamp=time.asctime(time.localtime()) print "" print "+----------------------------------------------------------------------" print "| Iteration: %d / %d " % (iteration, formContainer.numberOfIterations) print "|" print "| Time : %s" % timestamp print "| processId: %d" % self.processId print "|" print "+----------------------------------------------------------------------" print "" # Check conditions are met conditions.checkAllConditionsAreMet() # Acquire samples newSamples=list() while len(newSamples) < formContainer.numberOfSamplesPerIteration: newSamples.append(readbackPv.lti_caget()) time.sleep(1/formContainer.samplingRate) sampleFifo+=newSamples if formContainer.operation==0 : goldenSample=sampleFifo.lti_getAverage() else: raise LtiStackOperation('Unknown operation') slope=formContainer.gain offset=offsetPv.lti_caget() newSetpoint=slope*(formContainer.holdValue-goldenSample) + offset if debug: print sampleFifo print "slope= %f" % slope print "holdValue= %f" % formContainer.holdValue print "goldenSample= %f" % goldenSample print "offset = %f" % offset print "" print "%f = %f * (%f - %f) + % f" % ( newSetpoint, slope, formContainer.holdValue, goldenSample, offset) print "" print "%f --> %s" % ( newSetpoint, actuatorPv.pvName ) if self.dryRun: print "*** DRY RUN ***" else: print "*** MOVING ***" actuatorPv.lti_caput(newSetpoint) except LtiEpicsPvOutOfBounds as e: print "All conditions are not met!" finally: iteration+=1 time.sleep(formContainer.pauseBetweenIterations) except LtiEpicsCaError as e: print e exception=e except LtiStackOperation as e: print e exception=e finally: self.stopProcess() if exception != None: raise exception