NI產品與技術 討論區

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

VI_ERROR_RSRC_BUSY 訊息

hi all
我寫了一支小程式,利用 visa 的函數來對 device 做溝通,一切都正常可讀取/寫入

此時我開啟 NI-VISA MAX ,想對該 device 溝通,卻發生 VI_ERROR_RSRC_BUSY 訊息。
不知各位是否遇到類似的問題?!
測試環境: VISTA 32bits Home Basic, NI-VISA 4.4.1(Full)
0 積分
1 條訊息(共 21 條)
7,433 檢視

請問您的程式開始有使用VISA open,結束有使用VISA close嗎?

 

 

0 積分
2 條訊息(共 21 條)
7,419 檢視

我的程式在結束的時候會有viclose的動作!

然而當我執行我的程式時,也會去開啟 max ,來作讀寫的動作!

相同的做法確在 vista 下產生  VI_ERROR_RSRC_BUSY 訊息!

在 xp 下就一切正常!

0 積分
3 條訊息(共 21 條)
7,415 檢視

當我執行我的程式時,也會去開啟 max ,來作讀寫的動作

不建議在執行程式的時候開啟max作讀寫。

請在某時間點執行其中之一就好,

原因是兩支程式[ max & 你的程式 ] 再搶同一個device,會發生怪現象。

0 積分
4 條訊息(共 21 條)
7,413 檢視

hi

thanks

當然!以一般的情形下執行單一程式為最佳,

但也不能去限制使用者只能執行單一程式!

因為在 xp 的環境下是允許使用者開啟多個程式對單一設備做控制!

在 vista 的環境下就不允許使用者開啟多個程式對單一設備做控制!

這樣的改變是正常的嗎?因為我也沒看到官方對於這一問題有說明...

由 SunnyLee 在 08-27-2008 01:15 AM
上編輯的訊息
0 積分
5 條訊息(共 21 條)
7,407 檢視

其實跟xp,vista一點關係也沒有,兩個作業系統都支援多工。

您在處理這個案例要非常小心,因為max不是您寫的,所以您不知道裡面運作情形,今天vista不行,xp可以,只是碰巧遇到。

說不定你會另一台vista,說不定可以。

建議您自己寫兩支程式,可能的話必須使用類似semaphore...等等的功能來防止race condition發生。

 

0 積分
6 條訊息(共 21 條)
7,390 檢視

hi

thanks

若是一台 vista 不行那還可能是巧合,那如果是3台都一樣的情形咧?這還是巧合嗎?

 xp  的環境下,ni-visa 允許已被使用中的 session可被另一支程式額外再開一個新的 session 來連接!

vista 的環境下, ni-visa 不允許已被使用中的 session可被另一支程式額外再開一個新的 session 來連接!

真的很怪!底下是我用 VB 6.0 改寫 NI-VISA 所附的程式,這程式我同時開啟兩個來運作,結果是VISTA下不允許另一個程式來連接。

 

Private Declare Function viGetAttrString Lib "VISA32.DLL" Alias "#133" (ByVal vi As ViSession, ByVal attrName As ViAttr, ByVal strValue As Any) As ViStatus

Sub Main()
Const MAX_CNT = 200
Dim fList As ViFindList
Dim status As ViStatus
Dim sesn As ViSession, dfltRM As ViSession
Dim buffer As String * MAX_CNT, Desc As String * 256
Dim nList As Long, retCount As Long
Dim rsrcName As String * VI_FIND_BUFLEN, instrDesc As String * VI_FIND_BUFLEN
   
    status = viOpenDefaultRM(dfltRM)
    If (status < VI_SUCCESS) Then
        Rem Error initializing VISA ... exiting
        Exit Sub
    End If
    status = viFindRsrc(dfltRM, "USB?*INSTR", fList, nList, rsrcName)
    If (status < VI_SUCCESS) Then
        status = viStatusDesc(dfltRM, status, Desc)
        MsgBox "Error : " & Desc, vbOKOnly
        viClose (dfltRM)
        Exit Sub
    End If
    status = viOpen(dfltRM, rsrcName, VI_NULL, VI_NULL, sesn)
    If (status < VI_SUCCESS) Then
        status = viStatusDesc(dfltRM, status, Desc)
        MsgBox "Could not open resource ;" & rsrcName, vbOKOnly, "Status"
        MsgBox Desc, vbOKOnly
    Else
        status = viGetAttrString(sesn, VI_ATTR_INTF_INST_NAME, instrDesc)
        MsgBox "Resource :" & Trim(rsrcName), vbOKOnly
    End If
    instrDesc = ""
    status = viWrite(sesn, "read?", 5, retCount)
    status = viRead(sesn, buffer, MAX_CNT, retCount)
    If status < 0 Then
        status = viStatusDesc(sesn, status, Desc)
        MsgBox "Error : " & Desc, vbOKOnly
    Else
        MsgBox "The Value : " & buffer, vbOKOnly
    End If
    buffer = ""
    viClear (sesn)
    viGpibControlREN sesn, VI_GPIB_REN_DEASSERT_GTL
    stat = viClose(fList)
    stat = viClose(dfltRM)
       
End Sub

0 積分
7 條訊息(共 21 條)
7,378 檢視
想跟您確認一些問題,如果您分開控制會有問題麼?
 看了一下您的程式,想了解一下您在
 viOpen(dfltRM, rsrcName, VI_NULL, VI_NULL, sesn)
 的目的為何?
 因為如果您如果是想要兩個session分開使用,應該是分別開open來完成.
 麻煩您了.謝謝
0 積分
8 條訊息(共 21 條)
7,342 檢視

HI~Thanks 不好意思可能我的問題表示不清楚。

一、 分開控制,您是指兩個專案個別分開控制嗎?!

若是,導致我其中的一個專案無法順利與設備溝通。其回應 ERROR CODE:BFFF0072h 。

因為專案未結束,所以session尚未被關閉,因此另一專案無法順利與設備溝通。

二、 viOpen(dfltRM, rsrcName, VI_NULL, VI_NULL, sesn) 的目的為何?

The viOpen() operation opens a session to the specified resource. It returns a session identifier that can be used to call any other operations of that resource.

以上是擷取NI-VISA的HELP文件。 請教一下,依您的觀念看我的程式有問題嗎?

三、 我重新敘述我的問題。

我開兩個專案,其程式內容如上,

我面臨的問題是,以上面同樣程式內容,在兩個專案底下去連接設備, 其中會有一個專案無法順利與設備溝通,

其回應的 ERROR CODE:BFFF0072h

根據 NI-VISA的 HELP查出其敘述為:The resource is valid, but VISA cannot currently access it.

這種情況只在 VISTA 下發生,在 XP 下不會發生。

NI-VISA版本均為4.4.1

XP版本為XP sp3

VISTA版本為 VISTA sp1

0 積分
9 條訊息(共 21 條)
7,329 檢視

Hi 您好:

            

             如果您是對同一台儀器,基本上我們無法同時讓兩個專案同時去控制他.

             假設您今天已經開了一個session,同時並沒有關閉此session,

             那麼此VISA 的資源就會被佔有,此時無論您開MAX或是在寫一個程式都無法控制他的.

             所以並不是您宣告兩個session就可以同時控制他.

             這種情況只在 VISTA 下發生,在 XP 下不會發生。

             不知道在XP底下正常的狀況是如何? 一樣是讓SESSION沒有關閉,然後用MAX去讀取他麼?

      

Thanks,      

Jay

0 積分
10 條訊息(共 21 條)
7,305 檢視