void Thermocycler::SetPlateControlStrategy() { if (InControlledRamp()) return; if (absf(iTargetPlateTemp - GetPlateTemp()) >= PLATE_BANGBANG_THRESHOLD && !InControlledRamp()) { iPlateControlMode = EBangBang; iPlatePid.SetMode(MANUAL); } else { iPlateControlMode = EPIDPlate; iPlatePid.SetMode(AUTOMATIC); } if (iRamping) { if (iTargetPlateTemp >= GetPlateTemp()) { iDecreasing = false; if (iTargetPlateTemp < PLATE_PID_INC_LOW_THRESHOLD) iPlatePid.SetTunings(PLATE_PID_INC_LOW_P, PLATE_PID_INC_LOW_I, PLATE_PID_INC_LOW_D); else iPlatePid.SetTunings(PLATE_PID_INC_NORM_P, PLATE_PID_INC_NORM_I, PLATE_PID_INC_NORM_D); } else { iDecreasing = true; if (iTargetPlateTemp > PLATE_PID_DEC_HIGH_THRESHOLD) iPlatePid.SetTunings(PLATE_PID_DEC_HIGH_P, PLATE_PID_DEC_HIGH_I, PLATE_PID_DEC_HIGH_D); else if (iTargetPlateTemp < PLATE_PID_DEC_LOW_THRESHOLD) iPlatePid.SetTunings(PLATE_PID_DEC_LOW_P, PLATE_PID_DEC_LOW_I, PLATE_PID_DEC_LOW_D); else iPlatePid.SetTunings(PLATE_PID_DEC_NORM_P, PLATE_PID_DEC_NORM_I, PLATE_PID_DEC_NORM_D); } } }
void Thermocycler::SetPlateControlStrategy() { if (InControlledRamp()) return; if (fabs(m_target_plate_temp - GetPlateTemp()) >= PLATE_BANGBANG_THRESHOLD && !InControlledRamp()) { m_plate_control_mode = EBangBang; m_plate_pid->SetMode(MANUAL); } else { m_plate_control_mode = EPIDPlate; m_plate_pid->SetMode(AUTOMATIC); } if (m_is_ramping) { if (m_target_plate_temp >= GetPlateTemp()) { m_is_decreasing = false; if (m_target_plate_temp < PLATE_PID_INC_LOW_THRESHOLD) m_plate_pid->SetTunings(PLATE_PID_INC_LOW_P, PLATE_PID_INC_LOW_I, PLATE_PID_INC_LOW_D); else m_plate_pid->SetTunings(PLATE_PID_INC_NORM_P, PLATE_PID_INC_NORM_I, PLATE_PID_INC_NORM_D); } else { m_is_decreasing = true; if (m_target_plate_temp > PLATE_PID_DEC_HIGH_THRESHOLD) m_plate_pid->SetTunings(PLATE_PID_DEC_HIGH_P, PLATE_PID_DEC_HIGH_I, PLATE_PID_DEC_HIGH_D); else if (m_target_plate_temp < PLATE_PID_DEC_LOW_THRESHOLD) m_plate_pid->SetTunings(PLATE_PID_DEC_LOW_P, PLATE_PID_DEC_LOW_I, PLATE_PID_DEC_LOW_D); else m_plate_pid->SetTunings(PLATE_PID_DEC_NORM_P, PLATE_PID_DEC_NORM_I, PLATE_PID_DEC_NORM_D); } } }
void Thermocycler::CalcPlateTarget() { if (m_current_step == NULL) return; if (InControlledRamp()) { //controlled ramp double tempDelta = m_current_step->GetTemp() - m_previous_step->GetTemp(); double rampPoint = (double)GetRampElapsedTimeMs() / (m_current_step->GetRampDurationS() * 1000); m_target_plate_temp = m_previous_step->GetTemp() + tempDelta * rampPoint; } else { //fast ramp m_target_plate_temp = m_current_step->GetTemp(); } }
void Thermocycler::CalcPlateTarget() { if (ipCurrentStep == NULL) return; if (InControlledRamp()) { //controlled ramp double tempDelta = ipCurrentStep->GetTemp() - ipPreviousStep->GetTemp(); double rampPoint = (double)GetRampElapsedTimeMs() / (ipCurrentStep->GetRampDurationS() * 1000); iTargetPlateTemp = ipPreviousStep->GetTemp() + tempDelta * rampPoint; } else { //fast ramp iTargetPlateTemp = ipCurrentStep->GetTemp(); } }