Bonjour,
J'aimerais récupérer les données de mon analyseur de réseaux vectoriel sur mon pc sous forme de tableau. J'utilise un câble GPIB pour communiquer.
merci
Version imprimable
Bonjour,
J'aimerais récupérer les données de mon analyseur de réseaux vectoriel sur mon pc sous forme de tableau. J'utilise un câble GPIB pour communiquer.
merci
Si tu as une interface GPIB, le constructeur a dû fournir en même temps le logiciel nécessaire à son exploitation.
J'utilise le logiciel Dev c++. J'ai trouvé des exemples de programme c pour pouvoir récupérer les données, mais cela ne marche pas.
J'ai même un exemple de programme me permettant de relever les données, mais celui-ci ne marche pas.
voici le code que j'ai récupéré :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 meas_device(vna) int vna; { static char key; printf("\n\t\t MEASUREMENT AND DATA OUTPUT\n"); printf("\nConnect Device Under Test:\n"); printf("Appuyer sur ENTREE pour effectuer la mesure ou ECHAP pour sortir\n"); while((key = getch()) !=27 ) { if(key=='\r') { meas_data(vna); printf("\nConnect Device Under Test:\n"); printf("Appuyer sur ENTREE pour effectuer la mesure ou ECHAP pour sortir\n"); } else; } printf("\n\t\t\t\tPROGRAM ENDED\n"); } meas_data(vna) int vna; { static int count, points; static char i[]="TRS WFS HLD", j[]="FMB LSB OFV CH1 OFD CH2 OFD CH3 RDA OFD CH4 RDA OFD"; static double freq[41]; static struct header { char preamble[2]; int size; } headr; static struct data { double mag; double phase; } s11[41],s12[41],s21[41],s22[41]; printf("Mesure en cours..."); ibwrt(vna,i,sizeof(i)); ibwrt(vna,j,sizeof(j)); ibrd(vna,&headr,4); ibrd(vna,&freq[0],headr.size); ibrd(vna,&headr,4); ibrd(vna,&s11[0],headr.size); ibrd(vna,&headr,4); ibrd(vna,&s12[0],headr.size); ibrd(vna,&headr,4); ibrd(vna,&s21[0],headr.size); ibrd(vna,&headr,4); ibrd(vna,&s22[0],headr.size); points=(headr.size/16); printf("\n\n\n\n\n\n"); printf(" S11 S12 S21 S22\n"); printf(" FREQUENCY MAG PHASE MAG PHASE MAG PHASE MAG PHASE\n"); printf(" GHZ) (dB) (Deg) (dB) (Deg) (dB) (Deg) (dB) (Deg)\n"); for (count=0;count < points;count=count + 5) printf("%7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f\n", freq[count]/1E9,s11[count].mag,s11[count].phase, s12[count].mag,s12[count].phase, s21[count].mag,s21[count].phase, s22[count].mag,s22[count].phase); }
Ton PC, c'est quel OS ?
Pour ta carte HPIB, tu as installé le driver ?
Tu as les librairies pour te linker avec ?
Qu'est ce qui ne marche pas :
- Erreur de compilation,
- link,
- lancement,
- les résultats affichés ne sont pas ceux attendus
Oui j'ai installé le driver, pas de problème le librairie, pas d'erreur de compilation. Pour l'OS dsl je sais pas c'est quoi. Et en faite le résultat c qu'il m'affiche que ca :Alors qu'il devrait m'afficher les résultats pour chaque fréquenceCode:
1
2
3
4 S11 S12 S21 S22 FREQUENCY MAG PHASE MAG PHASE MAG PHASE MAG PHASE GHZ) (dB) (Deg) (dB) (Deg) (dB) (Deg) (dB) (Deg)
OS = Operating System. Ma question était donc tu tournes sous quoi Windows XP, Linux, autre.
Quel environnement de développement utilises-tu, Visual Studio, Code::Block, autre ?
Je ne sais pas d'où tu as récupéré ce code mais il n'est pas tout récent. Il y a bien longtemps que l'on écrit plus les fonctions comme cela :
Maintenant, c'est plutôt comme cela :Code:
1
2
3
4 meas_data(vna) int vna; { ...
Mais bon, si rien ne s'affiche, c'est que la boucle "for (count=0;count < points;count=count + 5)" n'est pas exécutée.Code:
1
2
3 void meas_data(int vna) { ...
Donc quelle est la valeur de points avant de rentrer dans la boucle.
Autre chose, les fonctions ibrd() et ibwrt() doivent probablement retourner quelque chose en cas d'erreur et tu ne testes jamais les retours de ces fonctions, autant prendre les bonnes pratiques dès le début.
Est ce que tu as les moyens d'exécuter ton code dans un debugger pour voir ce qu'il se passe. Si tu ne peux pas, il va falloir passer par des printf intermédiaires pour t'aider.
Alors je tourne sous windows XP et j'utilise Devcpp. j'ai récupéré ces codes sur internet. En faite je travail en communication GPIB avec un appareil de mesure. Je dois récupéré les données des 4 parametres.
Pour ce qui est des fonctions, cela marche quand même puisque j'utilise d'autres fonctions du même type.
1- Quel est le modèle de ton VNA ? Je suppose (d'après d'autres posts) qu'il s'agit d'un Anritsu.
2- es-tu sûr que les commandes
ne sont pas séparées par ; plutôt qu'un blanc ?Code:
1
2 i[]="TRS WFS HLD", j[]="FMB LSB OFV CH1 OFD CH2 OFD CH3 RDA OFD CH4 RDA OFD";
Il s'agit d'un Wiltron 360B. Et non il ne faut pas de ; entre chaque commande. C'est sur car j'ai d'autres fonctions qui marchent trés bien.
Et pour te répondre ram-0000, ibrd() permet la lecture de données émises par un appareil et ibwrt() permet l'envoi d'une commande à un appareil.
Pour ce qui est du debugger, si je n'ai pas d'erreur à la compilation, je ne peux pas l'utiliser. Si ?
Oui, cela je m'en doutais mais il y a probablement/peut être un code de retour de cette fonctiuon qui t'indique si cela s'est bien passé ou non. C'est ce code de retour (s'il existe) qu'il faut systèmatiquement analyser, tu peux avoir des surprises/indications de problème (genre syntaxe error, command too long, unknown command, OK, ...)
Bien sûr que si, un debugger permet d'exécuter un programme en pas à pas et d'analyser au fur et à mesure le contenu de tes variables et le voir le déroulement du programme et les branches de code utilisées.
C'est très pratique et cela devrait être le premier réflexe en cas de problème.
ok mais la je rentre dans des domaines que je ne connait pas bien. Mais je vais essayer, peut etre pourrais tu m'aider à me lancer.
Que signifie le "4" dans ibrd ? Il n'a aucun rapport avec la taille de la structure headr. Qu'est ce que la fonction est censée mettre dans headr ?Code:
1
2
3
4
5
6
7
8 static struct header { char preamble[2]; int size; } headr; ... ibrd(vna,&headr,4);
Honnetement je serais pas te répondre car j'y connais pas grand chose. Mais j'ai trouvé ce programme sur internet donc a mon avis ca doit bien servir a quelque chose. Mais si je l'enlève, a la compilation il y a un message d'erreur :
Code:main.c:189: error: too few arguments to function `ibrd'
Il ne s'agit pas de l'enlever. Très vraisemblablement, il correspond au nombre de bytes qui doivent être lus, donc à la taille de headr.
Si tes int font 16 bits, il est probable que 4 soit correct, mais si il font 32 bits ? Dans ce cas la taille de headr est 6 au minimum et plus probablement 8 à cause des problèmes d'alignement. Dans ce dernier cas, le champ size n'est jamais initialisé et reste à 0.
Lorsque tu fais tes ibrd(vna,&headr,???), qu'est ce que tu es censé recueillir ?
Apparemment, un en tête de deux bytes (preamble que tu ignores) et deux bytes pour le champ size. Si c'est le cas, il faut pour ce champ un entier de 2 bytes.
Donc en gros tu me conseil de faire quoi ? Juste remplacer le 4 par un 8 ?
Je crois que depuis le début, tu te trompes de méthode. Tu fais du développement divinatoire et cette méthode ne marchera jamais (ou alors cela va tomber en marche et tu ne sauras pas pourquoi).
Pour faire ce que tu veux,commence par :
- Lire la doc du SDK de ton interface GPIB et comprendre les différentes fonctions
- Compléte cette vision avec la lecture des include de ton SDK, s'il y a des commentaires dedans, cela peut aider
Oui je sais que c'est pas le top pour comprendre, mais la il me reste 1 semaine de stage, il faut que je finisse plein de chose. Je pense que je vais continuer un peu la méthode divinatoire même si cela ne marche pas. Mais je te remercie ainsi que les autres pour votre aide.
Le document de Anritsu-Wiltron sur le 360B
MODEL 360B VECTOR NETWORK ANALYZER. GPIB PROGRAMMING MANUAL
donne de nombreux exemples et surtout décrit Le format de transfert dans les pages 5-3 et suivantes.
On y lit que un transfert binaire est précédé par un préambule de deux caractères "#A" suivi de DEUX bytes donnant le nombre de bytes des données.
Il faut donc adapter la structure struct header à ce format.
En faisant un bout de programme à part :
- Vérifier que les int font plus de deux bytes en affichant le résultat de sizeof(int) (on obtiendra probablement 4)
- Si oui, vérifier que les short int font deux bytes en affichant le résultat de sizeof(short int)
- Si oui, remplacer les int par des short dans la structure header et vérifier qu'elle fait bien 4 bytes en affichant sizeof(struct header) (Vérifier à cause des problèmes d'alignement possible dans la structure)
- Si c'est bon, retourner au programme de transfert GPIB et remplacer le int par un short dans struct header. Laisser la valeur 4 dans les ibrd.
ok mais c'est quoi les codes pour faire ceci ? car la je suis perdu dsl
Non c'est bon, j'ai juste remplacé le int par un short et ca marche. Par contre pour cette ligne :le count+5 me prend les mesures tout les 0.5 GHz mais quand je met count+0.5 pour récupérer les mesures tout les 0.05 GHz ca marche pas ya erreur.Code:for (count=0;count < points;count=count + 5)
Donc il faudrait que je mette quoi pour que ca marche ?
n'affiche qu'un point de mesure sur 5. Si ça n'affiche que tous les 0.5Ghz, c'est que les points sont espacés de 0.1GHz.Code:for (count=0;count < points;count=count + 5)
Pour avoir tous les points possibles dans cette mesure, faire count = count+1
Tu ne peux pas descendre en dessous de cette résolution qui doit être celle que tu as programmée sur le Wiltron. Si tu veux mieux que ça, il faut reprogrammer le Wiltron avec une meilleure résolution et refaire la mesure.
Ca peut changer le nombre de points d'acquisition.
ram-0000
Ce n'est pas le float qui est convertit en entier mais le contraire et c'est le float count+0.5 qui est convertit en entier (ce qui laisse de toute façon count inchangé)Citation:
count est un entier donc count + 5 est valide mais count + 0.5 (ou 0.05), cela fait comme count + 0 du fait de la transformation du nombre flottant (0.5) en entier (0)
ok mais ca changera pas le problème. Car si je laisse count en entier et que je met count+0.5, ca ne marchera toujours pas.
Relis mon post précédent
count n'est PAS la fréquence, c'est un indice du tableau et on ne DOIT faire que coun= count+un entier.
Tu ne peux pas avoir avec cette mesure des points tous les 0.05GHz
ok mais si j'espace mes points de 0.01GHz avec un point sur 5, ca m'affichera tout les 0.05GHz. non ?
Oui, mais cela demande que tu fasses une autre mesure avec le wiltron correctement programmé
Je l'ai fait mais cela ne marche toujours pas.
Que veux-tu que je te dise avec comme information "ça ne marche pas"?
Qu'est-ce qui ne marche pas ?
Ben j'ai changé le nombre de points ya une erreur:
Tu as demandé combien de points ?
J'ai fais 400 points espacés de 10 MHz et j'ai mis count + 5.Ca devré me faire des fréquence tout les 0.05GHz normalement.
Alors, tes tableaux sont trop petits (41 éléments) pour mettre les 400 valeurs !Citation:
J'ai fais 400 points
Bon voila affaire résolu, au lieu d'ecrire
Il fallais juste que je mette :Code:s11[41],s12[41],s21[41],s22[41];
MerciCode:s11[501],s12[501],s21[501],s22[501];
Le code suivant devrait réserver et libérer la quantité de mémoire nécessaire et suffisante pour stocker les données.
Naturellement, je n'ai pas testé normalement ce code puisque je ne dispose pas du matériel.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 ... #include <stdlib.h> //--------------------------------------------------------------------------- typedef struct { double mag; double phase; } sData; typedef struct { short size ; double * freq; sData * s11; sData * s12; sData * s21; sData * s22; } Data; //--------------------------------------------------------------------------- void afficheData(Data * data, int step) { int count ; int points; points= data->size/16; printf("\n\n\n\n\n\n"); printf(" S11 S12 S21 S22\n"); printf(" FREQUENCY MAG PHASE MAG PHASE MAG PHASE MAG PHASE\n"); printf(" GHZ) (dB) (Deg) (dB) (Deg) (dB) (Deg) (dB) (Deg)\n"); for (count=0;count < points;count += step) printf("%7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f\n", data->freq[count]/1E9, data->s11[count].mag,data->s11[count].phase, data->s12[count].mag,data->s12[count].phase, data->s21[count].mag,data->s21[count].phase, data->s22[count].mag,data->s22[count].phase); } //--------------------------------------------------------------------------- void liberer(Data * data) { if(data != NULL) { data->size = 0; free(data->freq); data->freq = NULL; free(data->s11) ; data->s11 = NULL; free(data->s12) ; data->s12 = NULL; free(data->s21) ; data->s21 = NULL; free(data->s22) ; data->s22 = NULL; } } //--------------------------------------------------------------------------- void * mesurer(int vna, Data * data) { void * p; char preamble[2]; ibrd(vna,preamble,2); ibrd(vna,&data->size,2); p = malloc(data->size); if(p == NULL) { printf("Mémoire insuffisante\n"); liberer(data); } else ibrd(vna,p,data->size); return p; } //--------------------------------------------------------------------------- int meas_data(int vna, Data *data ) { char const cmd1[] = "TRS WFS HLD" ; char const cmd2[] = "FMB LSB OFV CH1 OFD CH2 OFD CH3 RDA OFD CH4 RDA OFD"; ibwrt(vna,cmd1,sizeof cmd1); ibwrt(vna,cmd2,sizeof cmd2); return (data->freq = mesurer(vna,data)) != NULL && (data->s11 = mesurer(vna,data)) != NULL && (data->s12 = mesurer(vna,data)) != NULL && (data->s21 = mesurer(vna,data)) != NULL && (data->s22 = mesurer(vna,data)) != NULL ; } //--------------------------------------------------------------------------- void meas_device(int vna) { char key; printf("\n\t\t MEASUREMENT AND DATA OUTPUT\n"); printf("\nConnect Device Under Test:\n"); printf("Appuyer sur ENTREE pour effectuer la mesure ou ECHAP pour sortir\n"); while((key = getch()) !=27 ) { if(key=='\r') { Data data = {0,NULL,NULL,NULL,NULL,NULL}; printf("Mesure en cours..."); if(meas_data(vna,&data)) { afficheData(&data,1); liberer(&data); } printf("\nConnect Device Under Test:\n"); printf("Appuyer sur ENTREE pour effectuer la mesure ou ECHAP pour sortir\n"); } } printf("\n\t\t\t\tPROGRAM ENDED\n"); } //---------------------------------------------------------------------------
c'est à dire, tu peux m'expliquer un peu plus en détail ce que fait ce programme stp ?
Il est censé faire la même chose que le programme que tu avais mais la dimension des tableaux étant connue au moment de l'exécution (quand on lit les deux octets suivants le préambule) il construit à ce moment là les tableaux par allocation dynamique avec la taille qu'il faut (dans la fonction mesurer). Une fois que les tableaux ne sont plus utiles, la fonction liberer récupère la mémoire allouée et détruit les tableaux. Toutes les données utiles sont regroupées dans la structure Data