Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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;
            }
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
        /// <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
            }
        }