GPIB

Ah la commande des instruments. GPIB, IEEE488 ça date mais c’est bien plus facile que du RS232 ou USB….
J’ai essayé le même appareil avec Matlab, Python, Code:Block, Visual Studion (C# et VB). Le plus simple est Matlab (possibilitées graphiques et de calculs infinis) suivis de Python. Code:Block est bien mais null pour les graphiques. Puis Visual Studio qui demande d’abors de connaitre Visual Studio avant de connaitre du code. Par contre que du bonheur si on a du temps.
Le plus simple est Matlab (le plus cher), tous les autres sont gratuit. Même Visual en version dévellopement pour particulier (par pour les entreprises..).
Le seul problème de Matlab, c’est son prix. L’application ne fonctionnera que sur un PC, autrement on peut tout faire, simulation, test, arduino, rasperry, logiciel embarqué, incroyable mais très cher. Toute les autres exmples sont gratuits et dupliccable gratuitement.

Vus que notre Power Meter HP438A se lit bien avec l’adaptateur USB/GPIB et le logiciel « Connection Expert ». On va faire l’essai avec Visual Studion et le langage VB.NET.

Mon seul regret c’est que le Basic n’est plus du basic et que on est obligé de déclarer des sessions puis de les ouvrir comme de la programmation objet avec les classes…. Comme du C++ ou du C#. C’est finis le temps du basic avec print »TOTO ».

Bon comme du C# ou du C++ (encore plus chiant le C++ autant faire du C#). Sauf, si on veut être indépandant de Microsoft.

Là encore plus imple que le C# on a juste à rajouter dans le gestionnaire de référence, puis dans COM le VISA COM 5.8 Type Library

Le code:

Module Module1

Sub Main()

Dim ioMgr As Ivi.Visa.Interop.ResourceManager
Dim instrument As Ivi.Visa.Interop.FormattedIO488
Dim strQueryresult As String

ioMgr = New Ivi.Visa.Interop.ResourceManager
instrument = New Ivi.Visa.Interop.FormattedIO488

instrument.IO = ioMgr.Open(« GPIB0::13 ») ‘ use instrument specific address for Open() parameter – i.e. GPIB0::13
instrument.WriteString(« *IDN? »)

strQueryresult = instrument.ReadString()
MsgBox(strQueryresult)

End Sub

End Module

Le résultat:

on a un petit Message Box qui se superpose à la console et qui affiche la valeur CAD:

-29.800E+00 et si on clique sur le OK on sort.

Tout le monde aura compris que ce chiffre indique -30dBm.

Bon là on est dans un autre monde, celui de la programmation objet. C’est pas simple du tout. Comme dans Code:Block il faut mettre la référence qui va bien pour que le linker et compilateur retrouvent les liens avec ce que on va lui demander.

Après ouverture d’un projet en mode console (plus simple au départ) on ajoute au projet une référence. Comme VISA et IVI on déjà préparé le taff il sufit deans projet de « ajouter une référence, on va donc dans le gestionnaire de référence puis dans Assemblys puis dans Extension de cocher Keysight.Visa. Toujours dans le Gestionnaire de références puis dans COM de cocher VISA COM 5.9 Type Librairy.

Après écrire le code suivant:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ivi.Visa;
using Ivi.Visa.Interop;

namespace ConsoleApplication28
{
class Program
{
static void Main(string[] args)
{
ResourceManager
rm = new Ivi.Visa.Interop.ResourceManager();
FormattedIO488
my438A = new Ivi.Visa.Interop.FormattedIO488();

string DutAddr = « GPIB0::13::INSTR »;
my438A.IO = (IMessage)rm.Open(DutAddr, AccessMode.NO_LOCK, 2000, «  »);

my438A.WriteString(« *IDN? »);
string IDN = my438A.ReadString();

Console.WriteLine(IDN);
Console.ReadLine();

return;
}
}
}

Le résultat:

-29.810E+00

J’utilise la version 16.01 de Code:Block. Cet exemple affiche le résultat en mode console. J’ai rajouté le changement de correction de la sonde. Il faut bien sur dans le menu Built option du projet rajouter les liens qui vont bien. A savoir,

Search directories puis dans compiler lui donner le include qui se trouve dans le répertoire Program Files(x86)\IviFoundation\Visa\WinNT\agvisa\Include puis toujours dans Search directorie puis dans Linker lui donner le bin qui va bien , à savoir Program Files(x86)\IviFoundation\VISA\WinNT\lib\msc.

Toujours dans le Build option selectionner le Linker settings et ajouter : Program Files(x86)\IviFoundation\Visa\WinNT\lib\mszc\agvisa32.dll.

Voilà c’est le plus compliqué. Je conseille une fois que c’est ok (selectionner ces liens non par pour le debug ou realise mais pour le projet complet. Ainsi , le exe généré à la compilation ne posera pas de problème. De même se servir de cet exemple en tant que template pout démarrer tout autre projet ainsi les liens ne seront plus à créer.

#include <stdio.h>
#include <stdlib.h>
#include <visa.h>
#include <windows.h>

int main()
{
ViSession defaultRM, vi;
char buf[256] = { 0 };

viOpenDefaultRM(&defaultRM);
viOpen(defaultRM, « GPIB0::13::INSTR », VI_NULL, VI_NULL, &vi);

viPrintf(vi, « *RST\n »);
viPrintf(vi, « *IDN?\n »);
viScanf(vi, « %t », &buf);

printf(« HP 438A POWER LETER valeur niveau en dbm »);

viPrintf(vi, « KB 95 EN\n »);
printf(buf);
Sleep(1000);

viPrintf(vi, « KB 100 EN\n »);
printf(buf);
Sleep(1000);

viPrintf(vi, « KB 95 EN\n »);
printf(buf);

viClose(vi);
viClose(defaultRM);
printf(buf);
system(« PAUSE »);

return 0;
}

Le résultat dans la console:

HP 438A POWER LETER valeur niveau en dbm-29.810E+00
-29.810E+00
-29.810E+00
-29.810E+00
Appuyez sur une touche pour continuer…

On suppose que l’interface HP82357B fonctionne avec « Connection Expert » fournis avec la « IO Suite ». Je vais pour ces exemples rester sur le « power meter 438A ». Je vais aussi montrer comment afficher à l’écran la visu d’un VNA HP 8719C.

Le code est le plus simple qui existe. Rien à faire… Avec l’éditeur de Matlab écrire:

g=gpib(‘agilent’,7,13);  « on définis un objet g, puis on appelle la fonction GPIB avec en premier paramètre le fabricant, en deuxième l’adresse de la carte de commande 7, puis l’adresse de l’appareil 13 »
fopen(g); « on ouvre le port »
fprintf(g,’AP,LG,OC1,’) « on écrit sur le port g la syntaxe du sensor A (AP) puis la syntaxe du mode Dbm log (LG) puis la syntaxe du  de mise en route de l’oscillateur de ref pour brancher la sonde dessus et vérifier que tout va bien (OC1). On aurait pu rajouter le zéro et le cal factor…. »
out1 = fscanf(g) « on définit une variable qui lit ce qui revient sur le port et qui donne le résultat à l’écran. »
fclose(g) « on ferme le port.

sur la fenêtre de commande Window de Matlab on a:

>> test438

out1 =

‘-30.050E+00
C’est ultra simple.

De même avec un 8719C on peut avoir une récupération de une amplitude, phase et fréquence:

vna=gpib(‘agilent’,7,16);
fopen(vna);
fwrite(vna, ‘CWFREQ;10.368 GHZ’);
fwrite(vna, ‘CHAN1;S21;LOGM’);
fwrite(vna, ‘MARK1;10.368 GHZ’);

fwrite(vna, ‘OUTPMARK’);
data = fscanf(vna)

fclose(vna);
delete(vna);
clear vna

le résultat:

>> test8719C_a

data =

‘ -7.270292E+01, 9.543417E+14, 1.036800000E-08

on a bien la phase, l’amplitude et la fréquence

Idem, on part du principe que l’interface USB/GPIB HP82357B est ok, donc visa est installé !!!!

J’utilise la version WinPython-64bit-3.4.4.1 qui a un (Spyder) éditeur assez génial. Là on se rapproche plus du lange C avec des import… Le code là aussi est très simple.

import visa
import os
import time;

hp438a = visa.instrument(« GPIB::13 »)
print (hp438a.ask(« *IDN? »))
print (hp438a.read())

Le résultat dans la console python:

-29.820E+00

L’interface GPIB

Avant tout HP étant l’inventeur du HPIB devenus GPIB, j’utilise un adaptateur USB-GPIB type 82357B. Il existe chez d’autres fournisseurs des adaptateurs de ce type mais je ne les ai jamais utilisé.

Une fois l’adaptateur en main il faut en premier télécharger du site KEYSIGHT la suite I/O Librairie Suite. L’installation de celle ci est très facile de win7 à w10. L’installation permet déjà d’utiliser un utilitaire « Connection Expert » permettant de voir sur votre PC ce qui y est connecté (GPIB, RS232, …..) donc déjà là si le logiciel ne voit pas l’appareil, ce n’est pas la peine de continuer. Si l’installation a été faite correctement la led verte « READY »du 82357B doit être allumée, la led rouge « FAIL »juste à côté éteinte et la led verte « ACCESS » clignoter quand on dialogue avec un équipement.

La suite IO Librairie permet d’installer « VISA » et les driver » IVI ». Je laisse le soin de regarder dans la documentation founie avec cette outil. En fait, on a deux possibilités quand on veut écrire du code. Soit on travaille à bas niveau et on utilise les commandes SCPI pour l’appareil concerné (donc envoyé IDN pour connaitre l’état, TRx pour un trigger), code par forcement identique pour chaque appareil. Soit on travail avec des drivers (voir documentation de la norme VISA et IVI) qui eux permettent directement avec la norme IVI/VISA Foundation d’utiliser le même code quelque soit le fournisseur. Cette deuxième solution valable pour les appareils récents (donc chers) ne fonctionne pas avec des équipements plus anciens. C’est pratique pourtant, un multimètre Fluke, HP ou racal utilisera le même code pour mesurer une tension(voltage, DC). De plus le code est déjà optimisé pour les conflits, la vitesse etc….

J’utilise donc le mode SCPI toujours valable avec des annciens ou récents appareils. Comme j’ai un peu souffert pour écrire du code car je ne suis sourtout pas informaticien, j’ai essayé de piloter le même appareil en Python, avec Matlab, en C avec CodeBlock, puis Visual Studion (C# et VB.net).