private void DoExperiment1(ref TestInfo myTestInfo, ref UUTData myUUTData, ref CommonData myCommonData) { try { var loop = Convert.ToInt32(myTestInfo.TestParams[1].Value); var delay = Convert.ToInt32(myTestInfo.TestParams[2].Value); // Close all Test Valves InstrumentIO.CloseAllTestValve(mySw); Thread.Sleep(5000); InstrumentIO.OpenTestValve(mySw, 0); // open NIST valve Thread.Sleep(5000); // Configure Thermocouple measurement InstrumentIO.ConfigureThermocouple(mySw); myTestInfo.ResultsParams = new PIResultsArray(); List <PIResult> listOfPIResult = new List <PIResult>(); for (int i = 0; i < loop; i++) { listOfPIResult.Add(new PIResult { Label = string.Format("NistLeakRate#{0}", i + 1), SpecMin = "1E-7", SpecMax = "2E-7", Nominal = "1.5E-7", Unit = "std cc/sec" }); } for (int i = 0; i < loop; i++) { listOfPIResult.Add(new PIResult { Label = string.Format("NISTTemp#{0}", i + 1), SpecMin = "15", SpecMax = "30", Nominal = "22.5", Unit = "Deg C" }); } for (int i = 0; i < loop; i++) { listOfPIResult.Add(new PIResult { Label = string.Format("UUTTemp#{0}", i + 1), SpecMin = "15", SpecMax = "30", Nominal = "22.5", Unit = "Deg C" }); } for (int i = 0; i < loop; i++) { listOfPIResult.Add(new PIResult { Label = string.Format("UUTSensorTemp#{0}", i + 1), SpecMin = "15", SpecMax = "30", Nominal = "22.5", Unit = "Deg C" }); } myTestInfo.ResultsParams.PIResArray = listOfPIResult.ToArray(); myTestInfo.ResultsParams.NumResultParams = listOfPIResult.Count; // Test start here for (int i = 1; i <= loop; i++) // loop 5760 * 60 * 60 with 5sec delay = 8hrs { /* Read * (1) leak rate NIST, * (2) Temp NIST * (3) Temp UUT * (4) Temp Sensor Board */ var leakRate = Convert.ToDouble(myLD.ReadLeakRate().Trim()); var nistTemp = InstrumentIO.MeasureCalLeakTemp(mySw, 0); var uutTemp = InstrumentIO.MeasureCalLeakTemp(mySw, 1); var uutSensTemp = InstrumentIO.MeasureBoardTemperature(mySw, myScope, 1); Trace.WriteLine(string.Format("NIST Leak Rate #{0} = {1}std cc/sec & NIST Temp #{0} = {2} Deg C & DUT Temp #{0} = {3} Deg C & Board Temp #{0} = {4} Deg C", i, leakRate, nistTemp, uutTemp, uutSensTemp)); myTestInfo.ResultsParams[i].Result = Math.Round(leakRate, 8).ToString(); myTestInfo.ResultsParams[i + loop].Result = Math.Round(nistTemp, 3).ToString(); myTestInfo.ResultsParams[i + (loop * 2)].Result = Math.Round(uutTemp, 3).ToString(); myTestInfo.ResultsParams[i + (loop * 3)].Result = Math.Round(uutSensTemp, 3).ToString(); // Delay 5 seconds, maybe Thread.Sleep(delay * 1000); } } catch (Exception) { throw; } }
private void DoExternalCal(ref TestInfo myTestInfo, ref UUTData myUUTData, ref CommonData myCommonData) { try { var delay = Convert.ToInt32(myTestInfo.TestParams[1].Value); // Make sure all valve is closed. InstrumentIO.CloseAllTestValve(mySw); string retVal = string.Empty; // Rough vacuum Trace.WriteLine("Roughing in progress..."); myLD.Rough(); Thread.Sleep(10000); //bool isContraFlow = myLD.WaitForContraFlow(ref retVal); bool isMidStage = myLD.WaitForFineTest(ref retVal); if (!isMidStage) { myTestInfo.ResultsParams[1].Result = retVal; Trace.WriteLine("Unable to set to MIDSTAGE state."); } Thread.Sleep(5000); // Once in Fine-Test mode, let the leak rate to stabilize double zeroleakrate = Convert.ToDouble(myLD.ReadLeakRate()); int timerys = 0; while (zeroleakrate > 5E-10) { Thread.Sleep(1000); zeroleakrate = Convert.ToDouble(myLD.ReadLeakRate()); Trace.WriteLine("calibration wait time: " + timerys); timerys++; if (timerys == 180) { Trace.WriteLine("Zero-ing"); myLD.Zero(); Thread.Sleep(2000); //MessageBox.Show("to reach 5E-10 in 15 minutes","Fail",MessageBoxButtons.OK); //myTestInfo.ResultsParams[1].Result = "FAIL"; break; } } // Set LD to Hold state myLD.Hold(); Thread.Sleep(5000); // Open NIST Valve Trace.WriteLine("Open NIST Test Valve."); InstrumentIO.OpenTestValve(mySw, 0); Thread.Sleep(1000); // Now set the LD to TEST mode var stat = myLD.Rough(); Thread.Sleep(10000); isMidStage = myLD.WaitForFineTest(ref retVal); if (!isMidStage) { myTestInfo.ResultsParams[1].Result = retVal; Trace.WriteLine("Unable to set to MIDSTAGE state."); } else { myTestInfo.ResultsParams[1].Result = "FINETEST"; // Delay 2 minutes for the LD to stabilize. Trace.WriteLine("Waiting for the VS Leak Detector to stabilize in 2 minutes"); Thread.Sleep(delay * 1000); // wait for 2 minutes (120,000 miliseconds) Trace.WriteLine("VS Leak Detector is now stabilized"); var stab = ""; bool stabilized = myLD.WaitForStabilizedReading(ref stab); if (stabilized) { Trace.WriteLine("Leak rate reading is stabilized!"); } else { Trace.WriteLine("Timeout to get stable leak rate reading!"); } // Now calibrate the VS Leak Detector. string calStatus = myLD.Calibrate(); // Default timeout for calibration is 300seconds, change to overload method and provide new Timeout value Thread.Sleep(10000); bool isCalibrationOK = myLD.CalIsOK(); if (isCalibrationOK) { Trace.WriteLine("Last calibration status is OK"); } else { Trace.WriteLine("Fail Calibration!!"); } // Check the LeakRate Trace.WriteLine("Read back the LeakRate from the VS Leak Detector"); var leakRate = Convert.ToDouble(myLD.ReadLeakRate().Trim()); Trace.WriteLine(string.Format("NIST LeakRate Measurement = {0}", leakRate)); var storedLeakRate = Convert.ToDouble(myLD.GetExternalLeakValue().Trim()); var leakDelta = leakRate - storedLeakRate;//Math.Abs(storedLeakRate - leakRate); Trace.WriteLine("Difference between measured and stored leak rate = " + leakDelta.ToString()); // Save Result myTestInfo.ResultsParams[2].Result = leakRate.ToString(); double lowerLimit = storedLeakRate - 0.2E-7; double upperLimit = storedLeakRate + 0.2E-7; myTestInfo.ResultsParams[2].SpecMax = Math.Round(upperLimit, 9).ToString(); myTestInfo.ResultsParams[2].SpecMin = Math.Round(lowerLimit, 9).ToString(); myTestInfo.ResultsParams[3].Result = Math.Round(leakDelta, 10).ToString(); if (leakDelta > 0.2E-7) // If more than +-2 division. { // Calibrate fail. // todo: do we need to recalibrate or just proceed. } } // Close all Test Valves InstrumentIO.CloseAllTestValve(mySw); } catch (Exception) { throw; } }
private void DoLeakRateProfilingTest(ref TestInfo myTestInfo, ref UUTData myUUTData, ref CommonData myCommonData) { try { var slope = Convert.ToDouble(myTestInfo.TestParams[1].Value); var refTemp = Convert.ToDouble(myTestInfo.TestParams[2].Value); var loop = Convert.ToInt32(myTestInfo.TestParams[3].Value); var acquireDelay = Convert.ToInt32(myTestInfo.TestParams[4].Value); //var holdDelay = Convert.ToInt32(myTestInfo.TestParams[5].Value); int slot = Convert.ToInt32(myCommonData.Slot); // Step #1: Measure leak rate and calculate normalized leak rate // Close all valves Trace.WriteLine("Verifying test valves are closed..."); InstrumentIO.CloseAllTestValve(mySw); Thread.Sleep(5000); Trace.WriteLine("All valves are closed"); // hold valve Trace.WriteLine("Set VS Leak Detector to HOLD mode"); myLD.Hold(); Thread.Sleep(5000); // Open Test Port Trace.WriteLine(String.Format("Open SLOT#{0} DUT's Test Valve", slot)); InstrumentIO.OpenTestValve(mySw, slot); Thread.Sleep(1000); myLD.Rough(); // rough the LD //Thread.Sleep(holdDelay * 1000); // once LD in FineTest myTestInfo.ResultsParams = new PIResultsArray(); List <PIResult> listOfPIResult = new List <PIResult>(); for (int i = 0; i < loop; i++) { listOfPIResult.Add(new PIResult { Label = string.Format("LeakRate#{0}", i + 1), SpecMin = "1E-7", SpecMax = "2E-7", Nominal = "1.5E-7", Unit = "std cc/sec" }); } for (int i = 0; i < loop; i++) { listOfPIResult.Add(new PIResult { Label = string.Format("Temp#{0}", i + 1), SpecMin = "15", SpecMax = "30", Nominal = "22.5", Unit = "Deg C" }); } myTestInfo.ResultsParams.PIResArray = listOfPIResult.ToArray(); myTestInfo.ResultsParams.NumResultParams = listOfPIResult.Count; // Loop measurement for DUT's Leak Rate var listOfLeakRate = new List <double>(); var listOftemp = new List <double>(); var listOfBoardTemp = new List <double>(); // Configure Thermocouple measurement InstrumentIO.ConfigureThermocouple(mySw); Trace.WriteLine(String.Format("Measuring DUT's Leak Rate and Temperature for {0} times.", loop)); int cnt1 = 0; int cnt2 = 0; for (int i = 1; i <= loop; i++) { // read LeakRate double leakRate = Convert.ToDouble(myLD.ReadLeakRate()); var dutTemp = InstrumentIO.MeasureCalLeakTemp(mySw, slot); var boardTemp = InstrumentIO.MeasureBoardTemperature(mySw, myScope, slot); Trace.WriteLine(string.Format("Leak Rate #{0} = {1}std cc/sec & DUT Temp #{0} = {2} Deg C & Board Temp #{0} = {3} Deg C", i, leakRate, dutTemp, boardTemp)); listOfLeakRate.Add(leakRate); listOftemp.Add(dutTemp); listOfBoardTemp.Add(boardTemp); Thread.Sleep(acquireDelay * 1000); // delay in miliseconds myTestInfo.ResultsParams[i].Result = Math.Round(leakRate, 8).ToString(); myTestInfo.ResultsParams[i + loop].Result = Math.Round(dutTemp, 3).ToString(); } } catch (Exception) { throw; } }
private void DoLeakRateTest(ref TestInfo myTestInfo, ref UUTData myUUTData, ref CommonData myCommonData) { try { var slope = Convert.ToDouble(myTestInfo.TestParams[1].Value); var refTemp = Convert.ToDouble(myTestInfo.TestParams[2].Value); var loop = Convert.ToInt32(myTestInfo.TestParams[3].Value); var acquireDelay = Convert.ToInt32(myTestInfo.TestParams[4].Value); var stabilizeDelay = Convert.ToInt32(myTestInfo.TestParams[5].Value); int slot = Convert.ToInt32(myCommonData.Slot); // Step #1: Measure leak rate and calculate normalized leak rate // Close all valves Trace.WriteLine("Verifying test valves are closed..."); InstrumentIO.CloseAllTestValve(mySw); Thread.Sleep(3000); Trace.WriteLine("All valves are closed"); // hold valve Trace.WriteLine("Set VS Leak Detector to HOLD mode"); myLD.Hold(); Thread.Sleep(3000); // Open Test Port Trace.WriteLine(String.Format("Open SLOT#{0} DUT's Test Valve", slot)); InstrumentIO.OpenTestValve(mySw, slot); Thread.Sleep(2000); myLD.Rough(); string status = ""; bool isMidStage = myLD.WaitForFineTest(ref status); if (!isMidStage) { myTestInfo.ResultsParams[1].Result = status; Trace.WriteLine("Unable to set to MIDSTAGE state."); } bool isReadingStabilized = myLD.WaitForStabilizedReading(ref status); if (!isReadingStabilized) { Trace.WriteLine("Timeout to get stable leak rate reading"); } Thread.Sleep(stabilizeDelay * 1000); // Loop measurement for DUT's Leak Rate var listOfLeakRate = new List <double>(); var listOftemp = new List <double>(); var listOfBoardTemp = new List <double>(); // Configure Thermocouple measurement InstrumentIO.ConfigureThermocouple(mySw); Trace.WriteLine(String.Format("Measuring DUT's Leak Rate and Temperature for {0} times.", loop)); for (int i = 0; i < loop; i++) { // read LeakRate double leakRate = Convert.ToDouble(myLD.ReadLeakRate()); var dutTemp = InstrumentIO.MeasureCalLeakTemp(mySw, slot); var boardTemp = InstrumentIO.MeasureBoardTemperature(mySw, myScope, slot); Trace.WriteLine(string.Format("Leak Rate #{0} = {1}std cc/sec & DUT Temp #{0} = {2} Deg C & Board Temp #{0} = {3} Deg C", i + 1, leakRate, dutTemp, boardTemp)); listOfLeakRate.Add(leakRate); listOftemp.Add(dutTemp); listOfBoardTemp.Add(boardTemp); Thread.Sleep(acquireDelay * 1000); // delay in miliseconds } // calculate normalized leak rate var aveLeakRate = listOfLeakRate.Average(); Trace.WriteLine("Average Leak Rate = " + aveLeakRate.ToString()); var aveTemp = listOftemp.Average(); Trace.WriteLine("Average DUT's Temperature = " + aveTemp.ToString()); var aveBoardTemp = listOfBoardTemp.Average(); Trace.WriteLine("Average Board's Temperature = " + aveBoardTemp.ToString()); Trace.WriteLine(string.Format("Calculating DUT Normalized Leak Rate at {0} Deg Celcius reference temperature", refTemp)); var normLeakRateDouble = TestHelper.CalculateNormLeakRate(slope, refTemp, aveLeakRate, aveTemp); Trace.WriteLine("Normalized Leak Rate = " + normLeakRateDouble.ToString()); // store result var normLeakRate = Math.Round(normLeakRateDouble, 9); Trace.WriteLine("Normalized Leak Rate = " + normLeakRate.ToString()); //myTestInfo.ResultsParams[1].Result = normLeakRate.ToString(); myTestInfo.ResultsParams[1].Result = Math.Round(aveLeakRate, 9).ToString(); // Step #2: Temperature measurement to get Factor (Delta DegC between board and cal leak can's temperature // Get Can's temp //var cansTemp = InstrumentIO.MeasureCalLeakTemp(mySw, slot); Trace.WriteLine("DUT Temperature (Thermocouple) : " + aveTemp.ToString()); myTestInfo.ResultsParams[2].Result = Math.Round(aveTemp, 1).ToString(); // Measure Board Temperature //InstrumentIO.SetupBoardTempMeasRoute(mySw, myScope, slot); // setup route for BoardTemp supply and output 5V and TTL signal output myTestInfo.ResultsParams[3].Result = Math.Round(aveBoardTemp, 1).ToString(); //InstrumentIO.DisconnectTempBoardMeasRoute(mySw, slot); Trace.WriteLine("DUT Temperature (PCB) : " + aveBoardTemp.ToString()); // calc temp difference var deltaTemp = aveBoardTemp - aveTemp; Trace.WriteLine("Temperature Difference : " + deltaTemp.ToString()); // store result myTestInfo.ResultsParams[4].Result = Math.Round(deltaTemp, 1).ToString(); // Close Test Valve InstrumentIO.CloseTestValve(mySw, slot); // Set LeakRate and Factor properties to be used for averaging at the end of the test UUTLeakRate = Math.Round(aveLeakRate, 9);//normLeakRateDouble; UUTTempFactor = deltaTemp; UUTTemp = aveTemp; } catch (Exception) { throw; } }
/// <summary> /// This method is called when the test is completed /// </summary> /// <param name="_uutData"></param> /// <param name="_commonData"></param> public void UserCleanup(ref UUTData _uutData, ref CommonData _commonData) { try { // Disconnect 5V supply and TTL signal from the Sensor Board InstrumentIO.DisconnectTempBoardMeasRoute(mySw, TestPort); InstrumentIO.CloseAllTestValve(mySw); if (myLD != null) { // at the end of the test, vent the Leak Detector //Trace.WriteLine("Vent the Leak Detector"); //myLD.Vent(); Trace.WriteLine("Disconnecting Serial Port Communication...."); myLD.Close(); myLD = null; Trace.WriteLine(" ... disconnected"); } // Destruct the Test Classes myInitStationTest = null; myCalLeakTest = null; mySystemCalTest = null; myButtonUpTest = null; // Check FinalTest outcome, Pass/Fail flag P,F,A,E and the test is in Production Mode if (_commonData.TestOutcome.ToUpper() == "P" && _commonData.isProdMode) { Trace.WriteLine("Submitting Cal-Leak data summary to database..."); string sqlConStr = CalLeakConfigs.Default.SqlConString; myCalLeakData.IsPass = true; // Pass using (SqlConnection conn = new SqlConnection(sqlConStr)) { conn.Open(); var retVal = SqlHelper.SubmitFinalCalLeakData(conn, ref myCalLeakData); Trace.WriteLine("CalLeak Data transfered to database."); // Create certificate history for the unit int id = Convert.ToInt32(retVal); string eqIds = SqlHelper.GetCsvStringEquipmentUsed(conn, 2, 1); // save UUT certificate details SqlHelper.SaveCertDetails(conn, id, eqIds); } Trace.WriteLine("Generating new Serial Number..."); // Autogenerate Serial Number string modelNumber = _uutData.Model; string serialNumber = string.Empty; DateTime todayDate = DateTime.Now; int workWeek = DateTimeHelper.GetIso8601WeekOfYear(todayDate); SernumInfo mySerialNumInfo = new SernumInfo(); mySerialNumInfo.Model = modelNumber; using (SqlConnection conn = new SqlConnection(sqlConStr)) { Trace.WriteLine("Connecting to SQL Database for serial number retrieval"); conn.Open(); Trace.WriteLine("Connection succeeded"); var newSernum = SqlHelper.GetNextRunningNumber(conn, ref mySerialNumInfo); //serialNumber = string.Format("MY{0}{1}{2}", todayDate.ToString("yy"), todayDate.ToString("MM"), newSernum); // commented out due to serial number generation must use YYWW serialNumber = string.Format("MY{0}{1}{2}", todayDate.ToString("yy"), workWeek.ToString("00"), newSernum); Trace.WriteLine("New Serial Number is = " + serialNumber); } Trace.WriteLine("Submitting new serial number to database.."); DateTime date = DateTime.Now; mySerialNumInfo.DummySernum = _uutData.SerNum; mySerialNumInfo.Model = _uutData.Model; mySerialNumInfo.IsPassTest = true; mySerialNumInfo.Sernum = serialNumber; mySerialNumInfo.LogDate = date; mySerialNumInfo.RunningNumber = mySerialNumInfo.RunningNumber;// +1; string conStr = CalLeakConfigs.Default.SqlConString; using (SqlConnection conn = new SqlConnection(conStr)) { conn.Open(); var retVal = SqlHelper.SubmitAutoGeneratedSernum(conn, ref mySerialNumInfo); Trace.WriteLine(retVal.ToString()); } Trace.WriteLine("Done"); } else if (_commonData.isProdMode) { Trace.WriteLine("Submitting Cal-Leak data summary to database..."); string sqlConStr = CalLeakConfigs.Default.SqlConString; myCalLeakData.IsPass = false; // Failed using (SqlConnection conn = new SqlConnection(sqlConStr)) { conn.Open(); var retVal = SqlHelper.SubmitFinalCalLeakData(conn, ref myCalLeakData); Trace.WriteLine("CalLeak Data transfered to database."); } } } catch (Exception) { } finally { _uutData = null; //_commonData = null; // todo: play sound for test completion or tower light } }