Frequenzgenerator mit PB über DLL ansprechen

Für allgemeine Fragen zur Programmierung mit PureBasic.
matt007
Beiträge: 6
Registriert: 07.06.2012 11:59

Frequenzgenerator mit PB über DLL ansprechen

Beitrag von matt007 »

beim Velleman PCGU1000-Frequenzgenerator wird die DLL-Datei FGULINK.dll zur Ansteuerung mitgeliefert.

Es gibt Beispiele für VB und Delphi die zeigen daß das prinzipiell klappt. Siehe unten.
Nur wie kann ich diese DLL von PB aus zielführend ansprechen?

Die Idee war diese Befehle zu nutzen:

Code: Alles auswählen

If OpenLibrary(0, "FGULINK.dll") ; sollte die dll öffnen
     CallFunction(0, "OpenGen") ; sollte den Generator bereit machen
     CallFunction(0, "ShowGen") ; sollte ein Menü dazu anzeigen
EndIf
Nur leider erscheint das Menü nicht.
Was mache ich falsch?

Gibt es ein erprobtes Beispiel das ich zum Thema DLL probieren kann?

Grüße
Matthias


Beispiel für VB:

Code: Alles auswählen

Option Explicit
' Deklarationen für die DLL-Unterfunktionen aus FGULink.dll

Private Declare Sub SetGen Lib "FGULink.dll" (ByVal func As Long, ByVal freq As Single, ByVal ampl As Single, ByVal offset As Single)

Private Declare Sub SetSweep Lib "FGULink.dll" (ByVal freq1 As Single, ByVal freq2 As Single, ByVal ampl As Single, ByVal offset As Single, ByVal time As Single, ByVal Form As Long)

Private Declare Sub SetLibWave Lib "FGULink.dll" (ByVal freq As Single, ByVal ampl As Single, ByVal offset As Single, ByVal filter As Long, ByVal Pointer As String)

Private Declare Sub StartGen Lib "FGULink.dll" ()
Private Declare Sub StopGen Lib "FGULink.dll" ()
Private Declare Sub OpenGen Lib "FGULink.dll" ()
Private Declare Sub CloseGen Lib "FGULink.dll" ()
Private Declare Function GenReady Lib "FGULink.dll" () As Boolean
Private Declare Function GenStatus Lib "FGULink.dll" () As Long
Private Declare Sub ShowGen Lib "FGULink.dll" (ByVal status As Boolean)
Private Declare Sub AttOn Lib "FGULink.dll" (ByVal att As Boolean)
Private Declare Sub LogSweep Lib "FGULink.dll" (ByVal log As Boolean)

Private Sub Form_Terminate() ' Formular beenden
CloseGen ' Generator abschalten
End Sub

Private Sub Command5_Click() ' turn on generator
OpenGen ' Generator einschalten OpenGen
End Sub

Private Sub Command6_Click() ' turn off generator
CloseGen ' Generator abschalten CloseGen
End Sub

Private Sub Command2_Click() ' sinus 150Hz 8.5Vss 0.1Voffset
SetGen 1, 150, 8.5, 0.1 ' Generator einstellen SetGen
StartGen ' Generator starten
End Sub

Private Sub Command1_Click() ' rectangle 1500Hz 5.5Vss 2Voffset
SetGen 2, 1500, 6.5, 2 ' Generator einstellen SetGen
StartGen ' Generator starten
End Sub

Private Sub Command3_Click() ' triangle 1000Hz 5Vss 0Voffset
SetGen 3, 1000, 5, 0 ' Generator einstellen
StartGen ' Generator starten
End Sub

Private Sub Lib_Click() ' 1000Hz 5Vss 0Voffset filter on pointer auf burst2.lib
Dim s As String ' Stringvariable s für Pointer
s = "burst2.lib" ' Library burst2.lib
SetLibWave 1000, 5, 0, 1, s ' LibWave auswählen
StartGen ' Generator starten
End Sub

Private Sub Sweep_Click() ' sweep log 100Hz-20000Hz 5Vss 0Voffset 5s sinus
LogSweep (True) ' Generator auf log sweep
SetSweep 100, 20000, 5, 0, 5, 1 ' Generator einstellen
StartGen ' Generator starten
End Sub

Private Sub Command4_Click() ' sweep lin 1000Hz-20000Hz 5Vss 0Vss 10Voffset rect
LogSweep (False) ' Generator auf lin sweep
SetSweep 1000, 20000, 5, 0, 10, 2 ' Generator einstellen
StartGen ' Generator starten
End Sub

Private Sub Run_Click(Index As Integer) '
StartGen ' Generator starten
End Sub

Private Sub Stop_Click(Index As Integer) ' stop
StopGen ' Generator stoppen
End Sub

Private Sub Check1_Click() ' 40dB Attenuator On/Off toggle
If Check1.Value = 1 Then AttOn (True) Else AttOn (False)
End Sub

Private Sub Check2_Click() ' Hide Generator On/Off toggle
If Check2.Value = 1 Then ShowGen (False) Else ShowGen (True)
End Sub

Private Sub Timer1_Timer() ' Timer1 100ms
If GenReady Then Label1.Caption = "Generator Ready" _
Else: Label1.Caption = "Generator Not Ready" ' Label1
Label2.Caption = "Status: " & GenStatus ' Label2
End Sub
// Edit: Code-Tags hinzugefügt (Kiffi)
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

Re: Frequenzgenerator mit PB über DLL ansprechen

Beitrag von DePe »

Du musst der Prozedur auch die Parameter übergeben.
Ich glaube VB Classic verwendet -1 für Boolean True, ansonst mit #True probieren.

Code: Alles auswählen

If OpenLibrary(0, "FGULINK.dll") ; sollte die dll öffnen
     CallFunction(0, "OpenGen") ; sollte den Generator bereit machen
     CallFunction(0, "ShowGen", -1) ; sollte ein Menü dazu anzeigen
EndIf
In der PB Hilfe findest du unter 'Library' mehr Info, auch zu 'Prototypes'.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Frequenzgenerator mit PB über DLL ansprechen

Beitrag von - chris - »

Der Befehl "ShowGen(1)" startet das Programm "FGU.exe"

Code: Alles auswählen


Global FGULINK_hDLL.i

;- Prototype
Prototype.i GenReady()
Prototype.i SetLibWave(freq.f, ampl.f, offset.f, filter.i, FileName.p-ascii)
Prototype.i SetSweep(freq1.f, freq2.f, ampl.f, offset.f, time.f, form.i)
Prototype.i SetGen(func.i, freq.f, ampl.f, offset.f)
Prototype.i GenStatus()
Prototype.i LogSweep(log.i)
Prototype.i AttOn(att.i)
Prototype.i ShowGen(visible.i)
Prototype.i CloseGen()
Prototype.i OpenGen()
Prototype.i StopGen()
Prototype.i StartGen()

Procedure FGULINK_CloseDLL()
  If FGULINK_hDLL <> 0
    If IsLibrary(FGULINK_hDLL)
      CloseLibrary(FGULINK_hDLL)
    EndIf
    FGULINK_hDLL = 0
  EndIf
EndProcedure

Procedure FGULINK_OpenDLL()

  FGULINK_hDLL = OpenLibrary(#PB_Any, "FGULINK.dll")
  If FGULINK_hDLL = 0
    ProcedureReturn #False
  EndIf

  Global GenReady.GenReady=GetFunction(FGULINK_hDLL,"GenReady")
  Global SetLibWave.SetLibWave=GetFunction(FGULINK_hDLL,"SetLibWave")
  Global SetSweep.SetSweep=GetFunction(FGULINK_hDLL,"SetSweep")
  Global SetGen.SetGen=GetFunction(FGULINK_hDLL,"SetGen")
  Global GenStatus.GenStatus=GetFunction(FGULINK_hDLL,"GenStatus")
  Global LogSweep.LogSweep=GetFunction(FGULINK_hDLL,"LogSweep")
  Global AttOn.AttOn=GetFunction(FGULINK_hDLL,"AttOn")
  Global ShowGen.ShowGen=GetFunction(FGULINK_hDLL,"ShowGen")
  Global CloseGen.CloseGen=GetFunction(FGULINK_hDLL,"CloseGen")
  Global OpenGen.OpenGen=GetFunction(FGULINK_hDLL,"OpenGen")
  Global StopGen.StopGen=GetFunction(FGULINK_hDLL,"StopGen")
  Global StartGen.StartGen=GetFunction(FGULINK_hDLL,"StartGen")

  ProcedureReturn #True
EndProcedure

Code: Alles auswählen


EnableExplicit

Define res.i

IncludeFile "FGULINK.pbi"

If FGULINK_OpenDLL()
  
  OpenGen()
  Debug "OpenGen"
  
  Delay(10000)
  
  res = GenStatus()
  Debug "GenStatus: " + Str(res)
  
  SetGen(1, 150.5, 8.5, 0.1)
  Debug "SetGen"
  
  ShowGen(1)
  Debug "ShowGen - 1"
  
  Delay(10000)
  
  ShowGen(0)
  Debug "ShowGen - 0"  
  
  Delay(1000)
  
  CloseGen()
  Debug "CloseGen"
  
  FGULINK_CloseDLL()
  
EndIf

End

PB v5.72 x86/x64
Windows 10 Pro 64bit
matt007
Beiträge: 6
Registriert: 07.06.2012 11:59

Re: Frequenzgenerator mit PB über DLL ansprechen

Beitrag von matt007 »

DePe hat geschrieben:Du musst der Prozedur auch die Parameter übergeben.
Ich glaube VB Classic verwendet -1 für Boolean True, ansonst mit #True probieren.

Code: Alles auswählen

If OpenLibrary(0, "FGULINK.dll") ; sollte die dll öffnen
     CallFunction(0, "OpenGen") ; sollte den Generator bereit machen
     CallFunction(0, "ShowGen", -1) ; sollte ein Menü dazu anzeigen
EndIf
In der PB Hilfe findest du unter 'Library' mehr Info, auch zu 'Prototypes'.
Vielen Dank !
Leider klappt es so noch nicht. Das hängt irgendwie.
matt007
Beiträge: 6
Registriert: 07.06.2012 11:59

Re: Frequenzgenerator mit PB über DLL ansprechen

Beitrag von matt007 »

vielen Dank Chris für diesen wertvollen Beitrag.
Leider bringe ich es als PB-Anfänger noch nicht zum Laufen.

Ich habe den oberen Teil in eine Datei fgulink.pbi geschoben und den 2. Teil in eine Datei pb_velleman.pb.

Wenn ich pb_velleman.pb aufrufe so wird bei Compile/Run das fgulink.pbi eingebunden.

Das Ganze habe ich im Ordner FGU_Link_Demo_VB6 probiert wo ja die DLL liegt und FGU.exe.

Es kommt nur leider eine Fehlermeldung Line 4: Prototype already declared: GenReady. Irgendwas läuft noch schief.

Vielleicht hast Du eine Idee was ich da noch ändern/beachten muss.

Gruss
Matthias
Antworten