NI產品與技術 討論區

取消
顯示結果 
搜尋替代 
您的意思是: 

gpib

請問以 VB + GPIB 與儀器(Agilent 4268A)進行溝通, 為何每次執行後,按Trigger 按鈕到第 28 次後,即出現以下訊息:敬請各位先進不吝賜教,謝謝!
 
出現異常訊息如下: 
Unable to write to device
ibsta=&H8100
iberr=0<EDVR>
 
程式碼如下:
Const BDINDEX = 0                  ' Board Index
'Const PRIMARY_ADDR_OF_DMM = 1      ' Primary address of device
'Const PRIMARY_ADDR_OF_DMM = 2
Const NO_SECONDARY_ADDR = 0       ' Secondary address of device
Const TIMEOUT = T10s               ' Timeout value = 10 seconds
Const EOTMODE = 1                  ' Enable the END message
Const EOSMODE = 1                  ' Disable the EOS mode
Const ARRAYSIZE = 1024      ' Size of read buffer
Dim ErrMsg As String * 100
Dim Dev As Integer
Dim ErrorMnemonic
Dim ValueStr As String * ARRAYSIZE
Dim Response As Integer
Dim sendstr As String
Private Sub Command1_Click()
End Sub
Private Sub GPIBCleanup(msg$)
    ' After each GPIB call, the application checks whether the call
    ' succeeded. If an NI-488.2 call fails, the GPIB driver sets the
    ' corresponding bit in the global status variable. If the call
    ' failed, this procedure prints an error message, takes the device
    ' offline and exits.
   ErrorMnemonic = Array("EDVR", "ECIC", "ENOL", "EADR", "EARG", _
                          "ESAC", "EABO", "ENEB", "EDMA", "", _
                          "EOIP", "ECAP", "EFSO", "", "EBUS", _
                          "ESTB", "ESRQ", "", "", "", "ETAB")
    ErrMsg$ = msg$ & Chr(13) & "ibsta = &H" & Hex(ibsta) & Chr(13) _
              & "iberr = " & iberr & " <" & ErrorMnemonic(iberr) & ">"
    MsgBox ErrMsg$, vbCritical, "Error"
    ilonl Dev%, 0
    End
End Sub
Private Sub Form_Load()
    Const PRIMARY_ADDR_OF_DMM = 1
    Dev% = ildev(BDINDEX, PRIMARY_ADDR_OF_DMM, NO_SECONDARY_ADDR, _
                 TIMEOUT, EOTMODE, EOSMODE)
    If (ibsta And EERR) Then
        ErrMsg = "Unable to open device" & Chr(13) & "ibsta = &H" & _
        Chr(13) & Hex(ibsta) & "iberr = " & iberr
        MsgBox ErrMsg, vbCritical, "Error"
        End
    End If
    ' The application resets the GPIB portion of the device by calling
    ' ilclr.
    ilclr Dev%
 
End Sub
Private Sub Trigger_Com_Click()
Dim displaystr As String
Dim CapVal, DFval As String
Debug.Print "trig cap"
Const PRIMARY_ADDR_OF_DMM = 1      ' Primary address of device
Dev% = ildev(BDINDEX, PRIMARY_ADDR_OF_DMM, NO_SECONDARY_ADDR, _
                 TIMEOUT, EOTMODE, EOSMODE)
                
  ilclr Dev%
 
    sendstr = ":TRIG:SOUR BUS ; *TRG"
    ilwrt Dev%, sendstr, Len(sendstr)
   If (ibsta And EERR) Then
        Call GPIBCleanup("Unable to write to device")
   End If
    ' The application reads the ASCII string from the multimeter into
    ' the ValueStr variable.
    ilrd Dev%, ValueStr, Len(ValueStr)
    If (ibsta And EERR) Then
        Call GPIBCleanup("Unable to read from device")
    End If
   displaystr = Left$(ValueStr, ibcntl - 1)
   CapVal = Mid(displaystr, 4, 12)
   DFval = Mid(displaystr, 17, 12)
 
  Text1(0).Text = Val(CapVal) * 10 ^ 9
  Text1(1).Text = Val(DFval)
End Sub
0 積分
1 條訊息(共 7 條)
6,864 檢視
榮,您好:
 
在您的程式中
按下trigger後大概會做以下動作:
ildev   ->  開啟並初使化device的descriptor
ilclr     ->  clear device
ilwrt    ->  寫訊息到device
ilrd      ->  從device讀出訊息
然後將讀出的資料show在您視窗的Text上
 
問題應該是出在 ildev
因為每次您按下trigger 就會開啟一個descriptor但並沒有關閉它(ilonl)
太多次後便會出現EDVR的error
(如果是IB-style 應該是出現在第1024次 您使用的IL-style我就不清楚了)
 
 
您可以試試以下方法:
 
Trigger_Com_Click()這個Sub中的 ildev 與 ilclr 拿掉
因為您在Form_Load裡就已經先做了
每次按下trigger便使用同一個descriptor
 
 
Trigger_Com_Click()的最後
加上 ilonl 來close掉每次開啟的descriptor
 
 
另外提供您以下網址供參考:
(英文論壇的問題-- 他使用的是IB-style 但問題與您的情形差不多 )
(中文知識庫-- 解釋Error -1)
 
 
麻煩您再試試看囉
希望能解決您的問題
 
謝謝
Jimmy Ko
0 積分
2 條訊息(共 7 條)
6,846 檢視
非常感謝您!
您說的沒錯,後來我Debug ildev 中的 dev%,其中的值我每次tirgger 一次,它的值就往下遞減,從form_load的"39" 持續遞減至"9"後,再trigger一次,就從"9"變成"-1",則error發生。因為我們用GPIB控制兩台不同的METER ( 廠牌、功能均不同),所以發生ERROR的頻率很高。
我試試您的作法,感謝您的支援。
 
                                                     PDC 榮
0 積分
3 條訊息(共 7 條)
6,835 檢視
Jimmy 您好
 
1、今天試了還是一樣,您是指將 ilonl Dev%,0 放在trigger_com 程式的最後面嗎?我試了,沒作用。
2、另外請教IL_Style 與 IB-style 作用有何不同?
3、下trigger comm 之後,要使2台meter(功能、廠牌均不同),開始進行量測動作。再按一button之後才將量測後的值show在Text上。
       請問是在每次作業前均需要 開啟並初使化device嗎?若是指定Dev%它的值,這樣可行嗎?
 
不好意思,小弟才疏學淺,請不吝指教。謝謝!
 
                                                                    PDC    榮
0 積分
4 條訊息(共 7 條)
6,824 檢視
關於IL-style與IB-style
您可以參考這個網頁:
(Using IL-style Function Calls with the 32-bit GPIB Language Interface for Visual Basic)
大致上來說 ib-style 是現在比較常被使用的(也是比較新的)
ib-style 的出現是為了使得程式語法跟 C 語言較為一致
文中也提到若要了解如何使用 il-style 的語法
可以抓較舊版本的example來看(文中有各版本的連結)
可能需要麻煩您在抓來參考一下了
 
有任何問題歡迎進一步提出討論
謝謝
Jimmy Ko
0 積分
5 條訊息(共 7 條)
6,798 檢視
謝謝您,受益良多,我再研究看看。
0 積分
6 條訊息(共 7 條)
6,792 檢視
感謝 NITW AE Jimmy ,問題解決了 !   
初始化後,每次要trigger時,直接以iltrg函數來呼叫dev%即可。
 
謝謝您的指導。
 
 
 
                                  pdc  榮
0 積分
7 條訊息(共 7 條)
6,751 檢視