XL 2016 Pilotage d'instrument dans Excel via VBA et commandes SCPI (NI-VISA)

Fred8

XLDnaute Nouveau
Bonjour,
Je me permets de solliciter la communauté pour une problématique (pour le moment) très simple.
Je désire mettre ne place des macros de commandes pour des instruments de mesure.
Pourquoi passer par Excel et VBA ? Simplement pour s'intégrer à des relevés Excel existants, et présents sur des postes de production uniquement équipés de Pack Office.

Ce que je veux faire là, maintenant :
Initier une commande d'identification à un instrument (un générateur de fonction Rigol DG822 pour être précis), via une commande USB-VISA.
Pour ceux qui ne connaissent pas VISA, c'est une "Virtual Instrument Software Architecture", une couche d'abstraction normalisée permettant de dialoguer avec des instruments de mesure sans considération du layer physique, qui peut tout à la fois être de l'éthernet, de l'USB, du GPIB. Certaines commandes sont standard, d'autres nécessitent un pilote fournit pas le constructeur.

- Mon matériel est un générateur Rigol DG822, utilisant les pilotes VISA standards.
- J'ai installé la couche de communication VISA via les utilitaires Rigol (Ultra-Sigma pour les initiés).
- Rigol fournit l'exemple de communication via Excel-VBA, (https://iosignal.fi/wp-content/uploads/DG800_ProgrammingGuide_EN.pdf)
- Mon projet VBA est initié exactement comme décrit dans le guide fabricant, avec un bouton lançant une macro, la macro allant lire les coordonnées de l'appareil dans la première cellule, et se chargeant normalement d'envoyer la commande d'identification et de lire la valeur en retour.
- Mes références VBA sont activées (VISA COM 5.5 Type Library).

Le code exemple, tel que je l'ai recopié :

VB:
Sub QueryIdn()
    ' Message de début de communication
    CreateObject("Wscript.shell").Popup "Configuration du DG822 en cours", 2, "Excel VBA"

    Dim viDefRm As Long
    Dim viDevice As Long
    Dim viErr As Long
    Dim cmdStr As String
    Dim idnStr As String * 128
    Dim ret As Long

    'Turn on the device, and the device resource descriptor is in CELLS(1,2) of SHEET1'
    viErr = visa.viOpenDefaultRM(viDefRm)
    viErr = visa.viOpen(viDefRm, Sheet1.Cells(1, 2), 0, 5000, viDevice)

    'Send request, read the data, and the return value is in CELLS(2,2) of SHEET1'
    cmdStr = "*IDN?"
    viErr = visa.viWrite(viDevice, cmdStr, Len(cmdStr), ret)
    viErr = visa.viRead(viDevice, idnStr, 128, ret)
    Sheet1.Cells(2, 2) = idnStr

    'Turn off the device'
    visa.viClose (viDevice)
    visa.viClose (viDefRm)
    
End Sub

Ce qui ne va pas : Erreur 424, la librairie VISA COM n'est pas ouverte, je n'ai accès à aucun de ses objets !!! L'exécution bloque imparablement au premier "viOpen".
Vous avez une idée géniale pour résoudre çà ? Les envois de commandes à l'instrument fonctionnent très bien avec l'outil en lignes de commandes du fabricant (l'instrument répond bien aux sollicitations, il n'y est pour rien dans l'histoire).
Merci !!
 
Solution
Autre question tout aussi stupide : Avez vous testé le fichier XLS qu'ils donnent en exemple dans :

Ils font des déclarations différentes :
VB:
    Dim ioMgr As VisaComLib.ResourceManager
    Set ioMgr = New VisaComLib.ResourceManager
    Dim str As String
    Dim cmd As String
    Dim delaytime As Long: delaytime = 500
    Dim LongDelayTime As Long: longtimedelay = 800
    Dim stringcode As String

    Dim RigolVisaA As VisaComLib.FormattedIO488
    Set RigolVisaA = New VisaComLib.FormattedIO488
    
    instr_id = Worksheets(1).installed_instruments_combo.Text
    
    Set RigolVisaA.IO = ioMgr.Open(instr_id)

Patrice33740

XLDnaute Impliqué
Bonjour,

Je ne connais pas Visa, mais dans ton code, l'object visa :
- n'est pas déclaré (Dim)
- et n'est pas créé (Set visa =)
donc l'erreur est normale.

EDIT : et dans les turn off les il faut enlever les paranthèses
VB:
    visa.viClose viDevice
    visa.viClose viDefRm
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Fred, Patrice,
Juste quelques questions stupides :
1- La référence que vous avez sélectionnée VISA COM 5.5 Type Library pointe t-elle bien sur C:\WINDOWS\system32\ visa32.dll ? N'y a t-il pas d'autres Ref portant le nom de VISA dans la liste des Ref ?
2- Votre DG800 est il bien connecté et sous tension lors du test ? Il est des appareils qui commencent toujours par faire un check up avant toute requête. ( ce qui est ennuyeux, on ne peut pas développer sans l'appareil branché )
3- Avez vous tenter de lancer XL en mode administrateur ? Par sécurité un mode plus faible pourrait interdire d'accéder à l'extérieur du PC.
4- Est ce que l'interface UltraSigma marche correctement ?
5- Avez vous configuré l'appareil pour qu'il gère l'USB ? ( Acquire the USB VISA descriptor of the signal generator page 4-2)
Mes questions peuvent vous semblez puériles, mais en aveugle on ne peut faire guère mieux. ;)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Autre question tout aussi stupide : Avez vous testé le fichier XLS qu'ils donnent en exemple dans :

Ils font des déclarations différentes :
VB:
    Dim ioMgr As VisaComLib.ResourceManager
    Set ioMgr = New VisaComLib.ResourceManager
    Dim str As String
    Dim cmd As String
    Dim delaytime As Long: delaytime = 500
    Dim LongDelayTime As Long: longtimedelay = 800
    Dim stringcode As String

    Dim RigolVisaA As VisaComLib.FormattedIO488
    Set RigolVisaA = New VisaComLib.FormattedIO488
    
    instr_id = Worksheets(1).installed_instruments_combo.Text
    
    Set RigolVisaA.IO = ioMgr.Open(instr_id)
 

Fred8

XLDnaute Nouveau
Bonjour Fred, Patrice,
Juste quelques questions stupides :
1- La référence que vous avez sélectionnée VISA COM 5.5 Type Library pointe t-elle bien sur C:\WINDOWS\system32\ visa32.dll ? N'y a t-il pas d'autres Ref portant le nom de VISA dans la liste des Ref ?
2- Votre DG800 est il bien connecté et sous tension lors du test ? Il est des appareils qui commencent toujours par faire un check up avant toute requête. ( ce qui est ennuyeux, on ne peut pas développer sans l'appareil branché )
3- Avez vous tenter de lancer XL en mode administrateur ? Par sécurité un mode plus faible pourrait interdire d'accéder à l'extérieur du PC.
4- Est ce que l'interface UltraSigma marche correctement ?
5- Avez vous configuré l'appareil pour qu'il gère l'USB ? ( Acquire the USB VISA descriptor of the signal generator page 4-2)
Mes questions peuvent vous semblez puériles, mais en aveugle on ne peut faire guère mieux. ;)

Sylvanu, le plus puéril ici, c'est bien moi !
Pour répondre :
1 - Non, la référence de VISA COM 5.5 Type Library ne pointe pas sur visa32.dll (qui est la lib de base Visa intégrée à Windows et datée de 2013). Avant installation de la couche de communication de Rigol, la référence VISA Library existait et pointait bien sur C:\WINDOWS\system32\ visa32.dll. Aucun différence sur l'exécution de ma macro. Après installation de la couche de communication Rigol (et des lib VISA officielles de National Instruments en plugins), la référence VISA Library a laissé sa place à VISA COM 5.12. Je ne peut pas rediriger VISA COM 5.12 vers visa32.dll (interdit par VBA).

2 - Le DG est bien connecté évidemment, et booté. J'ai essayé différents cas de figure, avec une init de la com en ligne de commande par l'outil de Ultra-Sigma de Rigol, puis avec ma macro Excel sachant que l'instance de com devait être ouverte par le soft Ultra-Sigma, puis une fermeture de Ultra-Sigma et essai de ma macro, plus une ouverture physique du lien USB avec reconnexion physique et essaie de ma macro.

3 - Oui, je suis admin de mon poste, et j'ai fait l'essai de lancer Excel "exécuter en mode administrateur".

4 - Oui, je pense que l'interface Ultra-Sigma est 100% fonctionnelle. Du moins je pilote l'instrument en lignes de commande comme je le souhaite.

5 - Oui, j'ai l'USB ID du générateur, acquis via Ultra-Sigma. J'ai copié cet ID et l'ai mis dans la cellule 1.1.

Voilà voilà...
 

Fred8

XLDnaute Nouveau
Vérifie dans l'explorateur d'objet que le nom de la bibliothèque est bien visa
Patrice, je ne sais pas le dire avec certitude, je ne maîtrise pas assez. Un clic droit dans le code sur visa m'envoie vers l'objet VisaStatusCode. Cela me parait insuffisant. Je m'attends à avoir des fonctions de lectures/écriture de paramètres bien plus précis que de simples paramètres de contrôle d'état.
 

Fred8

XLDnaute Nouveau
Autre question tout aussi stupide : Avez vous testé le fichier XLS qu'ils donnent en exemple dans :

Ils font des déclarations différentes :
VB:
    Dim ioMgr As VisaComLib.ResourceManager
    Set ioMgr = New VisaComLib.ResourceManager
    Dim str As String
    Dim cmd As String
    Dim delaytime As Long: delaytime = 500
    Dim LongDelayTime As Long: longtimedelay = 800
    Dim stringcode As String

    Dim RigolVisaA As VisaComLib.FormattedIO488
    Set RigolVisaA = New VisaComLib.FormattedIO488
  
    instr_id = Worksheets(1).installed_instruments_combo.Text
  
    Set RigolVisaA.IO = ioMgr.Open(instr_id)

Solution à explorer...ce n'est pas adapté à ma machine, mais çà communique...ce qui n'est pas mon cas avec la macro que fournit Rigol sur son "DG800-Programming manual". Rigol n'est pas d'accord avec Rigol...
 
Dernière édition:

Patrice33740

XLDnaute Impliqué
Patrice, je ne sais pas le dire avec certitude, je ne maîtrise pas assez.
Pour vérifier le nom des bibliothèques sélectionnées :
vbe.jpg
 

Fred8

XLDnaute Nouveau
Voilà ce qui marche et qui va me permettre de clore le sujet :

Découverte des instruments sur le bus, et sélection de l'instrument avec lequel on souhaite communiquer :
VB:
Public Sub Find_Devices()
MsgBox "Finding the devices on the bus"
   On Error GoTo alldone
Dim p As Integer
Dim first_found As Integer


Dim ioMgr As VisaComLib.ResourceManager
Set ioMgr = New VisaComLib.ResourceManager
first_found = 0

instruments_found = ioMgr.FindRsrc("?*")
Worksheets(1).installed_instruments_combo.Text = " "
Worksheets(1).installed_instruments_combo.Clear
Rigol_code = "0x1AB1"

For i = 0 To UBound(instruments_found)    '  instruments_found array is zero based?
                    If first_found = 0 Then
                        Worksheets(1).installed_instruments_combo.Text = instruments_found(i)
                        first_found = 1
                    Else
                        Worksheets(1).installed_instruments_combo.AddItem instruments_found(i)
                    End If

Next

Exit Sub
alldone:
MsgBox "An Error was found"
End Sub

>>> renvoie dans mon cas la chaîne "USB0::0x1AB1::0x0643::G8A224203417::INSTR"
Et code d'interrogation de l'instrument avec inscription de la chaîne description dans une cellule :

Code:
Private Sub Connexion_Click()
   Dim ioMgr As VisaComLib.ResourceManager
   Set ioMgr = New VisaComLib.ResourceManager
    Dim str As String
  
    Dim cmd As String
    Dim delaytime As Long: delaytime = 500
    Dim LongDelayTime As Long: longtimedelay = 800
    Dim stringcode As String
      
    Dim RigolVisaA As VisaComLib.FormattedIO488
    Set RigolVisaA = New VisaComLib.FormattedIO488
  
    instr_id = Worksheets(1).installed_instruments_combo.Text
  
    Set RigolVisaA.IO = ioMgr.Open(instr_id)
  

'  Hee is the copy from the manual
  
     ' IDN?
            RigolVisaA.IO.WriteString ("*IDN?")
            Sleep (delaytime)
            str = RigolVisaA.IO.ReadString(1000)
            MsgBox (" Visa is connected to " + str)
          
            RigolVisaA.IO.WriteString ("OUTP OFF")
            Sleep (delaytime)
            ' Ajout Fred
            Sheet1.Cells(11, 4) = str
            ' Fin ajout Fred
            
       RigolVisaA.IO.Close
    
Exit Sub

>>> renvoie dans mon cas la chaîne "Rigol Technologies,DG822,DG8A224203417,00.02.05.00.00"

Evidemment, à ce niveau on ne fait encore rien avec l'instrument, mais le reste est gérable par des envois de commande, cela devrait être plus simple.
Merci à tous de votre soutien, qui a été précieux.
A bientôt !
 

Statistiques des forums

Discussions
315 059
Messages
2 115 818
Membres
112 553
dernier inscrit
carlos33