/// <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); } }
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); }