From 04:00 PM CDT – 08:00 PM CDT (09:00 PM UTC – 01:00 AM UTC) Tuesday, April 16, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Initialisierung und Auslesen einer Schnittstelle über VB-Skript

Hallo!
 
Ich möchte verschiedenste Geräte an verschiedenen Schnittstellen auslesen bzw. steuern.
 
Dazu möchte ich zwei verschiedene Visual Basic Skripts programmieren:
- ein Skript welches einen Anwenderdialog aufruft und die Schnittstelle mit entsprechenden Parametern initialisiert und
- ein zweites Skript, welches die Schnittstelle ausliest.
 
Für das erste Skript habe ich eine Vorlage verwendet mit den Prozeduren, welche der VBS-Treiber aufruft (SFD_Init, SFD_ReadChannel, etc.).
Jetzt möchte ich jedoch die Initialisierung (SFD_Init, SFD_DeInit, etc.) nur aus meinem Hauptskript ausführen, und in dem zweiten Skript nur noch die SFD_ReadChannel - Prozedur belassen. Das ist ja möglich, da nur diese Prozedur in diesem Skript unbedingt erforderlich ist.
 
Jetzt meine Frage:
Wie kann ich die beiden Skripte miteinander "verbinden", so dass die Initialisierung übernommen wird?
Beim Ausführen bekomme ich nämlich die Fehlermeldung, dass das Objekt für die ReadChannel - Prozedur benötigt wird, ich weiß jedoch nicht wie der Bezug zu dem in dem anderen Skript verwendeten Objekt hergestellt werden kann. Oder gibt es noch andere Möglichkeiten?
 
Vielen Dank für die Hilfe!
0 Kudos
Message 1 of 8
(5,445 Views)
Hallo,

Das Skript, welches innerhalb der Script DAC Treibers verwendet werden kann, beinhaltet nicht den gesamten Befehlsumfang des VBS, welches sie im Modul DIAdem Script verwenden können.
Die Verwendung von Befehlen wie Scriptstart() oder angepassten Anwenderfunktionen im Script DAC VBS ist nicht möglich.

Um dynamisch im Skript bestimmte Parameter zu ändern, empfehle ich, die Parameterfelder zu nutzen, welche der Script DAC Block zur Verfügung stellt. Diese können auch programmatisch geändert werden, zum Beispiel von einem Script, welches automatisch beim Start des Schaltplans aufgerufen wird. Nichts spricht dagegen, in diesem Skript einen SUD aufzurufen, um diese Parameter zu setzen.

Innerhalb des ScriptDAC Programms werden die Daten dann als Funktionsparameter übergeben.
Die Init und Start Prozeduren des skriptes sind vorgesehen, um angeschlossene Messgeräte vor start der Messung zu konfigurieren. Ein Aufruf von Dialogen oder externen Skripten war an dieser Stelle nie vorgesehen.

MfG

Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 2 of 8
(5,434 Views)
Hallo,
in dem Zusammenhang habe ich die Frage, ob ich Parameter an einen Zusatztreiber-Block weitergeben kann.
mit dem Befehl
 call DACObjOpen("Kurven1")
kann ich ja bestimmte Parameter eines Blocks verändern, z.B.
      BLRANGEMINDISP(1)= R1
      BLRANGEMAXDISP(1)= R2

Dies fand ich mit Hilfe des Aufzeichnungsmodus heraus. Bei dem Zusatztreiber-Block (Signaleingang) jedoch verweigert der Aufzeichnungsmodus das Anklicken der zusätzlichen Geräteparameter oder die Einstellung des Signaltyps.
Bedeutet dies, es gibt auch keine Scriptbefehle, die diese Einstellungen vor Messbeginn in der Schaltung verändern könnten? Gibt es keinerlei Automatisierungsmöglichkeiten ausser der manuellen Eingabe dieser Konfigurationsparameter?
Dazu muß ich allerdings sagen, dass der Zusatztreiber eine mittels der GPI eigens hinzugefügte DLL darstellt, die evtl. Felder nicht berücksichtigt, um scriptgesteuert parametrisiert werden zu können.

Vielen Dank für eine Antwort.
Roland

0 Kudos
Message 3 of 8
(5,426 Views)
Zunächst einmal Danke für die Antwort, aber ich glaube, dass mein Problem noch ein wenig unklar ist.
Daher habe ich die Skript-Texte (in Kurzform) hier beigefügt.
Meiner Meinung nach ist das eigentliche Problem: Das Objekt oUDIM aus Skript 1 ist im Skript 2 nicht verfügbar, somit wird die Initialisierung nicht übernommen. Die Initialisierung muss jedoch außerhalb des DAC-Skripts (2) mit Hilfe von Anwendervariablen stattfinden und anschließend an den DAC-Skript übergeben werden. Kann das Objekt oUDIM irgendwie übergeben werden?
 
1. Skript: Hauptprogramm, welches Anwenderdialoge aufruft sowie die Schnittstelle mit den entsprechenden Parametern initialisiert
Sub SFD_Init( DeviceParam1V, DeviceParam2V, ErrorP )
    Set oUDIM=CreateObject("DIAdem.SFD.UDI" )
    If( Treibername_ = "COM" )then
    Call oUDIM.Open( Treibername_, DevicenameCOM_ )
    Call oUDIM.ParamSet( "BAUDRATE", Baudrate_ )
    Call oUDIM.ParamSet( "PARITY", Parity_ )
    Call oUDIM.ParamSet( "DATABITS", Databits_ )
    Call oUDIM.ParamSet( "STOPBITS", Stopbits_ )
    Call oUDIM.ParamSet( "DELIMITER", Delimiter_ )
  Else
    If( Treibername_ = "GfS GPIB" ) then
         ......
  Else
      If( Treibername_ = "NI GPIB" ) then
         ......
      Else
        If( Treibername_ = "TCP/IP" ) then
         ......          
        Else
          Call MsgBox ("Keinen gültigen Treiber ausgewählt!")
        End If
      End If
    End If
  End If
End Sub
'-------------------------------------------------------------------------------
'Hauptprogramm, welches abgearbeitet wird.
'Hier wird zunaechst die Anwendervariablendatei aktiviert, dann wird der Eingabedialog
'zum Parametrieren der Schnittstelle aufgerufen, und bei Abschluss der Eingabe mit OK
'wird die Schnittstelle initialisiert und die Messung gestartet.
'Bei Abbruch wird die Messung nicht gestartet.
'-------------------------------------------------------------------------------
Call USERVARCOMPILE(Variablendatei_Name,"new")        'Aktivieren der Anwendervariablen
Call SudDefLoad(Dialog_Pfad)                                               'Dialog laden
Call SudDlgShow("Dlg1")                                                        'Dialog starten
If Not DlgState = "IDCancel" Then
  Call SFD_Init()
  Call SCHEMELOAD("Messung_allgemein_1.1.DAC")           '... SCHEMEFILE
  Call SCHEMECHECK("normal")             
  Call SCHEMEMEASTEST()                                                    'Starten der Messung 
End If
 
2. Skript: DAC-Treiberskript mit Standard-Prozedur zum Auslesen der Schnittstelle
Sub SFD_DeInit(ErrorP )
  oUDIM.Close()
  Set oUDIM = Nothing
End Sub
'------------------------------------------------------------------------------
Sub SFD_ReadChannel( ChannelNumberP, ParamP, DataP, ErrorP )
    Dim   sgAntwortT
    sgAntwortT = oUDIM.Read()
    DataP = oUDIM.Parse(sgAntwortT,"%c %c %c %c %AD")
End Sub
0 Kudos
Message 4 of 8
(5,410 Views)
Hallo,
Jetzt verstehe ich ein bisschen besser, was Sie genau vorhaben. Die SFD_Init Funktion wird bei Ihnen also gar nicht aus einem Script DAC Block aufgerufen, sondern im Kontext des normalen VBS.

Im DIAdem gibt es zwar globale Variablen, dennoch gelten für den Script DAC Kontext wieder andere Regeln. In der Variable O1 zum Beispiel könnte man die Objektreferenz abspeichern - statt dem Bezeichner oUDIM - doch haben Sie vom SCRIPT DAC Block aus keinen Zugriff auf die Variable.

Am Besten wäre es, wenn Sie im Hauptskript nur den SUD aufrufen, nötige Parameter an die Parameterfelder des DAC Blockes übergeben und dann den Schaltplan starten. Belsaaen Sie die SFD_Init Funktion im Script DAC Block, dann umgehen Sie das Problem, dass sie vom VBS an den Block eine Objektreferenz übergeben müssen.

MfG
Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 5 of 8
(5,384 Views)
Hallo Roland,

nicht alle Variablen werden automatisch im Teachin Modus ins Skript übertragen. Es gibt jedoch 2 Methoden, dennoch an dioe gesuchten Variablennamen zu kommen:
  1. Die Tastaturkombination Strg&A, aufgerufen innerhalb eines Dialogfensters, kopiert die Variablen eines Dialoges in die Windows Zwischenablage, woraufhin Sie mit Strg&V in einem Skript eingefügt werden können. Wenn Strg&A während des Teachin Modus aufgerufen wird, werden die Variablen direkt in das Skript kopiert.
  2. Die Kontexthilfe aines Dialogs - aufgerufen durch den Hilfebutton - beschreibt sämtliche Parameter und nennt auch die Namen der Variablen, welche dahinterstehen.
Probieren Sie bitte mal diese beiden Versionen, um mehr über denb Treiberblock zu erfahren. Vielleicht liefert ja zumindest eine das gesuchte Ergebnis.

MfG

Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 6 of 8
(5,387 Views)
Hallo Ingo,
vielen Dank für Ihre Antwort. Ich bekomme nur etwas im Hauptdialogfenster des Zusatztreiber-Blocks etwas in die Zwischenablage:

Call DACObjOpen("DLL_In1" )
 BLDATAACTIVE(1)  ="Yes"
 BLDATAPINNO(1)   =0
 BLDATASIGNALNAME(1)="DLL_In1_1"
 BLDATAACTIVE(2)  ="Yes"
 BLDATAPINNO(2)   =1
 BLDATASIGNALNAME(2)="DLL_In1_2"
 BLDATAACTIVE(3)  ="Yes"
 BLDATAPINNO(3)   =2
 BLDATASIGNALNAME(3)="DLL_In1_3"
 BLDATAACTIVE(4)  ="Yes"
 BLDATAPINNO(4)   =3
 BLDATASIGNALNAME(4)="DLL_In1_4"
 BLDATAACTIVE(5)  ="Yes"
 BLDATAPINNO(5)   =4
 BLDATASIGNALNAME(5)="DLL_In1_5"
 BLDATAACTIVE(6)  ="Yes"
 BLDATAPINNO(6)   =5
 BLDATASIGNALNAME(6)="DLL_In1_6"
 BLDATAACTIVE(7)  ="Yes"
 BLDATAPINNO(7)   =6
 BLDATASIGNALNAME(7)="DLL_In1_7"
 BLDATAACTIVE(8)  ="Yes"
 BLDATAPINNO(8)   =7
 BLDATASIGNALNAME(8)="DLL_In1_8"
Call DACObjClose("DLL_In1" )

Bei Klick auf "Signaltyp" bekomme ich dieses:

Call 'Die folgenden Variablen sollten nicht in Scripten verändert werden. ()
Call DACObjOpen("DLL_In1" )
 BLINPTYPENAME    =""
Call DACObjClose("DLL_In1" )

Das ist okay, denn da ist sowieso nichts, was man verändern müsste.

Doch der eigentlich interessante Dialog, den ich gerne flexibel mit anderen IP-Adressen parametrisieren möchte, steckt eben hinter Druck auf den Knopf 'Gerät'. Und da tut sich nichts verändern bei Druck auf STRG+A. Smiley Sad



Bedeutet dies, dass man eine Schnittstelle in die zusätzliche DLL einprogrammieren muss, die mit Hilfe der GPI erstellt wurde? Wenn ja: wo oder wie bekomme ich Informationen darüber, wie man diese Schnittstelle für die Script-Parametrisierung mit einbaut?
cu,
Roland
°¿°

Message Edited by trixie on 03-31-200608:06 AM

0 Kudos
Message 7 of 8
(5,377 Views)
Hallo Roland,

wenn ich das richtig verstanden habe, dann handelt es sich bei dem Dialog zum parametrisieren der Schnittstelle um einen Dialog, den Sie selbst in Ihrem Treiber implementiert haben.

Da es sich bei den Variablen in diesem Dialog nicht um DIAdem Variablen handelt, kann DIAdem auch nicht per Script auf diese Variablen zugreifen. Um DIAdem einen Zugriff auf diese Variablen zu ermöglichen, müssen Sie diese über GPI anmelden. Weitere Informationen hierzu finden Sie in der GPI Hilfe unter dem Kapitel Variable API. Auf diese Weise ist es Ihnen dann möglich von DIAdem aus auf diese Variablen zuzugreifen. Da DIAdem aber keinerlei Informationen darüber hat welche Variablen in Ihrem Dialog verwendet werden ist es nicht möglich, eine Änderung von Variablen in diesem Dialog automatisch aufzuzeichnen oder mit CTRL-A in die Zwischenablage zu kopieren.

MfG


Rainer Hugo


0 Kudos
Message 8 of 8
(5,348 Views)