Exemple #1
0
        //********************************************************************************************************************
        //                                         Error Check Functions
        //********************************************************************************************************************


        /// <summary>
        /// Retruns Error Code:
        /// 0: OK;
        /// 1: Short;
        /// 2: Open;
        /// 4: Instable;
        /// </summary>
        private UInt16 ErrorCheck_ShortOpen(TTA_measurement myTTA, int MeasCycle)
        {
            long raw_file_mean = 0;
            int  pre_points    = 1001;

            //Mittelwert berechnen (Short und Open)
            for (int j = pre_points; j < myTTA.Binary_Raw_Files.GetLength(1); j++)
            {
                raw_file_mean += +myTTA.Binary_Raw_Files[MeasCycle, j];
            }
            raw_file_mean /= (myTTA.Binary_Raw_Files.GetLength(1) - pre_points);

            //Short (2^15 = 32768 --> mit Puffer)
            if (raw_file_mean < -32000)
            {
                return(1);
            }

            //Open (2^15 = 32768 --> mit Puffer)
            if (raw_file_mean > 32000)
            {
                return(2);
            }

            //Kein Fehler
            return(0);
        }
Exemple #2
0
        //**************************************************************************************************
        //                                            Z_th
        //**************************************************************************************************

        #region Z_th

        private void Button_Zth_signle_Click(object sender, EventArgs e)
        {
            //TTA-Mess-File erzeugen erzeugen
            myTTA = new TTA_measurement()
            {
                MyRack = rthTEC_Rack1,
                MyDAQ  = DAQ_Unit,
                GUI    = this,
            };

            //Plots initisieren
            Graph_new_Measurment_for_TTA(myTTA);

            //Spectrum einstellen
            DAQ_Unit.Setting_for_TTA();
            DAQ_Unit.Setting_Trigger(rthTEC_Rack1);

            //Backroundworker definieren
            myBackroundWorker = new BackgroundWorker()
            {
                WorkerSupportsCancellation = true,
            };

            //Aufgabe definieren
            myBackroundWorker.DoWork += new DoWorkEventHandler((state, args) =>
            {
                bool noError = true;

                //Messen --> aktuell noch DEMO
                if (noError)
                {
                    noError = myTTA.Start_Single_TTA();
                }

                //Daten konvertieren und abarbeiten
                if (noError)
                {
                    noError = myTTA.Convert_Data();
                }

                //Graphen plotten
                if (noError)
                {
                    Add_Series_to_Data(myTTA);
                    Update_Voltage_Plots_for_TTA();
                }

                //UI wieder aktiviern
                Set_Old_Enable_Status();
            }
                                                               );

            //Alle Knöpfe deaktiveren
            Disable_All_Controlls();

            //Backroundworker starten
            myBackroundWorker.RunWorkerAsync();
        }
        public void Add_Series_to_RAW(TTA_measurement myTTA, int Messung)
        {
            //Es dürfen nich alle Pukte übertragen werden (Datenmenge)
            //ungefähr 20Tausend DatenPunkte
            int steps = myTTA.Binary_Raw_Files.GetLength(1) / 20000;

            //Auf 10^x Wert runden
            steps = (int)Math.Pow(10, Math.Round(Math.Log10(steps)));

            //Daten in Passende Liste einfügen
            List <RAW_DataPoint> myRawDataList = new List <RAW_DataPoint>();

            for (int sample = 0; sample < myTTA.Binary_Raw_Files.GetLength(1); sample += steps)
            {
                myRawDataList.Add(
                    new RAW_DataPoint()
                {
                    Value = myTTA.Binary_Raw_Files[Messung, sample],
                    Time  = (decimal)sample / myTTA.MyDAQ.Frequency,
                }
                    );
            }

            //Muss so kompliziert sein, da UI nicht im Thread liegt
            chartControl_RAW.Invoke((MethodInvoker) delegate
            {
                var neueSerie = new Series("Cycle " + (Messung + 1).ToString(), ViewType.Line)
                {
                    CheckableInLegend = true,



                    DataSource         = myRawDataList,
                    ArgumentScaleType  = ScaleType.Numerical,
                    ArgumentDataMember = "Time",
                    ValueScaleType     = ScaleType.Numerical,
                };

                neueSerie.ValueDataMembers.AddRange(new string[] { "Value" });

                chartControl_RAW.Series.Add(neueSerie);

                //Resize x-Achse

                //((LineSeriesView)neueSerie.View).LineMarkerOptions.Kind = MarkerKind.Triangle;
                //((LineSeriesView)neueSerie.View).MarkerVisibility = DevExpress.Utils.DefaultBoolean.True;
            });
        }
Exemple #4
0
        private UInt16 ErrorCheck_Instabil(TTA_measurement myTTA)
        {
            //Wenn nur ein Zyklus, dann kann stabilität nich überprüft werden
            if (myTTA.MyRack.Cycles < 2)
            {
                return(0);
            }

            //Punkte zum definieren
            List <long> Liste_Punkte = new List <long>()
            {
                myTTA.Binary_Raw_Files.GetLength(1) - (myTTA.Binary_Raw_Files.GetLength(1) / 3),    //@ 2/3
                myTTA.Binary_Raw_Files.GetLength(1) - (myTTA.Binary_Raw_Files.GetLength(1) / 5),    //@ 4/5
                myTTA.Binary_Raw_Files.GetLength(1) - 1                                             //@ End
            };


            //Jeden Punkt definieren
            foreach (long point in Liste_Punkte)
            {
                //Feld für Werte erzeugen
                long[] values = new long[myTTA.MyRack.Cycles];

                //Werte herauslösen
                for (int cycle_nr = 0; cycle_nr < myTTA.MyRack.Cycles; cycle_nr++)
                {
                    values[cycle_nr] = myTTA.Binary_Raw_Files[cycle_nr, point];
                }

                //Auf stabilität prüfen (immer mit erstem vergleichen)
                for (int cycle_nr = 1; cycle_nr < myTTA.MyRack.Cycles; cycle_nr++)
                {
                    //Voltage = Bitwert * 2*Range / 2^16 / Gain + Offset
                    long differenc_in_mv = (values[0] - values[cycle_nr]) * Range / 2 / (long)Math.Pow(2, 15);
                    //Wenn untesschied > 5mV
                    if (Math.Abs(differenc_in_mv) > 5)
                    {
                        return(4);
                    }
                }
            }
            //Kein Fehler
            return(0);
        }
        public void Add_Series_to_Data(TTA_measurement myTTA)
        {
            chartControl_DATA_Top.Invoke((MethodInvoker) delegate
            {
                var neueSerie = new Series("LED " + chartControl_DATA_Top.Series.Count.ToString(), ViewType.Line)
                {
                    CheckableInLegend = true,

                    DataSource            = myTTA.Average_Heat_Compressed,
                    ArgumentScaleType     = ScaleType.Numerical,
                    ArgumentDataMember    = "Time",
                    ValueScaleType        = ScaleType.Numerical,
                    CrosshairLabelPattern = "{S} : {V:0.000} V"
                };

                neueSerie.ValueDataMembers.AddRange(new string[] { "Voltage" });

                chartControl_DATA_Top.Series.Add(neueSerie);
            });

            chartControl_DATA_Bottom.Invoke((MethodInvoker) delegate
            {
                var neueSerie = new Series("LED " + chartControl_DATA_Bottom.Series.Count.ToString(), ViewType.Line)
                {
                    CheckableInLegend = true,

                    DataSource            = myTTA.Average_Meas_Compressed,
                    ArgumentScaleType     = ScaleType.Numerical,
                    ArgumentDataMember    = "Time",
                    ValueScaleType        = ScaleType.Numerical,
                    CrosshairLabelPattern = "{S} : {V:0.000} V"
                };

                neueSerie.ValueDataMembers.AddRange(new string[] { "Voltage" });

                chartControl_DATA_Bottom.Series.Add(neueSerie);
            });
        }
        private void Graph_new_Measurment_for_TTA(TTA_measurement myTTA)
        {
            //Abfragen ob Beschriftung vorhanden
            if (chartControl_DATA_Top.Titles.Count == 0)
            {
                //Wenn nicht
                Graph_Init_for_TTA(myTTA);
            }

            //Abfragen ob Beschriftung passten für TTA
            else if (!chartControl_DATA_Top.Titles[0].Text.Contains("Z_th"))
            {
                //Wenn nicht
                Graph_Init_for_TTA(myTTA);
            }

            else
            {
                //Sonst nur RAW leeren
                chartControl_RAW.Series.Clear();

                //Hinzufügen leere unsichbare Serie (damit Achsen angezeigt werden)
                var neueSerie = new Series("Empty", ViewType.Line)
                {
                    LabelsVisibility = DevExpress.Utils.DefaultBoolean.False,
                    ShowInLegend     = false,
                    Visible          = true,
                };
                chartControl_RAW.Series.Add(neueSerie);

                //Zeit neu eistellen
                XYDiagram test = (XYDiagram)chartControl_RAW.Diagram;
                test.AxisX.WholeRange.MaxValue  = (myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Heat) / 1000;         //Zugelassener Bereich
                test.AxisX.VisualRange.MaxValue = (myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Heat) / 1000;         //Sichtbarrer Bereich
            }
        }
Exemple #7
0
        /// <summary>
        /// Retruns true if no error occured while sending the settings
        /// </summary>
        public override bool Measure_TTA_Several_Cycles_DEMO(TTA_measurement myTTA, ATIM_MainWindow GUI)
        {
            //StatusBar anpassen
            GUI.StatusBar_TTA_Single(0, (int)myTTA.MyRack.Cycles);

            //Plot für Single Curves initialsisiern
            //AsyncChart_single_Vf_init();

            //Mögliche Errors mitzählen
            uint error_Sum = 0;

            //1. Parameter für Messlänge senden********************************************************************************

            //Sample Anzahl berechnen (Heizplus + Messpuls + Puffer[alle in ms]) * Frequenz
            long samples = Decimal.ToInt64((myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Meas + 0.5m) / 1000 * Frequency);
            //Sampels nach Trigger berechnen (100µs davor)
            long postTriggerSamples = samples - Decimal.ToInt64(0.0001m * Frequency);

            //error_Sum += Set_Sample_Count(samples);
            //error_Sum += Set_Samples_PostTrigger(postTriggerSamples);


            //2. Feld für die Messdaten generiern******************************************************************************
            //Pointer und Händler für Datenfeld
            IntPtr   daten_Pointer;
            GCHandle hBufferHandle;

            //Zugehöriges Feld in Klasse TTA measurement erzeugen
            myTTA.Creat_RowDataField(samples);

            //Speicherplatz sperren
            hBufferHandle = GCHandle.Alloc(myTTA.Binary_Raw_Files, GCHandleType.Pinned);
            //Pointer für gesperten Speicherplatz suchen
            daten_Pointer = hBufferHandle.AddrOfPinnedObject();


            //Init Stability Check (weiß nicht wozu)
            //double stability_limit = 1; //1%
            //bool[] no_stability = new bool[3];
            //int[,] values_for_stability_check = new int[3, myTTA_Measurement.param.anzahl_Zyklen];

            //3. Messung starten************************************************************************************************
            for (int i = 0; i < myTTA.MyRack.Cycles; i++)
            {
                //Falls über Cancel abgebrochen wurde --> Speicher freigeben

                if (GUI.myBackroundWorker.CancellationPending)
                {
                    hBufferHandle.Free();
                    return(false);
                }


                //error_Sum += WaitTime_for_Trigger_inf();
                //error_Sum += Adopt_Settings();
                //error_Sum += Start_Card();
                //error_Sum += Wait_to_fill_PreTrigger();
                //error_Sum += Enable_Trigger();
                //error_Sum += Force_Trigger_after_time((long)myTTA.MyRack.Time_Heat);

                //Zählvariablen in Button hochzählen
                GUI.StatusBar_TTA_Single(i + 1, (int)myTTA.MyRack.Cycles);

                //System.Threading.Thread.Sleep((int)(myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Meas));
                System.Threading.Thread.Sleep(1000);

                //Stromquelle Pulsen
                //myTTA.MyRack.SinglePuls_withoutDelay();

                //Wurde ein Trigger Event gefunden (wenn nich Rückgabewert ist 263)

                /*if (Did_Trigger_Event_occured() == 263)
                 * {
                 *  //Fehlermeldung
                 *  //SetAsyncText(Spectrum_answer, "Kein Trigger gefunden");
                 *
                 *  error_Sum += 263;
                 *  error_Sum += Force_Trigger();
                 * }*/


                //4. Daten abholen**********************************************************************************************

                //WArten bis alle Daten vorhanden sind (unendlich lang möglich)
                //error_Sum += WaitTime_for_Trigger_inf();
                //error_Sum += Wait_for_all_samples();

                //Datentransfer einstellen (Datapointer enspricht der Stelle des ersten Samples im Array)
                //Bei weiteren Zyklen muss dieser Pointer geändert werden
                //DataPointer is [0,0]
                //anzahl_samples entspricht der Länge einer Zeile
                //2 ist notwendig für short (2byte)
                //i ist die aktuelle Zeile (Zyklus)

                IntPtr aktuellerPointer = new IntPtr(daten_Pointer.ToInt64() + 2 * i * samples);

                Random rnd = new Random();

                //Daten für Demo erzeugen
                int j      = 0;
                int help_t = 0;
                for (; j < 1000; j++)
                {
                    myTTA.Binary_Raw_Files[i, j] = -32767;
                }
                for (; j < samples / 2; j++)
                {
                    help_t++;
                    myTTA.Binary_Raw_Files[i, j] = (short)(10000 + 15000 * Math.Exp(-(double)help_t / 1500000) + rnd.Next(-100, 100));
                }
                help_t = 0;
                for (; j < samples - 1000; j++)
                {
                    help_t++;
                    myTTA.Binary_Raw_Files[i, j] = (short)(-10000 - 15000 * Math.Exp(-(double)help_t / 1500000) + rnd.Next(-100, 100));
                }
                for (; j < samples; j++)
                {
                    myTTA.Binary_Raw_Files[i, j] = -32767;
                }

                //error_Sum += Send_Pointer_of_Array(aktuellerPointer, samples);
                //error_Sum += Get_Data();


                //5. Auf Fehler prüfen*****************************************************************************************

                /*
                 * (Text in Antwortfenster ändern
                 * if (error_Sum == 0) { SetAsyncText(Spectrum_answer, "Measurement correct\r\n"); }
                 * else { SetAsyncText(Spectrum_answer, "Error while measurement\r\n"); }
                 */

                //Gleich in Graph ausgeben
                GUI.Add_Series_to_RAW(myTTA, i);

                //myTTA.ErrorCode = ErrorCheck_ShortOpen(myTTA, i);
                //Wenn Short oder Open --> Abbruch (keine weiteren Zyklen)
                //if (myTTA.ErrorCode != 0)
                //  break;
            }

            //Stabilitäts-Check
            //if (myTTA.ErrorCode == 0)
            //  myTTA.ErrorCode = ErrorCheck_Instabil(myTTA);

            hBufferHandle.Free();


            //Auf Errors checken
            if (error_Sum != 0)
            {
                MessageBox.Show("An Error occured while measurment!\n Error Code: ." + myTTA.ErrorCode.ToString(), "Warning",
                                MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(false);
            }
            else
            {
                return(true);
            }
        }
Exemple #8
0
 public virtual decimal Get_Constant_Voltage(TTA_measurement myTTA, ATIM_MainWindow GUI)
 {
     return(0);
 }
Exemple #9
0
 public virtual bool Measure_TTA_Several_Cycles_DEMO(TTA_measurement myTTA, ATIM_MainWindow GUI)
 {
     return(false);
 }
Exemple #10
0
        public override decimal Get_Constant_Voltage(TTA_measurement myTTA, ATIM_MainWindow GUI)
        {
            //Konstante Spannung über mehrere Samples messen



            //1. Daten-Felder definieren***************************************************************************************

            //Übergabe-Parameter für NI-Karte definieren
            IAsyncResult uebergabe_parameter_ReadWaveform_Constant = null;

            //Ausgangsdaten
            AnalogSingleChannelReader messInfo_NI_SinglePulse_Constant = null;

            // Task für Messung erzeugen
            NationalInstruments.DAQmx.Task myTask_NI_Constant = null;


            //2. NI-Karte scharf stellen***********************************************************************************
            try
            {
                myTask_NI_Constant = new NationalInstruments.DAQmx.Task("myTask_Constant");

                // Kanal erzeugen:
                //---------------------------------------------------------------------------------
                //physicalChannelName As String: z.B. Dev1/ai3
                //nameToAssignChannel As String: sollte leer bleiben (Zweck keine Ahnung)
                //terminalConfiguration As AITerminalConfiguration: Differential oder ähnlich
                //minimumValue As Double: z.B. -10 [V] untere Grenze
                //maximumValue As Double: z.B. 10 [V]
                //customScaleName As String:
                //---------------------------------------------------------------------------------
                myTask_NI_Constant.AIChannels.CreateVoltageChannel(VISA_or_Channel_Name, "",
                                                                   AITerminalConfiguration.Differential, -Range / 1000, Range / 1000, AIVoltageUnits.Volts);


                // Timing-Parameter definieren:
                //---------------------------------------------------------------------------------
                //signalSource As string: Wenn interne Clock verwendet wird ""
                //rate As double: Abtastfrequenz in Hz (Interne Clock)
                //activeEdge As SampleClockActiveEdge: Bei welcher Flanke der Clock abgetastet wird
                //sampleMode As SampleQuantityMode: Legt fest ob dauerhaft gemessen wird, oder bis
                //                                  nur eine endliche Anzahl (nächster Parameter)
                //samplesPerChannel As int: Anzahl der Samples
                //---------------------------------------------------------------------------------
                myTask_NI_Constant.Timing.ConfigureSampleClock("", Frequency, SampleClockActiveEdge.Rising,
                                                               SampleQuantityMode.FiniteSamples, (int)Frequency / 1000);


                // Trigger definieren
                //---------------------------------------------------------------------------------
                //Kein Trigger definieren --> Sofort starten
                //---------------------------------------------------------------------------------
                myTask_NI_Constant.Triggers.StartTrigger.ConfigureNone();

                //TimeOut anpassen
                myTask_NI_Constant.Stream.Timeout = 2000;

                // Verify the Task
                myTask_NI_Constant.Control(TaskAction.Verify);

                //Messwert-Ausgabe definieren
                messInfo_NI_SinglePulse_Constant = new AnalogSingleChannelReader(myTask_NI_Constant.Stream);

                // Use SynchronizeCallbacks to specify that the object
                // marshals callbacks across threads appropriately.
                messInfo_NI_SinglePulse_Constant.SynchronizeCallbacks = true;
                uebergabe_parameter_ReadWaveform_Constant             = messInfo_NI_SinglePulse_Constant.BeginReadWaveform((int)Frequency / 1000, null, null);
            }
            catch (DaqException ex)
            {
                //Bei Daq Exception soll die Fehlermeldung ausgegeben werden (z.B. kein Kanal, ...)
                MessageBox.Show(ex.Message);
                //Task beenden
                myTask_NI_Constant.Dispose();

                return(0);
            }


            //6. Daten auswerten*******************************************************************************************
            try
            {
                // vorhandene Daten auslesen
                AnalogWaveformSampleCollection <double> test = messInfo_NI_SinglePulse_Constant.EndReadWaveform(uebergabe_parameter_ReadWaveform_Constant).Samples;

                //Durchschnitt berechnen
                double average = 0;
                for (int counter = 0; counter < test.Count; counter++)
                {
                    average += test[counter].Value;
                }

                return((decimal)average / test.Count / myTTA.MyRack.Gain + myTTA.MyRack.U_offset / 1000);
            }
            catch (DaqException ex)
            {
                //Bei Fehler -> Fehlermeldung ausgeben (hier z.B. Timeout)
                MessageBox.Show(ex.Message);

                return(0);
            }
            finally
            {
                // Task beenden
                myTask_NI_Constant.Dispose();
            }
        }
Exemple #11
0
 public override bool Measure_TTA_Several_Cycles_DEMO(TTA_measurement myTTA, ATIM_MainWindow GUI)
 {
     return(true);
 }
Exemple #12
0
        public override bool Measure_TTA_Several_Cycles(TTA_measurement myTTA, ATIM_MainWindow GUI)
        {
            //StatusBar anpassen
            GUI.StatusBar_TTA_Single(0, (int)myTTA.MyRack.Cycles);

            //1. Parameter für Messlänge senden********************************************************************************
            //Sampelzahl und Abtastfrequenz definieren (Times sind in ms deswegen /1000)
            int anzahl_samples = Convert.ToInt32(Frequency) / 1000
                                 * Decimal.ToInt32(myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Meas);
            //Sample überschuss, da Umschalten derzeit nicht richtig
            int sample_ueberschuss = 2000;

            //Trigger berechnen
            double trigger = decimal.ToDouble((numericUpDown_Trigger.Value - myTTA.MyRack.U_offset / 1000) * myTTA.MyRack.Gain);

            //2. Daten-Felder definieren***************************************************************************************

            //Übergabe-Parameter für NI-Karte definieren
            IAsyncResult uebergabe_parameter_ReadWaveform = null;

            //Ausgangsdaten
            AnalogSingleChannelReader messInfo_NI_SinglePulse = null;

            //Feld für Daten definieren (mit 100x max- beginnen)
            myTTA.Creat_RowDataField(100 + anzahl_samples + sample_ueberschuss);


            //3. Loop**********************************************************************************************************
            for (int i = 0; i < myTTA.MyRack.Cycles; i++)
            {
                //4. NI-Karte scharf stellen***********************************************************************************
                try
                {
                    // Task für Messung erzeugen
                    myTask_NI = new NationalInstruments.DAQmx.Task("myTask");


                    // Kanal erzeugen:
                    //---------------------------------------------------------------------------------
                    //physicalChannelName As String: z.B. Dev1/ai3
                    //nameToAssignChannel As String: sollte leer bleiben (Zweck keine Ahnung)
                    //terminalConfiguration As AITerminalConfiguration: Differential oder ähnlich
                    //minimumValue As Double: z.B. -10 [V] untere Grenze
                    //maximumValue As Double: z.B. 10 [V]
                    //customScaleName As String:
                    //---------------------------------------------------------------------------------
                    myTask_NI.AIChannels.CreateVoltageChannel(VISA_or_Channel_Name, "",
                                                              AITerminalConfiguration.Differential, -Range / 1000, Range / 1000, AIVoltageUnits.Volts);


                    // Timing-Parameter definieren:
                    //---------------------------------------------------------------------------------
                    //signalSource As string: Wenn interne Clock verwendet wird ""
                    //rate As double: Abtastfrequenz in Hz (Interne Clock)
                    //activeEdge As SampleClockActiveEdge: Bei welcher Flanke der Clock abgetastet wird
                    //sampleMode As SampleQuantityMode: Legt fest ob dauerhaft gemessen wird, oder bis
                    //                                  nur eine endliche Anzahl (nächster Parameter)
                    //samplesPerChannel As int: Anzahl der Samples
                    //---------------------------------------------------------------------------------
                    myTask_NI.Timing.ConfigureSampleClock("", Frequency, SampleClockActiveEdge.Rising,
                                                          SampleQuantityMode.FiniteSamples, anzahl_samples + sample_ueberschuss);


                    // Trigger definieren
                    //---------------------------------------------------------------------------------
                    //source As String: Herkuft des Triggers. Hier gleich wie Daten (Dev1/ai3)
                    //slope As AnalogEdgeStartTriggerSlope: Rising or Falling
                    //level As Double: Trigger Level (vorher bestimmt
                    //---------------------------------------------------------------------------------
                    myTask_NI.Triggers.StartTrigger.ConfigureAnalogEdgeTrigger(VISA_or_Channel_Name,
                                                                               AnalogEdgeStartTriggerSlope.Rising, trigger);


                    //Hysterese festlegen (keine Ahnung ob das Wichtig ist)
                    //---------------------------------------------------------------------------------
                    //Hysteresis as Double: Wert der Hysterese
                    //---------------------------------------------------------------------------------
                    myTask_NI.Triggers.StartTrigger.AnalogEdge.Hysteresis = 0.05;

                    //TimeOut anpassen
                    myTask_NI.Stream.Timeout = (Int32)(1.2m * (myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Meas));

                    // Verify the Task
                    myTask_NI.Control(TaskAction.Verify);

                    //Messwert-Ausgabe definieren
                    messInfo_NI_SinglePulse = new AnalogSingleChannelReader(myTask_NI.Stream);

                    // Use SynchronizeCallbacks to specify that the object
                    // marshals callbacks across threads appropriately.
                    messInfo_NI_SinglePulse.SynchronizeCallbacks = true;
                    uebergabe_parameter_ReadWaveform             = messInfo_NI_SinglePulse.BeginReadWaveform(anzahl_samples + sample_ueberschuss, null, null);
                }
                catch (DaqException ex)
                {
                    //Bei Daq Exception soll die Fehlermeldung ausgegeben werden (z.B. kein Kanal, ...)
                    MessageBox.Show(ex.Message);
                    //Task beenden
                    myTask_NI.Dispose();
                }

                //5. Puls starten**********************************************************************************************
                System.Threading.Thread.Sleep(300);
                myTTA.MyRack.SinglePuls_withDelay();
                System.Threading.Thread.Sleep(1000);

                //6. Daten auswerten*******************************************************************************************
                try
                {
                    // vorhandene Daten auslesen
                    AnalogWaveformSampleCollection <double> test = messInfo_NI_SinglePulse.EndReadWaveform(uebergabe_parameter_ReadWaveform).Samples;


                    double factor = Math.Pow(2, 15) / (Range / 1000);
                    //Mit 100mal Minimalwert beginnen. (Für umschaltpunkt suche)
                    for (int counter = 0; counter < 100; counter++)
                    {
                        myTTA.Binary_Raw_Files[i, counter] = short.MinValue;
                    }
                    //Daten in Binär (short umrechnen) & TTA übergeben
                    for (int counter = 100; counter < test.Count; counter++)
                    {
                        double helping_Double = test[counter].Value * factor;
                        myTTA.Binary_Raw_Files[i, counter] = (short)(helping_Double);
                    }

                    //Gleich in Graph ausgeben
                    GUI.Add_Series_to_RAW(myTTA, i);
                }
                catch (DaqException ex)
                {
                    //Bei Fehler -> Fehlermeldung ausgeben (hier z.B. Timeout)
                    MessageBox.Show(ex.Message);

                    return(false);
                }
                finally
                {
                    // Task beenden
                    myTask_NI.Dispose();
                }

                //7. StatusBar anpassen****************************************************************************************
                GUI.StatusBar_TTA_Single(i + 1, (int)myTTA.MyRack.Cycles);
            }
            return(true);
        }
        private void Graph_Init_for_TTA(TTA_measurement myTTA)
        {
            //Zwischenspeicher umschreiben
            akt_Graph_Setup = "TTA";

            //Größe der Überschriften
            Font myFont_Headline = new Font("Tahoma", 12, FontStyle.Bold);
            Font myFont_Axis     = new Font("Tahoma", 10);

            DevExpress.XtraCharts.ChartTitle myChartTitle;

            //Ober Graph für RAW............................................................................
            chartControl_RAW.Series.Clear();

            myChartTitle = new DevExpress.XtraCharts.ChartTitle()
            {
                Text = "Raw Values DAC",
                Font = myFont_Headline,
                Dock = DevExpress.XtraCharts.ChartTitleDockStyle.Top,
            };

            chartControl_RAW.Titles.Clear();
            chartControl_RAW.Titles.Add(myChartTitle);

            //Diagramm erzeugen (Muss wegen laufzeit in Begin Init und EndInit)
            XYDiagram xyDigaram_RAW;

            ((System.ComponentModel.ISupportInitialize)(this.chartControl_RAW)).BeginInit();
            xyDigaram_RAW            = new XYDiagram();
            chartControl_RAW.Diagram = xyDigaram_RAW;


            //Achsen-Titel setzen
            xyDigaram_RAW.AxisX.Title.Text       = "Time in [s]";
            xyDigaram_RAW.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDigaram_RAW.AxisX.Title.Font       = myFont_Axis;
            xyDigaram_RAW.AxisY.Title.Text       = "Bit-Value";
            xyDigaram_RAW.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDigaram_RAW.AxisY.Title.Font       = myFont_Axis;

            //Min-Max - Achse
            decimal zeit_max = (myTTA.MyRack.Time_Heat + myTTA.MyRack.Time_Meas) / 1000;

            xyDigaram_RAW.AxisX.VisibleInPanesSerializable   = "-1";
            xyDigaram_RAW.AxisX.VisualRange.Auto             = false;
            xyDigaram_RAW.AxisX.WholeRange.MaxValue          = zeit_max * 2; //Zugelassener Bereich
            xyDigaram_RAW.AxisX.WholeRange.MinValue          = 0;
            xyDigaram_RAW.AxisX.VisualRange.MaxValue         = zeit_max;     //Sichtbarrer Bereich
            xyDigaram_RAW.AxisX.VisualRange.MinValue         = 0;
            xyDigaram_RAW.AxisX.VisualRange.SideMarginsValue = 0;            //Überstand Links und rechts


            xyDigaram_RAW.AxisY.VisibleInPanesSerializable      = "-1";
            xyDigaram_RAW.AxisY.VisualRange.Auto                = false;
            xyDigaram_RAW.AxisY.WholeRange.MaxValue             = 32768;
            xyDigaram_RAW.AxisY.WholeRange.MinValue             = -32768;
            xyDigaram_RAW.AxisY.VisualRange.MaxValue            = 32768; //Sichtbarrer Bereich
            xyDigaram_RAW.AxisY.VisualRange.MinValue            = -32768;
            xyDigaram_RAW.AxisY.NumericScaleOptions.AutoGrid    = false;
            xyDigaram_RAW.AxisY.NumericScaleOptions.GridSpacing = 16384;
            xyDigaram_RAW.AxisY.Interlaced = true;
            xyDigaram_RAW.AxisY.VisualRange.SideMarginsValue = 1;     //Überstand Links und rechts

            ((System.ComponentModel.ISupportInitialize)(this.chartControl_RAW)).EndInit();

            //Label & Legend
            chartControl_RAW.CrosshairOptions.GroupHeaderPattern = "{A} sec";
            chartControl_RAW.CrosshairOptions.HighlightPoints    = false;

            chartControl_RAW.Legend.MarkerMode = LegendMarkerMode.CheckBox;

            //Hinzufügen leere unsichbare Serie (damit Achsen angezeigt werden)
            var neueSerie = new Series("Empty", ViewType.Line)
            {
                LabelsVisibility = DevExpress.Utils.DefaultBoolean.False,
                ShowInLegend     = false,
                Visible          = true,
            };

            chartControl_RAW.Series.Add(neueSerie);


            //Ober Graph für RAW................................................................................
            chartControl_DATA_Top.Series.Clear();

            myChartTitle = new DevExpress.XtraCharts.ChartTitle()
            {
                Text = "Z_th curve for heating",
                Font = myFont_Headline,
                Dock = DevExpress.XtraCharts.ChartTitleDockStyle.Top
            };

            chartControl_DATA_Top.Titles.Clear();
            chartControl_DATA_Top.Titles.Add(myChartTitle);

            //Diagramm erzeugen (Muss wegen laufzeit in Begin Init und EndInit)
            XYDiagram xyDiagram_DATA_Top;

            ((System.ComponentModel.ISupportInitialize)(this.chartControl_DATA_Top)).BeginInit();
            xyDiagram_DATA_Top            = new XYDiagram();
            chartControl_DATA_Top.Diagram = xyDiagram_DATA_Top;


            //Achsen-Titel setzen
            xyDiagram_DATA_Top.AxisX.Title.Text       = "Time in [s]";
            xyDiagram_DATA_Top.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDiagram_DATA_Top.AxisX.Title.Font       = myFont_Axis;
            xyDiagram_DATA_Top.AxisY.Title.Text       = "Voltage [V]";
            xyDiagram_DATA_Top.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDiagram_DATA_Top.AxisY.Title.Font       = myFont_Axis;

            //Min-Max - Achse
            xyDiagram_DATA_Top.AxisX.VisibleInPanesSerializable   = "-1";
            xyDiagram_DATA_Top.AxisX.VisualRange.Auto             = false;
            xyDiagram_DATA_Top.AxisX.WholeRange.MaxValue          = myTTA.MyRack.Time_Heat / 1000;   //Zugelassener Bereich
            xyDiagram_DATA_Top.AxisX.WholeRange.MinValue          = 1m / myTTA.MyDAQ.Frequency;
            xyDiagram_DATA_Top.AxisX.VisualRange.MaxValue         = myTTA.MyRack.Time_Heat / 1000;   //Sichtbarrer Bereich
            xyDiagram_DATA_Top.AxisX.VisualRange.MinValue         = 1m / myTTA.MyDAQ.Frequency;
            xyDiagram_DATA_Top.AxisX.VisualRange.SideMarginsValue = 0;                               //Überstand Links und rechts
            xyDiagram_DATA_Top.AxisX.Logarithmic = true;


            xyDiagram_DATA_Top.AxisY.VisibleInPanesSerializable      = "-1";
            xyDiagram_DATA_Top.AxisY.VisualRange.Auto                = false;
            xyDiagram_DATA_Top.AxisY.WholeRange.MaxValue             = 10;
            xyDiagram_DATA_Top.AxisY.WholeRange.MinValue             = 0;
            xyDiagram_DATA_Top.AxisY.VisualRange.MaxValue            = 10; //Sichtbarrer Bereich
            xyDiagram_DATA_Top.AxisY.VisualRange.MinValue            = 0;
            xyDiagram_DATA_Top.AxisY.NumericScaleOptions.GridSpacing = 1;
            xyDiagram_DATA_Top.AxisY.VisualRange.SideMarginsValue    = 0;  //Überstand Links und rechts

            ((System.ComponentModel.ISupportInitialize)(this.chartControl_DATA_Top)).EndInit();

            //Label & Legend
            chartControl_DATA_Top.CrosshairOptions.GroupHeaderPattern = "{A} sec";
            chartControl_DATA_Top.CrosshairOptions.HighlightPoints    = false;

            chartControl_DATA_Top.Legend.MarkerMode = LegendMarkerMode.CheckBox;

            //Hinzufügen leere unsichbare Serie (damit Achsen angezeigt werden)
            neueSerie = new Series("Empty", ViewType.Line)
            {
                LabelsVisibility = DevExpress.Utils.DefaultBoolean.False,
                ShowInLegend     = false,
                Visible          = true,
            };
            chartControl_DATA_Top.Series.Add(neueSerie);


            //Ober Graph für RAW...................................................................................
            chartControl_DATA_Bottom.Series.Clear();

            myChartTitle = new DevExpress.XtraCharts.ChartTitle()
            {
                Text = "Z_th curve for cooling",
                Font = myFont_Headline,
                Dock = DevExpress.XtraCharts.ChartTitleDockStyle.Top
            };

            chartControl_DATA_Bottom.Titles.Clear();
            chartControl_DATA_Bottom.Titles.Add(myChartTitle);

            //Diagramm erzeugen (Muss wegen laufzeit in Begin Init und EndInit)
            XYDiagram xyDiagram_DATA_Bottom;

            ((System.ComponentModel.ISupportInitialize)(this.chartControl_DATA_Bottom)).BeginInit();
            xyDiagram_DATA_Bottom            = new XYDiagram();
            chartControl_DATA_Bottom.Diagram = xyDiagram_DATA_Bottom;


            //Achsen-Titel setzen
            xyDiagram_DATA_Bottom.AxisX.Title.Text       = "Time in [s]";
            xyDiagram_DATA_Bottom.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDiagram_DATA_Bottom.AxisX.Title.Font       = myFont_Axis;
            xyDiagram_DATA_Bottom.AxisY.Title.Text       = "Voltage [V]";
            xyDiagram_DATA_Bottom.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDiagram_DATA_Bottom.AxisY.Title.Font       = myFont_Axis;

            //Min-Max - Achse
            xyDiagram_DATA_Bottom.AxisX.VisibleInPanesSerializable   = "-1";
            xyDiagram_DATA_Bottom.AxisX.VisualRange.Auto             = false;
            xyDiagram_DATA_Bottom.AxisX.WholeRange.MaxValue          = myTTA.MyRack.Time_Heat / 1000;   //Zugelassener Bereich
            xyDiagram_DATA_Bottom.AxisX.WholeRange.MinValue          = 1m / myTTA.MyDAQ.Frequency;
            xyDiagram_DATA_Bottom.AxisX.VisualRange.MaxValue         = myTTA.MyRack.Time_Heat / 1000;   //Sichtbarrer Bereich
            xyDiagram_DATA_Bottom.AxisX.VisualRange.MinValue         = 1m / myTTA.MyDAQ.Frequency;
            xyDiagram_DATA_Bottom.AxisX.VisualRange.SideMarginsValue = 0;                               //Überstand Links und rechts
            xyDiagram_DATA_Bottom.AxisX.Logarithmic = true;


            xyDiagram_DATA_Bottom.AxisY.VisibleInPanesSerializable      = "-1";
            xyDiagram_DATA_Bottom.AxisY.VisualRange.Auto                = true;
            xyDiagram_DATA_Bottom.AxisY.WholeRange.MaxValue             = 10;
            xyDiagram_DATA_Bottom.AxisY.WholeRange.MinValue             = 0;
            xyDiagram_DATA_Bottom.AxisY.VisualRange.MaxValue            = 10; //Sichtbarrer Bereich
            xyDiagram_DATA_Bottom.AxisY.VisualRange.MinValue            = 0;
            xyDiagram_DATA_Bottom.AxisY.NumericScaleOptions.GridSpacing = 1;
            xyDiagram_DATA_Bottom.AxisY.VisualRange.SideMarginsValue    = 0;  //Überstand Links und rechts

            ((System.ComponentModel.ISupportInitialize)(this.chartControl_DATA_Bottom)).EndInit();

            //Label & Legend
            chartControl_DATA_Bottom.CrosshairOptions.GroupHeaderPattern = "{A} sec";
            chartControl_DATA_Bottom.CrosshairOptions.HighlightPoints    = false;

            chartControl_DATA_Bottom.Legend.MarkerMode = LegendMarkerMode.CheckBox;

            //Hinzufügen leere unsichbare Serie (damit Achsen angezeigt werden)
            neueSerie = new Series("Empty", ViewType.Line)
            {
                LabelsVisibility = DevExpress.Utils.DefaultBoolean.False,
                ShowInLegend     = false,
                Visible          = true,
            };
            chartControl_DATA_Bottom.Series.Add(neueSerie);
        }
Exemple #14
0
        private void Button_Auto_Zth_Click(object sender, EventArgs e)
        {
            //Abfrage ob alle nötigen Geräte angeschlossen (BSP alt)

            /*
             * if (!Is_Spectrum_Activ()    ) { return; }
             * if (!Is_Heller_Activ()      ) { return; }
             * if (!Is_Power_Supply_Activ()) { return; }
             * if (!Is_XYZ_Aktive()        ) { return; }
             * if (!Is_Directory_Correct() ) { return; }
             * if (!Is_FileName_Correct()  ) { return; }
             * if (!Is_Gerber_Correct()    ) { return; }
             */


            //TTA-Mess-File erzeugen erzeugen
            TTA_measurement myTTA = new TTA_measurement()
            {
                MyRack             = rthTEC_Rack1,
                MyDAQ              = DAQ_Unit,
                MyXYZ              = myXYZ,
                Output_File_Folder = myFileSetting.readBox_FileFolder1.MyPath,
                Output_File_Name   = myFileSetting.readBox_FileFolder1.MyFileName,
                GUI        = this,
                MyMovement = myFileSetting.readBox_Movement1.Movements_XYA
            };

            //Plots initisieren
            Graph_new_Measurment_for_TTA(myTTA);

            //Spectrum einstellen
            DAQ_Unit.Setting_for_TTA();
            DAQ_Unit.Setting_Trigger(rthTEC_Rack1);

            //Backroundworker definieren
            myBackroundWorker = new BackgroundWorker()
            {
                WorkerSupportsCancellation = true,
            };

            //Aufgabe definieren
            myBackroundWorker.DoWork += new DoWorkEventHandler((state, args) =>
            {
                //Messung für alle starten


                //spectrum1.Measure_TTA_Several_Cycles_DEMO(myTTA, this);
                DAQ_Unit.Measure_TTA_Several_Cycles(myTTA, this);

                //Daten konvertieren und abarbeiten
                myTTA.Convert_Data();

                //Graphen plotten
                Add_Series_to_Data(myTTA);
                Update_Voltage_Plots_for_TTA();

                //UI wieder aktiviern
                Set_Old_Enable_Status();
            }
                                                               );

            //Alle Knöpfe deaktiveren
            Disable_All_Controlls();

            //Backroundworker starten
            myBackroundWorker.RunWorkerAsync();
        }