在 08-26-2008 09:07 PM
請問您的程式開始有使用VISA open,結束有使用VISA close嗎?
我的程式在結束的時候會有viclose的動作!
然而當我執行我的程式時,也會去開啟 max ,來作讀寫的動作!
相同的做法確在 vista 下產生 VI_ERROR_RSRC_BUSY 訊息!
在 xp 下就一切正常!
在 08-27-2008 12:42 AM
當我執行我的程式時,也會去開啟 max ,來作讀寫的動作
不建議在執行程式的時候開啟max作讀寫。
請在某時間點執行其中之一就好,
原因是兩支程式[ max & 你的程式 ] 再搶同一個device,會發生怪現象。
08-27-2008 01:14 AM - 已編輯 08-27-2008 01:15 AM
hi
thanks
當然!以一般的情形下執行單一程式為最佳,
但也不能去限制使用者只能執行單一程式!
因為在 xp 的環境下是允許使用者開啟多個程式對單一設備做控制!
在 vista 的環境下就不允許使用者開啟多個程式對單一設備做控制!
這樣的改變是正常的嗎?因為我也沒看到官方對於這一問題有說明...
在 08-27-2008 06:31 AM
其實跟xp,vista一點關係也沒有,兩個作業系統都支援多工。
您在處理這個案例要非常小心,因為max不是您寫的,所以您不知道裡面運作情形,今天vista不行,xp可以,只是碰巧遇到。
說不定你會另一台vista,說不定可以。
建議您自己寫兩支程式,可能的話必須使用類似semaphore...等等的功能來防止race condition發生。
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
在 09-01-2008 07:55 AM
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
Hi 您好:
如果您是對同一台儀器,基本上我們無法同時讓兩個專案同時去控制他.
假設您今天已經開了一個session,同時並沒有關閉此session,
那麼此VISA 的資源就會被佔有,此時無論您開MAX或是在寫一個程式都無法控制他的.
所以並不是您宣告兩個session就可以同時控制他.
這種情況只在 VISTA 下發生,在 XP 下不會發生。
不知道在XP底下正常的狀況是如何? 一樣是讓SESSION沒有關閉,然後用MAX去讀取他麼?
Thanks,
Jay