請問VISA GPIB session的問題

小弟目前在進行自動化儀器控制之程式撰寫
在儀器控制完畢之後 都會做一個visa close的動作
但若是在未完成之前 經常程式還沒有跑到visa close的地方 就掛掉了
經過abort後 導致該session沒有被關掉
而下次再次操作儀器時
有很大的機會導致 儀器session 打不開
請問未正常關閉的session該如何手動關閉 ?

 

另外 若debug很多次之後
visa gpib resource 中會有很多

gpib0::18::instr(1)
gpib0::18::instr(2)
gpib0::18::instr(3)

之類的東西 請問這些代表的意思是?
其中(1)是代表通道數嗎? 還是有其他的意思?

比較好的做法是在遇到錯誤的時侯做一次visa close

或是在初始化之前先做一次visa close以重新取得控制權

此方式用在serial跟GPIB都OK :)

補上visa gpib resource的圖片

![](upload://pVEXCVqTexmiGiPjQxizAqIkCqU.jpeg)

紅框為多出來的resource

剛試了一下發現,當使用VISA CLOSE 並在resource選擇以上幾個後面有(number)的 resource
RUN完後,可以成功關閉 那些有(number)的 resource,
不知是否這些就是未關閉的resource ?

不知是否有方法 能夠自動能關閉這些未關閉的resource? 謝謝!

yehcat40508.4945138889

<span =“bold” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none; font-weight: normal;”>yehcat大大,

<span =“bold” style=“font-size: medium; -sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none;”>    您好, 目前小弟也遇到相同的問題: 由於GPIB的選項位址會因每次的執行自動增加, 這會造成後方程式在判斷儀器連線位置時出錯, 進而造成抓取量測數據錯誤, 所以想請問不知道是否前輩最後是如何解決的呢?
<span =“bold” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none; font-weight: normal;”>
<span =“bold” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none;”>謝謝!  <span =“bold” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none;”>  

[QUOTE=ZLTYlabview]<span =“bold”=“” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none; font-weight: normal;”>yehcat大大,

<span =“bold”=“” style=“font-size: medium; -sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none;”>    您好, 目前小弟也遇到相同的問題: 由於GPIB的選項位址會因每次的執行自動增加, 這會造成後方程式在判斷儀器連線位置時出錯, 進而造成抓取量測數據錯誤, 所以想請問不知道是否前輩最後是如何解決的呢?
<span =“bold”=“” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none; font-weight: normal;”>
<span =“bold”=“” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none;”>謝謝!  <span =“bold”=“” style=“-sizing: border-; background-image: initial; background-: 0px 0px; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; text-decoration-line: none;”>  
[/QUOTE]

每次VISA OPEN完後,記得要在同一個session後面加CLOSE。
如果是debug的關係,製造了很多的VISA(num),則可能要一個一個手動將他關閉。
但如果有落實VISA CLOSE,則應該不會有上述問題。

yehcat大大,


     知道了! 謝謝您! 我會再嘗試看看!

8年後從尋求協助改為幫助版友,推一個 :smiley:



我分享一個可能可行的方法,只要GPIB本身內部沒有太奇怪的設定,應該會可行。也需要高手幫忙確認這方法。

*** 1
可以用一個while迴圈將你的絕大部分程式框住,但這個While迴圈的結束條件設為True,也就是只執行一次。
我們要建立一個Shift Register來記錄被創建的VISA Resource。
以便在LabVIEW介面被強制用紅點Stop的時候,程式編譯器仍舊藉著Shift Register記錄著VISA Resource

這個VISA Resource (Reference)一旦被創建之後,就立刻被分一條線出去,儲存到這個Shift Register之中。
程式每次被開啟的時候,一律會用裡面記錄著的資料,進行一次Close。當然,這可能會回報Error,略過或Clear Error即可。

2
進一步可以嘗試的方式是,另外設定一個變數當作flag,每次正常Clear VISA Resource後,都會把flag放下。
如果有被正常的呼叫過,則把flag舉起。

一旦任何一次這個程式被啟動時,發現這個Shift Register flag是被舉起的,代表前一次未曾正確Clear VISA Resource。
那麼此時才執行Clear VISA Resource。這只是一個可以嘗試的小改進。

3
如果需要進行一些特別的動作判斷,那麼可以製造(Create)出這個VISA Resource (Reference)的Constant。
未曾被修改過的VISA Resource如果有考慮要有個Constant可以做比對,可以這樣製作出來。


4 ***
我在DAQ卡片嘗試這樣用,會出一些問題。可能因為middleware裡面Create與Clear的內層有做一些分辨跟判斷,他反而會告訴我Clear失敗。
因此這樣的方法在DAQ是不一定可行的

根據某些我查到的文章資訊,在GPIB可能沒那麼複雜,一律記錄下來,下次開始的時候跑一遍Clear,應該就可以了。

MingYen43118.493587963