Résolu [VBA] Enregistrement automatique - Logiciel Pulse

  • Auteur de la discussion BillRussell
  • Date de début

BillRussell

Nouveau membre
Bonjour,

Je fais des mesures acoustiques grâce au logiciel PULSE (Bruel & Kjaer), ce logiciel est ancien et intègre VBA. Je souhaite enregistrer automatiquement à la fin de l'acquisition les données d'une courbe dans un fichier sur le disque.

Un clic-droit sur le graphique > Save Curve est possible mais je cherche à automatiser cette commande. L'enregistrement des "clic" effectués n'est pas disponible sur cette version de VBA. La commande Application. me propose plusieurs possibilité de Sub mais je n'arrive pas à les utiliser (débutant en VBA).

J'aimerai avoir un équivalent de ce code sur PULSE :

C++:
ActiveDocument.SaveAs Filename:="Doc1.doc", FileFormat:=wdFormatDocument

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.AlertBeforeOverwriting = False
    ActiveWorkbook.Save
End Sub

C'est assez important dans mon projet, pouvez-vous me donner vos idées ?


Niveau en VB6 : débutant
OS : XP Pro
Microsoft Office 2010
 

zeb

Modérateur
Salut,

OS: Slackware
VB: Expert.

M'enfin !

----------------------

Je ne connais malheureusement pas le logiciel dont tu parles.
Mais il est sans doute possible de trouver un moyen de lister tes objets.
Je pense à quelque chose comme ça :

Code:
Private Sub toto

For Each mon_graph In Project.Curves
    MsgBox mon_graph.Name
Next


End Sub

Mais je n'en connais pas le modèle objet.
N'as tu pas de manuel ou autre qui en parlerait ?
 

BillRussell

Nouveau membre
J'ai essayé ta proposition et cela ne fonctionne pas..

En fait, mon problème est plutôt dans l'appel d'une fonction, je m'explique :

Mon projet s'appelle Application (Pulse.ost), il y a une Form (userForm1) et un module (Module 1).
J'ai fait plusieurs essais sur la UserForm1 avec des boutons qui permettent de lancer l'acquisition sur le logiciel ou de le stopper, etc.. Ces fonctions étant pré-programmées dans la base de fonction PulseLabShop. Cela fonctionne.

Mais je butte sur l'appel des fonctions d'enregistrement.. Si je me réfère au Object Browser : dans la librairie PulseLabShop et dans la sous-partie Application, j'ai la liste des fonctions enregistrées :
- Activate
- AutoRange
- Exit
- Save
- SaveProjectAs
- Start
- ...etc

Ces fonctions ci sont applicables assez facilement. Cependant je cherche l'enregistrement de plusieurs courbes précises et pas tout le projet. Le projet étant au format .pls et je souhaite récupérer les données d'acquisition en .txt .

Le logiciel PULSE enregistre les fonctions dans le Function Organiser puis on créé des zones graphiques ou l'on insere ces fonctions. Mon idée est d'aller chercher la fonction précise puis de l'enregistrer (Un clic droit dans le Function Organizer pour sauver la fonction est possible) pour que l'enregistrement se fasse automatiquement. Je ne sais pas comment créé une nouvelle fonction et quelles données/format/syntaxe utiliser.


Je voulais fournir des ImprEcran vu que le logiciel est peu connu et mes explications plus ou moins claires, mais je ne peux le faire sur ce forum. L'aide du logiciel de programmation a été désactivée..

Merci de porter attention à mon soucis.


----------------------------

Bill Russell
 

zeb

Modérateur
Salut,

L'aide du logiciel de programmation a été désactivée..

J'ai tendance à répondre que nous ne sommes pas là pour remplacer le manuel. Au contraire.
Ce n'est pas contre toi, car j'ai compris que tu préfèrerais l'avoir.

Va voir ton chef et exige de lui (si, si) que l'aide soit installée.
(Perso, ça me rappelle des souvenirs ;) )
 

BillRussell

Nouveau membre
Désactivée était pas le bon terme, je veux dire qu'elle ne fonctionne pas, j'ai les drivers et les droits d'admin. J'ai déjà tout réinstallé et elle ne fonctionne pas (pas détectée ou autre)

De toutes façons j'ai pu retrouver des bribes sur internet de cette aide. Elle ressemble à un dictionnaire : "Programmation : action de programmer" !! et je te donne un exemple :

" SaveProjectAs : fonction qui permet de sauver le projet sous un nom défini.
Function SaveProjectAs(FileName, [DoOverwrite]) As Boolean "

C'est a peu de chose près la même chose pour toutes les fonctions..
Moi j'aimerai comprendre comment je peux appeler une fonction créé et ou est ce que je dois l'appeler (obligatoirement dans userform? utilité du Module ? String ? etc.. )
 

zeb

Modérateur
Il te faudrait te rapprocher d'un forum spécialisé dans ce logiciel particulier.
Ici, nous sommes trop généralistes, ou spécialisés dans des logiciels plus répandus.

Mais ton sujet reste ouvert. Un guru de Pulse pourrait passé et te répondre.
 

BillRussell

Nouveau membre
Oui tu as raison, je suis toujours à la recherche d'un dieu en Pulse. J'ai fait plusieurs autres forum (meme anglais) genre NI ou encore le fournisseur Bruel & Kjaer mais même eux ne savent plus rien sur ce logiciel v10.0 alors qu'ils sortent la version v16.2 ...
Enfin je suis à la recherche du Graal mais les questions sur les forums généraliste me permettent aussi de faire le point sur ce que je sais et ce que je ne sais pas.

En tout cas le sujet reste ouvert et je suis toujours à l’affût ! =)
 

BillRussell

Nouveau membre
Mise à Jour : J'ai trouvé le plus gros du code, il me reste une modification à faire:

J'ai essayé de créer une Variable et de mettre mes données dedans. Pour ensuite insérer ma variable dans le fichier. Mais il y a une erreur à ce niveau là, je ne sais pas comment déclarer ma variable "Data" : en tant que Object ou en tant que Variable ?

Voici mon code :

C++:
Private Sub CommandButton5_Click() 
    Dim FSys As Object 
    Dim TXT As Object 
    Dim OpenTxt 
    Dim LeFichierTxt As String 
        LeFichierTxt = "C:\Documents and Settings\All Users\Desktop\fichier2.txt" 
    Dim FunctionData As BKDataSet 
    Dim MyPulseData As Variant 
    Dim Data As Object 


Set FunctionData = Project.FunctionOrganiser.FunctionGroups("LOG").
                             Functions("Spectre dB (Input 1)").FunctionData 

FunctionData.GetAllValues (True) 

Set Data = FunctionData.                                  'C'est là que je plante, je ne sais pas quoi mettre pour les changer en objet


'Pour creer le fichier texte si il existe pas 
Set FSys = CreateObject("Scripting.FileSystemObject") 
    If FSys.FileExists(LeFichierTxt) = False Then 
    Set TXT = FSys.CreateTextFile(LeFichierTxt) 
    End If 

'Ouverture en ecriture du Fichier texte 
Set TXT = FSys.GetFile(LeFichierTxt) 
Set OpenTxt = TXT.OpenAsTextStream(8, -2) '8 = ForAppending = Ouvre un fichier et écrit à la fin du fichier. 

'Pour écrire dans le fichier texte 
With OpenTxt 
.Write Now & " --> " & Data & (Chr(13) + Chr(10)) 
End With 

End Sub

Pouvez-vous m'aider ?
 

drul

Obscur pro du hardware
Staff
D'après ce que j'ai trouver la, j'utiliserais getAllValues. en déclarant data comme un "variant"

 

BillRussell

Nouveau membre
J'ai aussi a disposition ce pdf mais j'avoue ne pas trop comprendre l'explication de la syntaxe décrite à partir du slide 40.
J'ai essayé ce que vous m'avez indiquer :

C++:
Private Sub CommandButton5_Click()
    Dim FSys As Object
    Dim TXT As Object
    Dim OpenTxt
    Dim LeFichierTxt As String
        LeFichierTxt = "C:\Documents and Settings\All Users\Desktop\fichier2.txt"
    Dim FunctionData As BKDataSet
    Dim MyPulseData As Variant
    Dim Data As Variant
    

Set FunctionData = Project.FunctionOrganiser.FunctionGroups("LOG").Functions("Spectre dB (Input 1)").FunctionData
FunctionData.GetAllValues (True)

Data = FunctionData.GetAllValues(True)            'Data contient bien mes données : tableau 2 colonnes 1600 valeurs


[...]

'Pour écrire dans le fichier texte
With OpenTxt
    .Write Data
End With

End Sub

Par contre il ne veut pas écrire dans le fichier texte car Data est une variable, comment je le met en Object ??
Redim ??
 

drul

Obscur pro du hardware
Staff
Ben normalement pas de soucis pour écrire une variable ... (j'ai fais l'essais en mettant une string dans data). Peux-tu nous dire le type de donné qu'il y a dans data ?
(à l'aide d'un breakboint juste avant ".Write data" et d'un "watch" sur data).

Essaye aussi de mettre une string à la place de "FunctionData.GetAllValues(True)" et de voir si ça passe.

edit: apparement ton data est un tableau, tu dois écrire chaque donnée indépendemment: qqch comme ça devrait jouer:

Code:
Private Sub CommandButton5_Click()
Dim FSys As Object
Dim TXT As Object
Dim OpenTxt
Dim LeFichierTxt As String
LeFichierTxt = "C:\fichier.txt"
Dim MyPulseData As Variant
Dim test(0 To 2) As String
Dim data As Variant

'Set Data = FunctionData.GetAllValues(True)                                   'C'est là que je plante, je ne sais pas quoi mettre pour les changer en objet
'Pour creer le fichier texte si il existe pas
Set FSys = CreateObject("Scripting.FileSystemObject")
If FSys.FileExists(LeFichierTxt) = False Then
Set TXT = FSys.CreateTextFile(LeFichierTxt)
End If
test(0) = "test"
test(1) = "test2"
test(2) = "test3"
data = test
'Ouverture en ecriture du Fichier texte
Set TXT = FSys.GetFile(LeFichierTxt)
Set OpenTxt = TXT.OpenAsTextStream(8, -2) '8 =ForAppending = Ouvre un fichier et écrit à la fin du fichier.

'Pour écrire dans le fichier texte

With OpenTxt
    .Write Now & " --> "
    For i = LBound(data) To UBound(data)
    .Write data(i)
    Next
    .Write (Chr(13) + Chr(10))
End With
End Sub

Re-Edit: Je sais Zeb, j'ai pas déclarer "i", c'est ... MAL ...:pfff:
 

BillRussell

Nouveau membre
Quand j'ouvre le fichier texte il y a écrit :

15.06.2012 10:00:00 --> testtest2test3

Si je défini Data en tant que String il ne reconnait plus.
"Compile Error Type Mismatch"
sur la ligne Data = test (ligne 20)

J'ai déclarer i en tant que Variant...
 

drul

Obscur pro du hardware
Staff
Salut,
Je n'ai pas Pulse, j'ai donc remplacer "FunctionData.GetAllValues(True)" par "test" qui simule un tableau (en l'occurence de string).
si tu copie juste:

Code:
With OpenTxt
    .Write Now & " --> "
    For i = LBound(data) To UBound(data)30.    .Write data(i)
    Next
   .Write (Chr(13) + Chr(10))
End With
Dans TON projet ( le code que tu as publié le 14 juin) ça donne quoi ?
 

BillRussell

Nouveau membre
Oui pardon j'avais bêtement copié collé pour tester ta solution...


Avec le code, j'ai deux erreurs :

- Si je définis Data en tant que Variant : "Subscript Out of range" sur la ligne 30
- Si je définis Data en tant que String : "Expected Array" il attend un tableau. Ligne 29 sur LBound.
 

drul

Obscur pro du hardware
Staff
STP, met un breakpoint sur la ligne d'erreur et regarde ce qu'il y a dans data (bouton droit "add watch")

Data doit être un variant, string c'était juste pour faire un test.

Tu as bien garder les lignes suivantes ?

Code:
Set FunctionData = Project.FunctionOrganiser.FunctionGroups("LOG").Functions("Spectre dB (Input 1)").FunctionData13.FunctionData.GetAllValues (True)

Data = FunctionData.GetAllValues(True)

Tiens en regardant de plus près, je suis surpris par la présence de getallValues sur les deux lignes ... Essaye le code suivant:

Code:
Set FunctionData = Project.FunctionOrganiser.FunctionGroups("LOG").Functions("Spectre dB (Input 1)").FunctionData13.FunctionData

Data = FunctionData.GetAllValues (True)
 

BillRussell

Nouveau membre
L'erreur est sur la ligne .Write Data(i)

Avec le break point et le Watch : on voit bien que Data contient les données. elles sont de la forme :

Data............................................................................Variant/Double(0 to 1600, 0 to 0)
...Data(0).....................................................................Double(0 to 0)
.......Data(0,0).............1.57140459577931E-06................Double
...Data(1) Double(0 to 0)
.......Data(1,0) 2.04580459557782E-06 Double

[...]
 

drul

Obscur pro du hardware
Staff
Tableau à 2 dimension ...

Essaie un moment par toi-même. Je t'aide plus tard.
 

drul

Obscur pro du hardware
Staff
Un peu d'inspiration ....

Code:
Private Sub CommandButton5_Click()
Dim FSys As Object
Dim TXT As Object
Dim OpenTxt
Dim LeFichierTxt As String
LeFichierTxt = "C:\fichier.txt"
Dim MyPulseData As Variant
Dim test(0 To 3, 0 To 2) As Double
Dim data As Variant



'Set Data = FunctionData.GetAllValues(True)                                   'C'est là que je plante, je ne sais pas quoi mettre pour les changer en objet
'Pour creer le fichier texte si il existe pas
Set FSys = CreateObject("Scripting.FileSystemObject")
If FSys.FileExists(LeFichierTxt) = False Then
Set TXT = FSys.CreateTextFile(LeFichierTxt)
End If
test(0, 0) = 0.1
test(0, 1) = 0.213
test(0, 2) = 3.14
test(1, 0) = 0.22
test(1, 1) = 0.3132
test(1, 2) = 3.1432
test(2, 0) = 0.131
test(2, 1) = 0.3213
test(2, 2) = 3.4
test(3, 0) = 0.32
test(3, 1) = 0.13
test(3, 2) = 3.3
data = test
'Ouverture en ecriture du Fichier texte
Set TXT = FSys.GetFile(LeFichierTxt)
Set OpenTxt = TXT.OpenAsTextStream(8, -2) '8 =ForAppending = Ouvre un fichier et écrit à la fin du fichier.

'Pour écrire dans le fichier texte

With OpenTxt
    .Write Now & " --> "
    For i = LBound(data, 1) To UBound(data, 1)
        For j = LBound(data, 2) To UBound(data, 2)
            .Write data(i, j) & " "
        Next
    Next
    .Write (Chr(13) + Chr(10))
End With
End Sub
 

BillRussell

Nouveau membre
Je pense que Data ne contient pas d'abscisses mais plutôt un numéro de mesure (point1, point2,..). pourtant l'unité des abscisses est bien une dimension (Hertz) Mon graphique a exporté est de la forme dB = f(Hz)

Enfin ce sont des détails qui ne concernent pas ce sujet de programmation. Je donne mon code final. J'ai moi même recréer les abscisses, je connaissait le pas de mesure (j). J'ai mis un point-virgule comme séparateur entre abscisse et ordonnée pour faciliter l'importation et la séparation des données.

Merci en tout cas à toi drul, c'est gentil à toi d'avoir consacré de ton temps à mon problème

Voici mon code final qui extrait des données d'un logiciel d'acquisition, comptabilise le nombre de mesures effectuées, l'unité des abscisses, créé un fichier texte, l'ouvre en mode écriture, et insère les données d'une variable double.

C++:
Private Sub CommandButton5_Click()
    Dim FSys As Object
    Dim TXT As Object
    Dim OpenTxt
    Dim LeFichierTxt As String
        LeFichierTxt = "C:\Documents and Settings\All Users\Desktop\fichier2.txt"
    Dim FunctionData As BKDataSet
    Dim MyPulseData As Variant
    Dim Data As Variant
    Dim Xaxis As String
    Dim Entries As Long
    Dim test(0 To 2) As String
    Dim i As Variant
       

Set FunctionData = Project.FunctionOrganiser.FunctionGroups("LOG").Functions("Spectre dB (Input 1)").FunctionData


Data = FunctionData.GetAllValues(True)


Entries = FunctionData.NumberOfXAxisEntries
ReDim ValueArr1(Entries - 1) As Double       'Variable de type tableau
FunctionData.RealValues ValueArr1            'Récuperation des Y
TextBox1.Text = Entries

Xaxis = FunctionData.XaxisUnit                      'Cette fonction marche mais pas celle de recup des données
ReDim ValueArr2(Entries - 1) As Double
FunctionData.RealValues ValueArr2
TextBox2.Text = Xaxis

'Pour creer le fichier texte si il existe pas
Set FSys = CreateObject("Scripting.FileSystemObject")
    If FSys.FileExists(LeFichierTxt) = False Then
    Set TXT = FSys.CreateTextFile(LeFichierTxt)
    End If
    

'Ouverture en ecriture du Fichier texte
Set TXT = FSys.GetFile(LeFichierTxt)
Set OpenTxt = TXT.OpenAsTextStream(8, -2) '8 = ForAppending = Ouvre un fichier et écrit à la fin du fichier.


'Pour écrire dans le fichier texte
With OpenTxt
    j = 0
    For i = LBound(Data) To UBound(Data)
        
            .write j & ";"
            .write Data(i, 0)
            .write (Chr(13) + Chr(10))
            j = j + 16
    Next
            
End With

Msg = "Écriture réussie dans fichier2.txt"
    MsgBox (Msg)
    
End Sub
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
pfeewwwwwww ... Content que tu aies pu t'en sortir...

Pas évident quand on connais pas du tout pulse ...

A bientôt peut-être ...
(P.S. mais ton sujet en résolu stp)

Edit: y a un peu de nettoyage à faire dans ton code ...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 049
Membres
1 586 392
Dernier membre
jpaulNonDispo
Partager cette page
Haut