private void PID_TimeStep(object sender, EventArgs e) { lock (_pidTimerLock) { if (!pidTimeStep.Enabled) //double checked locking { return; } if (_pidStopped) { return; } temperatureController.AdjustOutput(); //thread sensitive application timeTicks++; } }
private void StartStopBttn_Click(object sender, EventArgs e) { if (!taskRunning) { double tempSet, timeStep, proportionalTerm, integralTerm, derivativeTerm; //C# 7 allows for inline declerations of out parameters StartStopBttn.Text = "Turn Control\nOff"; try { if (double.TryParse(TempSetBx.Text, out tempSet)) { TempPlot.Series[1].Points.AddY(tempSet); } else { tempSet = 22.0; TempSetBx.Text = "22.0"; TempPlot.Series[1].Points.AddY(tempSet); } if (!double.TryParse(TimeStepBx.Text, out timeStep)) { timeStep = 0.01; TimeStepBx.Text = "0.01"; } if (!double.TryParse(ProportionalBx.Text, out proportionalTerm)) { proportionalTerm = 0.0; ProportionalBx.Text = "0.0"; } if (!double.TryParse(IntegralBx.Text, out integralTerm)) { integralTerm = 0.0; IntegralBx.Text = "0.0"; } if (!double.TryParse(DerivativeBx.Text, out derivativeTerm)) { derivativeTerm = 0.0; DerivativeBx.Text = "0.0"; } temperatureController = new TemperatureController(0.01, tempUnits, TempChnnlBx.Text, AIVoltageUnits.Volts, VoltChnnlBx.Text, AOVoltageUnits.Volts) { //TimeStep = timeStep, DesiredTemp = tempSet, A = proportionalTerm, B = integralTerm, C = derivativeTerm, }; TempPlot.ChartAreas[0].AxisY.Minimum = temperatureController.DesiredTemp - 1.0; TempPlot.ChartAreas[0].AxisY.Maximum = temperatureController.DesiredTemp + 1.0; TempPlotExpanded.ChartAreas[0].AxisY.Minimum = temperatureController.DesiredTemp - 15.0; TempPlotExpanded.ChartAreas[0].AxisY.Maximum = temperatureController.DesiredTemp + 15.0; temperatureController.AdjustOutput(); lock (_formTimerLock) { formUpdateTimer.Enabled = true; _formStopped = false; } lock (_pidTimerLock) { pidTimeStep.Enabled = true; _pidStopped = false; pidTimeStep.Interval = (int)(timeStep * 1000); } taskRunning = true; VisualControlStatus.BackColor = Color.Green; VisualControlStatusLbl.Text = "On"; MenuUnitCelsius.Enabled = false; MenuUnitFarenheit.Enabled = false; MenuDeviceRefresh.Enabled = false; pidTimeStep.Start(); formUpdateTimer.Start(); } catch { StartStopBttn.Text = "Turn Control\nOn"; VisualControlStatus.BackColor = Color.Red; VisualControlStatusLbl.Text = "Off"; TempPlot.Series[0].Points.Clear(); TempPlot.Series[1].Points.Clear(); TempPlotExpanded.Series[0].Points.Clear(); TempPlotExpanded.Series[1].Points.Clear(); TempSetBx.Enabled = false; TimeStepBx.Enabled = false; ProportionalBx.Enabled = false; IntegralBx.Enabled = false; DerivativeBx.Enabled = false; StartStopBttn.Enabled = false; taskRunning = false; MenuUnitCelsius.Enabled = true; MenuUnitFarenheit.Enabled = true; MenuDeviceRefresh.Enabled = true; MessageBox.Show("There was an error communicating with the device. Check devices status and refresh the device list.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { timeTicks = 0; TimeStepsLbl.Text = "0"; formUpdateTimer.Enabled = false; pidTimeStep.Enabled = false; lock (_formTimerLock) { formUpdateTimer.Enabled = false; _formStopped = true; } lock (_pidTimerLock) { pidTimeStep.Enabled = false; _pidStopped = true; } temperatureController.Dispose(); TempPlot.Series[0].Points.Clear(); TempPlot.Series[1].Points.Clear(); TempPlotExpanded.Series[0].Points.Clear(); TempPlotExpanded.Series[1].Points.Clear(); StartStopBttn.Text = "Turn Control\nOn"; taskRunning = false; VisualControlStatus.BackColor = Color.Red; VisualControlStatusLbl.Text = "Off"; MenuUnitCelsius.Enabled = true; MenuUnitFarenheit.Enabled = true; MenuDeviceRefresh.Enabled = true; } }