Aktuelle Zeit: 18.11.2018 06:00

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: General Purpose Interface Bus(GPIB)
BeitragVerfasst: 16.12.2006 13:40 
Offline

Registriert: 17.10.2006 06:19
Wohnort: 15859 Storkow/Mark
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:
;== 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: General Purpose Interface Bus(GPIB)
BeitragVerfasst: 11.07.2014 18:23 
Offline

Registriert: 07.06.2012 11:59
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye