We are having a problem with ibrd and ibrda api calls used in a VB6 program
to communicate between two GPIB boards. Neither call returns data
to the application; ibrd causes a VB6 application error under some conditions.
Application goal: Pass data between two PCs using the GPIB interface.
Hardware: Compaq Deskpro; PCI-GPIB+ cards
Software versions: NT 4.0 build 1381 SP4
VB6 (SP3)
NIGLOBAL.BAS 1.7 7/29/99 3:38 pm
VBIB32.BAS 1.7 7/29/99 3:38 pm
One PC is configured as a controller, the other as a non-controller
(board 1, primary device address 1) . I created simple forms with
a button and a text box to display status and I/O data. Read/write
operations are instigated by clicking on the buttons.
Code:
Controller
Private Sub cmdWrite_Click()
QuitButton.Enabled = 0
ClearReadingsList 'clears text box
GPIBResults (vbCrLf + "Setup") 'displays gpib status data
Call ibfind("gpib0", Controller)
GPIBResults ("ibfind; controller is " + Str(Controller))
Call ibsic(GPIB0)
GPIBResults ("ibsic; controller is " + Str(Controller))
Call ibdev(0, 1, 0, 10, 1, 0, NonController) 'open interface
to non-controller pc
GPIBResults ("ibdev; controller is " + Str(NonController))
Call ibwrt(NonController, "help me")
GPIBResults ("ibWrt: ")
GPIBResults ("setup complete")
End Sub
Non-Controller
Private Sub cmdRead_Click()
Dim readbuffer1 As String
Dim readbuffer2 As String
Const LocalBoard = "GPIB1"
ClearReadingsList 'clear text box
Call GPIBResults(vbCrLf + "Setup") 'display gpib status data
Call ibfind(LocalBoard, NonController)
GPIBResults ("ibfind; noncontroller is: " + Str(NonController))
Call ibrsc(NonController, 0)
GPIBResults ("ibrsc")
Call ibpad(NonController, 1)
GPIBResults ("ibpad")
readbuffer1 = "ABCDEFG" ' stuff read buffer to force length
Call ibrda(NonController,readbuffer1)
GPIBResults (vbCrLf + "ibrda 1;" + vbCrLf + "RB IS :" + readbuffer1)
Call ibwait(NonController, &H6000)
GPIBResults (vbCrLf + "asynch read 1;" + vbCrLf + "rb1 is " + readbuffer1)
End Sub
VBIB32.BAS
Declare Function ibrda32 Lib "Gpib-32.dll" Alias "ibrda" (ByVal ud As Long,
sstr As Any, ByVal cnt As Long) As Long
Sub ibrda(ByVal ud As Integer, buf As String)
Dim cnt As Long
' Check to see if GPIB Global variables are registered
If (GPIBglobalsRegistered = 0) Then
Call RegisterGPIBGlobals
End If
cnt = CLng(Len(buf))
' Call the 32-bit DLL.
Call ibrd32(ud, ByVal buf, cnt)
' When Visual Basic remapping buffer problem solved, use this:
' Call ibrda32(ud, ByVal buf, cnt)
Call copy_ibvars
End Sub
Tests and Results
1. Controller to NI Interactive Control utility
Controller program executing on one PC, NI Interactive Control
executing on non-controller PC.
1) Keyed into NI Interactive Control: IBFIND GPIB1
IBRDA 10
IBWAIT 0X6000
2) Clicked on Write button on controller PC
3) Write data ("Help me") displayed in Interactive
Control utility on non-controller PC.
2. IBRDA with ByVal (Call ibrd32(ud, ByVal buf, cnt))
Controller program executing on one PC, Non-controller
program executing on other; NI-Spy executing on Non-controller
PC.
Clicked on Non-controller read button, then clicked on Controller
write button.
Results: No data returned to application; all statii good. NI-Spy
displayed ibrda(GPIB1,"help me",7(0x7))
3. IBRDA without ByVal (Call ibrd32(ud, buf, cnt))
Controller program executing on one PC, Non-controller program
executing on other; NI-Spy executing on Non-controller PC.
Clicked on Non-controller read button, then clicked on Controller
write button.
Results: VB6 application error: Instruction at 0x65343231
referenced memory at 0x706c6564. Memory could
not be read.
4. IBRDA32 with ByVal (Call ibrda32(ud, ByVal buf, cnt))
Commented out ibrd32 call; uncommented ibrda32 call.
Controller program executing on one PC, Non-controller program
executing on other; NI-Spy executing on Non-controller PC.
Clicked on Non-controller read button, then clicked on Controller
write button.
Results: No data returned to application; all statii good.
NI-Spy displayed ibrda(GPIB1,0x001B5274,7(0x7))
5. IBRDA32 without ByVal (Call ibrd32(ud, buf, cnt)
Commented out ibrd32 call; uncommented ibrda32 call.
Controller program executing on one PC, Non-controller
program executing on other; NI-Spy executing on Non-controller
PC.
Clicked on Non-controller read button, then clicked on Controller
write button.
Results: No data returned to application; all statii good.
NI-Spy displayed ibrda(GPIB1,0X0012F4A8,7(0x7))