public bool TTA_Collect_Data(short [,] data_out, int cycle) { //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++) { data_out[cycle, 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; data_out[cycle, counter] = (short)(helping_Double); } return(true); } catch (DaqException ex) { //Bei Fehler -> Fehlermeldung ausgeben (hier z.B. Timeout) MessageBox.Show(ex.Message); return(false); } finally { // Task beenden myTask_NI.Dispose(); } }
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(); } }
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); }