General Purpose Interface Bus(GPIB)

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
kaspar
Beiträge: 18
Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark

General Purpose Interface Bus(GPIB)

Beitrag von kaspar »

Ich beschäftige mich hauptsächlich mit Fernsteuerungen von Messgeräten
Bei der Suche nach einener Sprache die schnell (?) und einfach und ohne viele Runtimelibs. auskommt habe ich ebend mal PB ausprobiert und bin recht zufrieden.
Nun müsste ich eigentlich lange Erklärungen abgeben, aber ich glaube, wer sich damit beschäftigen muss versteht das vorgestellte Konzept. Es erhebt auch keinen Anspruch auf Vollsdtändigkeit, weil nicht alle Möglichkeiten der GPIB ausgeschöpt sind. Aber wie die COM-Schnittstellen hat der GPIB immer noch seine Berechtigung und man kann anhand der *.h Dateien leicht nachrüsten. Na, die Implementation meines Code is nicht so gut.

Code: Alles auswählen

;== Const. Definitionen 
#GpibLib=0

;== Globale  Definition 
Global  BrdID.l = 0, ok.l=1,RecStr.s{256}

Global *PDevClear.l, *Pibln.l, *PEnableRemote.l, *PEnableLocal.l, *PReadStatusByte
Global *PReceive.l,  *PSend.l, *PSendIFC.l,      *PTestSRQ.l, *PWaitSRQ.l,*PTmo.l
Global *PResetBoard.l  

;== Array, Structuren =====================================================

Global Dim DevName.s(30),Dim AddrLstn.l(30),Dim Tmp.l(30)

;== Prototypen ============================================================

;== Declare Functionen usw.================================================

Declare.b  OpenLib()
Declare    CloseLib()

;== Functionen ============================================================
Procedure.l PointerToFunction()
 *PDevClear      =GetFunction(#GpibLib,"DevClear")
 *Pibln          =GetFunction(#GpibLib,"ibln")
 *PEnableRemote  =GetFunction(#GpibLib,"EnableRemote")
 *PEnableLocal   =GetFunction(#GpibLib,"EnableLocal")
 *PReadStatusByte=GetFunction(#GpibLib,"ReadStatusByte")
 *PReceive       =GetFunction(#GpibLib,"Receive")   
 *PSend          =GetFunction(#GpibLib,"Send")     
 *PSendIFC       =GetFunction(#GpibLib,"SendIFC")
 *PTestSRQ       =GetFunction(#GpibLib,"TestSRQ")
 *PWaitSRQ       =GetFunction(#GpibLib,"WaitSRQ")
 *PTmo           =GetFunction(#GpibLib,"ibtmo")
 *PResetBoard    =GetFunction(#GpibLib,"ibonl")
 
If    (*PDevClear=0) Or (*Pibln=0) Or (*PEnableRemote=0) Or (*PEnableLocal=0)
  ProcedureReturn #False
ElseIf ((*PReadStatusByte=0) Or (*PReceive=0) Or (*PSend=0) Or (*PSendIFC=0))
  ProcedureReturn #False
ElseIf ((*PTestSRQ=0) Or (*PWaitSRQ=0) Or (*PTmo=0) Or (*PResetBoard=0))
  ProcedureReturn #False
Else 
  ProcedureReturn #True
EndIf
EndProcedure

Procedure.b DevClear(addr.l)
  ok=#True
  CallFunctionFast(*PDevClear,BrdID,addr)
  If ( ibsta & Err)>0:ok=#False: EndIf
  ProcedureReturn ok
EndProcedure

Procedure FindLstnAddr(AddrList(1))
  For Index.l=1 To 30
    Status.l= CallFunctionFast(*Pibln,BrdID,Index,NO_SAD,@listen.l)
    If ((( Status & Err)=0) And listen)
      DevClear(Index);
      AddrList(Cnt)=Index
      Cnt=Cnt+1
    EndIf
  Next
  AddrLstn(Cnt)=-1
EndProcedure

Procedure.b SetRemote(addr.l)
  Tmp(0)=addr:Tmp(1)=-1:ok=#True
  CallFunctionFast(*PEnableRemote,BrdID,Tmp())
  If ( ibsta & Err):ok=#False: EndIf
  ProcedureReturn ok
EndProcedure

Procedure.b SetLocal(addr.l)
  Tmp(0)=add:Tmp(1)=-1:ok=#True
  CallFunctionFast(*PEnableLocal,BrdID,Tmp())
  If ( ibsta & Err): ok=#False: EndIf
  ProcedureReturn ok
EndProcedure

; SerialPoll in "result" ist das zurückgegebene Statusbyte
Procedure.b ReadStatusByte(addr.l)
  CallFunctionFast(*PReadStatusByte,BrdID,addr,@Result.l)
  If ( ibsta & Err):
    ProcedureReturn #False
  EndIf
  ProcedureReturn Result
EndProcedure

; Strings werden als Zeiger auf String zurückgegeben. "PeekS(wert.l)" anwenden
Procedure.l Receive(DevAddr.l)
   Cnt.l=CallFunctionFast(*PReceive,BrdID,DevAddr,@RecStr,$100,mode=$0A)
  If ( ibsta & Err): ProcedureReturn #False:EndIf
  ProcedureReturn @RecStr
EndProcedure  

Procedure.b Send(DevAddr.l,Command.s,mode.l=$01)
  ok=#True
  CallFunctionFast(*PSend,BrdID,DevAddr,Command,Len(Command),mode)
  If ( ibsta & Err): ok=#False: EndIf
  ProcedureReturn ok
EndProcedure

Procedure.b SendIFC(); Setzt das Board zurück und aktiviert es
  CallFunctionFast(*PSendIFC,BrdID)
  If (ibsta & Err) : ProcedureReturn #False: EndIf 
  ProcedureReturn #True
EndProcedure

;Testet die SRQ Line. 0 | 1. (1)SRQ aktiv , (0) SRQ inaktiv
Procedure.b TestSRQ(); 
  CallFunctionFast(*PTestSRQ,BrdID,@Result.l)
  If (ibsta & Err): ProcedureReturn #False : EndIf 
  ProcedureReturn Result
EndProcedure

Procedure.b WaitSRQ(); 0 | 1 (1) SRQ ist aktiv , (0) SRQ nicht aktiv und Time Out ist aktiv 
  CallFunctionFast(*PWaitSRQ,BrdID,@Result.b)
  If (ibsta & Err): ProcedureReturn #False : EndIf
  ProcedureReturn Result
EndProcedure

;TNONE(0)- no limit,T10us(1),T30us(2),T100us(3),T300us(4),T1ms(5),T3ms(6),T10ms7)
;T30ms(8),T100ms(9),T300ms(10),T1s(11),T3s(12),T10s(13),T30s(14),T100s(15)
;T300s(16),T1000s(17)
Procedure.b Tmo(time.l)
  CallFunctionFast(*PTmo,BrdID,time)
  If (ibsta & Err): ProcedureReturn #False : EndIf
  ProcedureReturn #True
EndProcedure

Procedure.b ResetBoard(); Reset der Hard- und Software. Muss mit SendIFC reaktiviert werden
  CallFunctionFast(*PResetBoard,BrdID,0)
  If (ibsta & Err): ProcedureReturn #False: EndIf
   ProcedureReturn #True
EndProcedure

;== Öffnen und Schliessen der Library ====================================
Procedure.b OpenLib(); Öffnen der Library und Interface clear
  open = OpenLibrary(#GpibLib,"GPIB-32.Dll")
  If (open <> 0)
    open=#True
    If PointerToFunction()=0
      MessageRequester("Error: GPIB-32.dll","Can not read the functions address in DLL (Gpib-32.dll)")
      ProcedureReturn 0
    EndIf
  open=SendIFC()
  EndIf
ProcedureReturn open
EndProcedure

Procedure CloseLib()
  CloseLibrary(#GpibLib)
EndProcedure





;== Zusammengesetzte Prozeduren ==========================================

Procedure.s SearchDevName(addr.l)
  SetRemote(addr)
  If Send(addr,"*IDN?",$1)
    Rec.l=Receive(addr)
    If Rec<>0:ProcedureReturn PeekS(Rec): EndIf
  Else
    ProcedureReturn "none"
  EndIf
EndProcedure
matt007
Beiträge: 6
Registriert: 07.06.2012 11:59

Re: General Purpose Interface Bus(GPIB)

Beitrag von matt007 »

Hallo Kaspar,

Dein Beitrag gefällt mir gut. Auch ich möchte gerne GPIB ansprechen - über eine Karte GPIB-PCMCIA von NI. Ist es möglich daß wir uns da austauschen? Meine mail ist matthias.weisser (at) gmx (dot) de.

Viele Grüße und vielen Dank für Deinen Beitrag !

Matthias
Antworten