C# Array aus HP8720D Osziloskop auslesen

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hey Leute,

ich sitz hier gerade vor einem groesseren Problem und komm einfach nicht voran.
Ich muss ein Network Analyzer (HP 9720D) von einem PC aus ansteuern.
Genutzt wird ein USB auf GPIB Interface von National Instruments (GPIB-USB-HS).

Ich bekomme es zwar hin, den NA zu "kalibrieren". Dinge wie die Start und Stopfrequenz zu setzten usw. Aber ich haenge dabei Daten aus dem NA auszulesen.

Ich moechte fuer jeden einzelnen Punkt (auf 401 festgelegt) die Werte in einem Array haben, um sie zu vergleichen, ob sie ueber einem bestimmten Limit sind.
Aber ich bekomme es einfach nicht hin, die 401 Werte aus dem NA heraus zu bekommen.

Hat jemand damit erfahrung? Ich hab leider sowas noch nie gemacht und arbeite auch normalerweise nicht mit Oszis und der gleichen. Danke!
 
Du kannst also den NA schon per P/Invoke über die mitgelieferte DLL ansprechen und Deine Frage zielt darauf, welche Kommandos Du auf dem Bus absetzen musst, um Messwerte aus dem NA zurück zu bekommen?
Dann poste doch mal Deinen schon vorhandenen Code (auch auszugsweise) und einen Link auf die HP-Referenz mit den Befehlen für den GPIB-Bus.

Ich hab mal vor ca. 10 Jahren sowas Ähnliches in "plain C" für einen (wenn ich mich richtig erinnere) HP-Spectrumanalyzer über eine ISA/PCI-IEEE488-Einteckkarte programmiert...


BigNum
 
Zum ansprechen des NA verwende ich eine von Nation Instruments (NI) mitgelieferte Klasse.

Zwischenzeitlich bin ich soweit, dass ich auch Daten von dem NA bekomme, die stimmen aber hinten und vorne nicht.

Code:
class RunTest
    {
        bool conecClose = false;        //check if the connection to the device should close

        public void initialNA(string[] arrSetData, bool bPreNA)
        {
            int iBoardnr = 0;
            byte bPrimaryAddress = 16;

            NationalInstruments.NI4882.Device gpibObjekt;           // Erstellt eine Variable vom Typ GPIB Device
            gpibObjekt = new Device(iBoardnr, bPrimaryAddress);     //Open the interface to the NA over GPIB

            if (bPreNA == true)
            {
                //preset the NA only at the new PartNo, not after click on "Save"

                gpibObjekt.Write("OPC?; PRES");     //preset the NA

                gpibObjekt.Write("CHAN1");            // Set Channel
                gpibObjekt.Write(arrSetData[4]);    // Set the Measurement - S11|S12|S21|S22
                gpibObjekt.Write("LOGM");              // Set Log to Display
                gpibObjekt.Write("POIN 401");        // Set the points to X-Axis

                gpibObjekt.Write("STAR" + arrSetData[2] + " MHZ");      // Set Start Frequenz  
                gpibObjekt.Write("STOP" + arrSetData[3] + " MHZ");      // Set Stop Frequenz
            }

            byte[] arrNAData = new byte[401];

            gpibObjekt.Write("FORM4");
            gpibObjekt.Write("OUTPFORM");
            arrNAData = gpibObjekt.ReadByteArray();            
             
             //write the array to a textfile
            using (StreamWriter wF = new StreamWriter(@"D:\C#\IITAv1\test\Networkanalyzer.txt"))
            {
                for (int x = 0; x < arrNAData.Length; x++)
                {
                    wF.WriteLine(arrNAData[x]);
                }
            }
            if (conecClose == true)
            {
                gpibObjekt.Dispose();
            }
        }

Ich bekomme hier jetzt nen array mit z.B. 1024 Werten, aber keine Ahnung was für Werte das sind. Evtl. handelt es sich um die Bytes des Arrays, ist aber nur eine Vermutung.
 
Versuch mal statt

palaber schrieb:
Code:
...
            byte[] arrNAData = new byte[401];

            gpibObjekt.Write("FORM4");
            gpibObjekt.Write("OUTPFORM");
            arrNAData = gpibObjekt.ReadByteArray();            
...

Code:
...
            gpibObjekt.Write("FORM4");
            gpibObjekt.Write("OUTPFORM");
            string s= gpibObjekt.ReadString(8000);
...
Wenn meine Vermutung stimmt, dann funktioniert mein obiger Code und Du solltest im String "s" die 401 Werte durch Kommata getrennt bekommen.

Falls nicht dann probier mal was ein blankes (d.h. ohne all die anderen Befehle)
Code:
            gpibObjekt.Write("IDN?");
            string s= gpibObjekt.ReadString(200);
liefert. Es sollte in "s" die Gerätekennung stehen.

Falls dies klappt, dann könntest Du als nächstes die Startfrquenz mit "STAR 200 MHz" setzen und mit
Code:
            gpibObjekt.Write("STAR?");
            string s= gpibObjekt.ReadString(200);
wieder auslesen und vergleichen, ob der eingestellte Wert auch wieder richtig zurückgelesen wird...

Und was mir noch aufgefallen ist: Evtl. muss in Deinem Code noch bei
Code:
            gpibObjekt.Write("STAR" + arrSetData[2] + " MHZ"); // Set Start Frequenz
            gpibObjekt.Write("STOP" + arrSetData[3] + " MHZ"); // Set Stop Frequenz
jeweils ein Leerzeichen hinter "STAR" bzw. "STOP" sein, aber es könnte auch ohne funktionieren.


HTH

BigNum
 
Zuletzt bearbeitet:
palaber schrieb:
Hey BigNum, thx a lot!
Das klappt mit dem 8000! Fuer was steht das denn?
Für die maximale Anzahl der zu lesenden Zeichen.

Den String kannst Du dann mit s.Split(',') in die einzelnen Teile aufsplitten.


HTH

BigNum
 
Okay, ich versuch es mal mit dem Split, da er mit meiner Schleife

Code:
for (int i = 0; i < 401; i++)
{
    arrStringNAData[i] = sNAData.Substring(iStart, 24);
    iStart = iStart + 48;
}

nach 160 Durchlaeufen abbricht. Weiss nicht wirklich warum, aber evtl. klappt es ja mit split!
Halte euch auf dem laufenden! Und nochmals Danke!

Edit:
Also mit dem Split ist es auch nicht ganz richig. Ich bekomme jetzt nen Array mit 361 Elementen.
Bin gerade am debuggen ob ich irgendwo den Fehler finde. Sonst poste ich gleich mal denn Quellcode. Hab nur kein Internet an meinem "EntwicklerPC" - daher dauert es immer ein bissel.

Edit 2: Wenn ich den Split ausfuehre wird mein Array auf 161 Elemente begrenzt. Ist das, dass maximum fuer nen String Array? Aber dann haette er ja schon bei der Deklaration gemeckert.

Code ist folgender:
Code:
arrStringNAData = sNAData.Split(','):  //wobei das Array vorher mit 401 Elementen deklariert wurde
Ergänzung ()

Also ich glaube ich habe das Problem entdeckt! Und zwar liegt es nicht direkt am String.
Sondern am Output aus dem Oszi. Ich habe mir jetzt mal den String, den ich direkt vom Oszi bekomme in ne txt gespeichert und habe die Elemente durchgezaehlt. Das sind so um die 160, wenn ich mich nicht verzaehlt habe. Werde jetzt nochmals schauen, ob ich nicht irgendwo nen Fehler bei der Verwendung des Oszis habe.
 
Zuletzt bearbeitet:
palaber schrieb:
nach 160 Durchlaeufen abbricht. Weiss nicht wirklich warum
Du bekommst keine Fehlermeldung?
Beachte, dass arrStringNAData eine Länge von mindestens 401 und sNAData eine Länge von mind. 19224 Zeichen haben muss (laut deinem Code).

palaber schrieb:
arrStringNAData = sNAData.Split(','): //wobei das Array vorher mit 401 Elementen deklariert wurde
Du kannst das Array nicht mit einer festen Anzahl deklarieren, nur initialisieren. Letzteres ist unnötig, da du diesem sowieso einen neuen Wert zuweist.
 
palaber schrieb:
Also ich glaube ich habe das Problem entdeckt! Und zwar liegt es nicht direkt am String.
Sondern am Output aus dem Oszi. Ich habe mir jetzt mal den String, den ich direkt vom Oszi bekomme in ne txt gespeichert und habe die Elemente durchgezaehlt. Das sind so um die 160, wenn ich mich nicht verzaehlt habe. Werde jetzt nochmals schauen, ob ich nicht irgendwo nen Fehler bei der Verwendung des Oszis habe.
8000 / 160 = 50 (liegt ziemlich nahe bei 48!)

Also solltest Du die Anzahl der einzulesenden Zeichen von 8000 auf z.B. 25000 erhöhen:
Code:
string s= gpibObjekt.ReadString(25000); // oder z.B. 401*60


HTH

BigNum
 
Hey BigNum, vielen Dank! Jetzt klappt es. Habe die 8000 Sache falsch verstanden.
Dachte die Zahl gibt an, das jeweils der maximale Wert ausgelesen wird, nicht die Anzahl der Zeichen!
Jetzt bekomm ich meinen kompletten string! SUPER SACHE! Jetzt kann ich endlich wieder weiter machen!
Nochmals vielen Dank!
 
Zurück
Oben