Button Abfagen (Funktionen)



  • dirk61 schrieb:

    🙂 jetzt verstehe ich dich hehe... es ist schon richtig was du sagst ich hab strom gleich spannung gesetzt weill das Programm erst mal nur zum Arbeiten und zum testen ist. Wenn ich alles in die reihe bekomme dann wird es auch eine umrechnung geben. Die funktion für den Strom was du beschrieben hast haben wir bei unserer Messkarte nicht, das Umrechen ist ja auch nicht die welt wenn man einen shunt mit 1 ohm hat 🙂

    Solchen fachliche Blödsinn sollte man auch nicht zu Testzwecken machen. Bei umfangreicheren Programmen übersieht man das mal ganz leicht, vergisst es womöglich noch und wenn man ein streng objektorientiertes Programm hat, entstehen durch die Aufrufreihenfolge des Frameworks teilweise Seiteneffekte, die man nicht auf den ersten Blick sieht. Die Umrechnung scheint auf den ersten Blick einfach, betrachtet man jedoch Temperaturabhängigkeiten, so wird das wieder komplizierter (meine Messkarte rechnet das über auf dem Board befindliche PTC-NTC-Bauteile raus).

    dirk61 schrieb:

    Zu Punkt 2. muss ich sagen das wir nur "singel endet" haben.

    Könntest du den nicht die 4 punkte in den Quell Code einarbeiten, denn für dich ist das so leicht da hin gechrieben, bist denke mal auch vom Beruf Programmierer
    mit meinen Kenntnise ist man froh das man überhaupt werte einlesen kann....

    Kleiner Tipp für single endet: schau dort mal in der Beschreibung wie das mit der Masse gemacht werden muss. Ansonsten hat bei solchen floating signals immer das Problem, dass sich die ADU erst einschwingen muss und man erst nach dem 3. oder 4. Abtastvorgang den richtigen Wert ermittelt hat.
    Aber warum soll ich deine Arbeit machen? Du willst doch was lernen? Ich hab auch so angefangen, bin nämlich kein Berufsprogrammierer, sondern mach das nebenbei und habs mir auch alles selbsr erarbeitet. Dieses Forum hier war und ist da immer eine gute Hilfe (muss an dieses Stelle mal gesagt werden). Außerdem ist eine Implementierung mit Threads mal eben nicht so gemacht. Weiterhin muss man da das gesamte Projekt kennen, da der Einfluss mehrerer Threads sich ja auf das gesamte Programm überstreckt und man auch gewisse Synchronisationsmechanismen beim Variablenzugriff braucht. Weiterhin steht immer noch die Frage, ob du überhaupt einen Thread brauchst. Wenn du nur alles paar Sekunden eine Aktualisierung benötigst und es auch nicht so auf die exakten Zeitabstände zwischen zwei Abtastungen ankommt, so würde ich dir eh was mit Timern empfehlen.

    dirk61 schrieb:

    Noch mal zu deinem Punkt 1. Ich Initalisiere doch die Karte nur einmal mit der me4000config Funktion. Wie sollte ich es den sonst machen??

    Nein, machst du eben nicht. Das geschieht mit jedem Buttonklick (Zeile 24):

    void CKarte_2303Dlg::OnButton1() 
    { 
    int LoadME4000DLL(); 
    UpdateData (TRUE); 
    //------------------------ 
    unsigned char uc_chan_list[2]; 
    
    for(unsigned int index_channel = 0; index_channel < 2; index_channel++) 
    { 
    me4000AIMakeChannelListEntry( index_channel, // uiChannelNumber, 
    ME4000_AI_RANGE_BIPOLAR_10, // iRange 
    &uc_chan_list[index_channel]);// pucChanListEntry 
    } 
    
    //------------------------- 
    unsigned long ul_scan_ticks_low; 
    unsigned long ul_scan_ticks_high; 
    
    me4000FrequencyToTicks( 100.0, // dRequiredFreq, 
    &ul_scan_ticks_low, // pulTicksLowPart, 
    &ul_scan_ticks_high, // pulTicksHighPart, 
    ME4000_POINTER_NOT_USED ); // pdAchievedFreq); 
    //------------------------- 
    me4000AIConfig( 0, // uiBoardNumber 
    uc_chan_list, // pucChanList 
    2, // uiChanListCount oder 1?(4) 
    ME4000_AI_INPUT_SINGLE_ENDED, // iSDMode 
    ME4000_AI_SIMULTANEOUS_DISABLE, // iSimultaneous, 
    ME4000_VALUE_NOT_USED, // ulReserved, 
    0, // ulChanTicks - 0 --> use minimum value 
    ul_scan_ticks_low, // ulScanTicksLow, 
    ul_scan_ticks_high, // ulScanTicksHigh, 
    ME4000_AI_ACQ_MODE_SOFTWARE, // iAcqMode, 
    ME4000_VALUE_NOT_USED, // iExtTriggerMode, 
    ME4000_VALUE_NOT_USED ); // iExtTriggerEdge); 
    //------------------------- 
    me4000AIContinuous( 0, // uiBoardNumber, 
    ME4000_POINTER_NOT_USED, // pCallbackProc - not used here 
    ME4000_POINTER_NOT_USED, // pCallbackContext - not required 
    5,//ME4000_VALUE_NOT_USED, // uiRefreshFrequency - 5 channel lists (frames) 
    ME4000_VALUE_NOT_USED ); // ulTimeOutSeconds - not required 
    
    //------------------------- 
    // Allocate a buffer for the results. 
    // At 10 Hz, if we collect the data every two seconds we expect 20 channel lists (frames) 
    // We allocate a buffer large enough for 100 
    
    short* p_s_buffer = new short[100 * 2]; 
    short* p_s_channel[2]; 
    
    for(index_channel = 0; index_channel < 2; index_channel++) 
    { 
    p_s_channel[index_channel] = new short[100];} 
    
    //------------------------- 
    me4000AIStart(0); 
    //------------------------- 
    
    unsigned long ul_data_read; 
    int i_last_error; 
    
    me4000AIGetNewValues( 0, // uiBoardNumber, 
    p_s_buffer, // psBuffer, 
    100, // ulNumberOfValuesToRead - maximum 
    ME4000_AI_GET_NEW_VALUES_NON_BLOCKING, // iExecutionMode - Non blocking --> return immediately with available data 
    &ul_data_read, // pulNumberOfValuesRead, 
    &i_last_error ); // piLastError); 
    
    // Extract the data for the separate channels from our data buffer 
    for(index_channel = 0; index_channel < 2; index_channel++) 
    { 
    unsigned long ul_num_data_extracted; 
    
    me4000AIExtractValues( index_channel, // uiChannelNumber, 
    p_s_buffer, // psAIBuffer, 
    ul_data_read, // ulAIDataCount 
    uc_chan_list, // pucChanList 
    2, // uiChanListCount(4) 
    p_s_channel[index_channel], // psChanBuffer, 
    100, // ulChanBufferSizeValues, 
    &ul_num_data_extracted ); // pulChanDataCount) 
    } 
    
    // Display the digital data and the corresponding voltage on the screen 
    // Use me4000AIDigitToVolt to convert the digital value to a voltage 
    
    for(unsigned int index_data = 0; index_data < ul_data_read / 2; index_data++) 
    { 
    double d_volt[2]; 
    
    for(index_channel = 0; index_channel < 2; index_channel++) 
    { 
    me4000AIDigitToVolt(p_s_channel[index_channel][index_data], // sDigit, 
    ME4000_AI_RANGE_BIPOLAR_10, // iRange, 
    &d_volt[index_channel] ); // pdVolt); 
    
    } 
    
    UpdateData (FALSE); 
    m_spannung =(d_volt[0]); 
    m_strom =d_volt[1]; 
    } 
    }
    

    Und jetzt nochmal die Aussage aus deinem ersten Beitrag:

    dirk61 schrieb:

    Wie muss ich den Butto einstellen damit er das selbst macht?

    Dein Programm arbeitet ereignisgesteuert. Wenn du in der OnButton-Methode (so machst du des ja gerade) sehr rechenzeitintensive Sachen reinpackst, dann wird deine GUI unbedienbar, da innerhalb einer OnButton-Methode nicht auf Ereignisse in der Message-Loop reagiert werden kann. Wenn du endlos Werte auslesen willst, geht das so nicht.
    Ich würde in der OnButton einen Timer oder Thread starten. Diese Funktionen kehren ja wieder zurück, du kannst die OnButton verlassen und dein Programm kann wieder auf Nachrichten reagieren. Dann brauchst du nur noch eine Möglichkeit, den Timer oder Thread wieder zu beenden, wenn du aufhören willst mkt messen (also spätestens bei Programmende).
    Aber wenn du Fragen hast dann frage. Eine Komplettlösung wirst du hier nicht bekommen.



  • Eine komplettlösung war nicht mein absicht nur halt die Infos wo ich was verändern muss und wie halt. Aber danke für deine Infos.



  • dirk61 schrieb:

    Könntest du den nicht die 4 punkte in den Quell Code einarbeiten, denn für dich ist das so leicht da hin gechrieben, bist denke mal auch vom Beruf Programmierer

    Das wäre aber einer Komplettlösung nahe gekommen. Außerdem hab ich ja keinen Quellcode, du hast ja nur die OnButton gepostet.
    Wie oft willst du denn den Wert auslesen bzw. aktualisiert angezeigt bekommen?



  • AndyDD schrieb:

    dirk61 schrieb:

    Könntest du den nicht die 4 punkte in den Quell Code einarbeiten, denn für dich ist das so leicht da hin gechrieben, bist denke mal auch vom Beruf Programmierer

    Das wäre aber einer Komplettlösung nahe gekommen. Außerdem hab ich ja keinen Quellcode, du hast ja nur die OnButton gepostet.
    Wie oft willst du denn den Wert auslesen bzw. aktualisiert angezeigt bekommen?

    hey...
    so hab jetzt das Problem mit einem Timer gelöst. Der Timer läuft die schleife so oft durch bis ich es stoppe.
    jetzt bleibt mir noch ein Problem und zwar wie kann ich die Phasenverschiebung ermitteln? Damit ich die Leistungen berechnen kann.

    Aber danke für deine Hilfe.



  • Wenn du von Phasenverschiebung redest, so misst du also keine Gleichspannung. Somit ist die "einfache" Umrechnung von Strom und Spannung eben nicht mehr so trivial, auch nicht mit einem Shunt.
    Welche Phasenverschiebung meinst du denn? Die zwischen Strom und Spannung einer Wechselgröße oder die zwischen zwei verschiedenen Wechselspannungen?
    Ich hab sowas noch nie programmtechnisch umgesetzt. Eine Möglichkeit wäre über die Samples einen Spannungs-/Stromteitverlauf zu bekommen und aus diesem die Phasenverschiebung zu ermitteln. Wie groß ist denn die maximale Frequenz deiner Wechsslgröße und wie oft bewirkt dein Timer eine Abtastung? Ich fürchte fast, so wird das nicht ganz funktionieren (Nyquist-Shannonsches Abtasttheorem).



  • Ich messe keine reine Gleichspannung.
    Über einen Trennversterker Messe ich die Spannung und Strom werte ein.
    Ich habe eine Messspannung von +/- 10V. Über den Trennversterker verhält sich meine Gleichspannung wie eine Wechselspannung 🙂 hab also immer noch die Sinus Kurve die aber keine richtige Sinus kurve mehr ist.

    Ich meine die Phasenverschiebung zwischen Spannung und Strom.
    Die Frequenz meiner Wechselgröße beträgt immer noch 50Hz, ich Messe die Netzt Spannung.

    Ich hatte mir gedacht das ich irgendwie die beiden Null durchänge ermittel und die Zeitverschiebung zwischen den beiden feststelle. Mein Timer startet alle 500ms die Messung neu und Aktualliesiert meine Anzeige.
    Noch eine klein Frage was mir so einfällt, kann man die Anzeigen verändern also eine Digitale Anzeige darstellen?

    Wie du es sagst das wird nicht so leicht.



  • dirk61 schrieb:

    Ich messe keine reine Gleichspannung.
    Über einen Trennversterker Messe ich die Spannung und Strom werte ein.
    Ich habe eine Messspannung von +/- 10V. Über den Trennversterker verhält sich meine Gleichspannung wie eine Wechselspannung 🙂 hab also immer noch die Sinus Kurve die aber keine richtige Sinus kurve mehr ist.

    Ich meine die Phasenverschiebung zwischen Spannung und Strom.
    Die Frequenz meiner Wechselgröße beträgt immer noch 50Hz, ich Messe die Netzt Spannung.

    Ich hatte mir gedacht das ich irgendwie die beiden Null durchänge ermittel und die Zeitverschiebung zwischen den beiden feststelle. Mein Timer startet alle 500ms die Messung neu und Aktualliesiert meine Anzeige.
    Noch eine klein Frage was mir so einfällt, kann man die Anzeigen verändern also eine Digitale Anzeige darstellen?

    Wie du es sagst das wird nicht so leicht.

    Siehste, und damit kannst du das schon vergessen. Weil: Abtasttheorem. Wieso kommst du auf 500 ms? Das entspricht doch 2 Hz. Schau mal: 50 Hz sind entsprechend 20 ms für eine vollständige Periode. Laut Abtasttheorem musst die Abtastfrequenz mindestens!! doppelt so groß sein wie die größe im Signal vorkommende Frequenz. Dabei ist das völlig unerheblich ob die eine pulsierende Gleichspannung oder eine echte Wechselspannung hast. Also: Abtasten 100 mal in der Sekunde entspricht 10 ms. Soll heißen: du müsstest alle 10 ms ein Timerereignis losschicken. Und das kannst du vergessen. Erstens ist Windows kein real-time-OS und selbst wenn der Timer eine Auflösung von 1ms theoretisch hergeben würde, tut er das im unteren Bereich nicht. Zweitens: wenn das Abarbeiten anderer Nachrichten in der Nachrichtschleife mal wieder etwas dauert wird wie WM_TIMER auch nicht zeitnah verarbeitet. Außerdem braucht es ja auch eine endliche Zeit die der ADU braucht und du auf das Register der Karte zugeriffen hast.
    Sicher samplen die Karten mit bis zu 40 kHz, was ja einer maximalen Signalfrequenz von 20 kHz entspräche. Allerdings brauchst du ja zeitnahe Messwerte, wenn ich dich richtig verstanden habe.
    Allerdings gibts da eine Möglichkeit. Manche Karte (meine auch) schreiben über interne Puffer, die man dann zur Berechnung nutzen kann. Da musst du mal in der Beschreibung der Karte lesen. Dann übernimmt die Hardware den Rechenpart, was deutlich schneller geht wie mit dem PC. Aber einfach Spannungswerte im Zeitraster abtasten und dann versuchen zu rechnen ist Blödsinn. Die Nulldurchgänge bekommst du ja nicht mal alle mit. Bei 500 ms (angenommen alles läuft zeitoptimal sind ja schon 25 Perioden vergangen, die du gar nicht betrachtet hast.



  • Ist schon richtig was du sagst das man bei 50Hz 20ms hat.
    Die abtast frequenz stell ich ja nicht bei meinem timer ein sondern in meiner funktion Frequenz. Und dort Taste ich schon mind. die Doppelte Frequnz ab. Vielleicht muss ich auch den Timer kleiner stellen, das könnte möglich sein.

    AndyDD schrieb:

    Allerdings gibts da eine Möglichkeit. Manche Karte (meine auch) schreiben über interne Puffer, die man dann zur Berechnung nutzen kann. Da musst du mal in der Beschreibung der Karte lesen. Dann übernimmt die Hardware den Rechenpart, was deutlich schneller geht wie mit dem PC.

    Die werte werden in den Internen Puffer reingeschriebn aber was meinst du den damit genau? Hab bei mir die Doku der Karte angeschaut, konnte jetzt nichts direktes drüber finden....



  • Welche Karte hast du denn genau?



  • AndyDD schrieb:

    Welche Karte hast du denn genau?

    das ist die me4610



  • Ich hab mal in dem Handbuch zu deiner Karte nachgeschaut. Die Meilhaus-SDK bietet ja hier schon einiges was du brauchst. Ab Kapitel 4.1.2.1 (Version 1.2D) steht alle was du brauchst. Die Karte schreibt die Werte in den Ringpuffer und du brauchst diese nur zeitnah auslesen. Wenn die Abstände zwischen zwei Ticks 30,30 ns betragen ist die Auflösung mehr als ausreichend. Der Rest ist reine Mathematik. Aus den Samplewerten könntest du z.B. die Spannungs-Zeitfunktion ermitteln. Eventuell gibts auch irgendeine Transformation, wo man noch einfacher die Phasenverschiebung ermitteln kann. Nur das ist bei mir auch schon wieder eine ganze Weile her wo ich das das letzte Mal hatte...



  • Das hatte ich auch gelesen. Was mich jetzt nur durcheinander wirft, dann würde es doch nicht Funktionieren wenn ich ein Timer eingestellt habe um die Funktion immer automatisch zu starte?!. Habe momentan ein Große Denkblokade!
    Wie realisiert man das mit den Samples? Das ist mir auch jetzt ganz neu! Gibs da ein link mit Bsp. Hab zwar gegooglet aber nichts so gefunden.



  • Bin bin zuerst davon ausgegangen, dass du dir mehrfach hintereinander weg den Wert für die Spannung aus dem Register der Karte holst. Deshalb gabs von mir die Anmerkung mit dem Abtasttheorem.
    Jetzt gehe ich davon aus, dass du das so machst wie es im entsprechenden Kapitel des Handbuchs beschrieben ist. Die Karte arbeitet ja über einen Ringpuffer. Wie lange es natürlich dauert den auszulesen hab ich jetzt nicht nachgeschlagen. Klar musst du den zyklisch auslesen, sonst stoppt entweder die Messung (wenn er voll ist) oder die Werte werden einfach überschrieben. Allerdings müsste dann der Timer einen größeren Intervall bekommen. Die API von Meilhaus bringt ja auch viel zum Fehlermanagement mit, eventuell könntest du sogar das mit dem Timer lassen und eventgesteuert arbeiten (wenn Puffer voll, dann auslesen; wenn ein Fehler auftaucht musst du natürlich die Messwerte verwerfen, da man dann die Gültigkeit in Frage stellen muss). Du musst aber erst mal dieses Handbuch inklusive Funktionenreferenz genau studieren. Ist sehr gut beschrieben. Zu meiner Karte gabs nur ein schlechtes Tut in Englisch.
    Zu den Samples: schau dir mal die Theorie zur A/D-Wandlung an (Stichwort Systemtheorie). Aus den einzelnen Messpunkten (Samples) kann man die Spannungs-Zeit-Funktion ermitteln. ich bin mir eben nicht mehr so sicher, aber ich glaube bei irgendeiner Transformation war es relativ leicht die Phasenverschiebung zweier Signale zu ermitteln.



  • AndyDD schrieb:

    Bin bin zuerst davon ausgegangen, dass du dir mehrfach hintereinander weg den Wert für die Spannung aus dem Register der Karte holst. Deshalb gabs von mir die Anmerkung mit dem Abtasttheorem.
    Jetzt gehe ich davon aus, dass du das so machst wie es im entsprechenden Kapitel des Handbuchs beschrieben ist. Die Karte arbeitet ja über einen Ringpuffer. Wie lange es natürlich dauert den auszulesen hab ich jetzt nicht nachgeschlagen. Klar musst du den zyklisch auslesen, sonst stoppt entweder die Messung (wenn er voll ist) oder die Werte werden einfach überschrieben. Allerdings müsste dann der Timer einen größeren Intervall bekommen. Die API von Meilhaus bringt ja auch viel zum Fehlermanagement mit, eventuell könntest du sogar das mit dem Timer lassen und eventgesteuert arbeiten (wenn Puffer voll, dann auslesen; wenn ein Fehler auftaucht musst du natürlich die Messwerte verwerfen, da man dann die Gültigkeit in Frage stellen muss). Du musst aber erst mal dieses Handbuch inklusive Funktionenreferenz genau studieren. Ist sehr gut beschrieben. Zu meiner Karte gabs nur ein schlechtes Tut in Englisch.
    Zu den Samples: schau dir mal die Theorie zur A/D-Wandlung an (Stichwort Systemtheorie). Aus den einzelnen Messpunkten (Samples) kann man die Spannungs-Zeit-Funktion ermitteln. ich bin mir eben nicht mehr so sicher, aber ich glaube bei irgendeiner Transformation war es relativ leicht die Phasenverschiebung zweier Signale zu ermitteln.

    hallo..
    eigentlich mach ich das so wie in der Beschreibung, hole die werte synchron aus dem Ringpuffer heraus. Die beschreibung gibt schon einiges her aber mit unserem kentniss über Programmieren sagt es auch nicht viel. Die Beschreibung haben wir immer parat beim Programmieren aber es fehlen uns noch viele Hintergrund wissen was wir uns wegen zeit mangel nicht aneichnen können...

    Was meinst du mit Transformation, das sagt mir zu diesem Thema nichts...



  • Hallo AndyDD
    leider hab ich das mit dem Phasenverschiebng nicht hinbekommen...hab verschiedene sachen ausgetestet aber bekomm es einfach nicht hin, könntest du mir da weiter helfen??


Anmelden zum Antworten