GPIB 錯誤代碼常見解決方案 (第 2 部分)

概觀

本文提供了 GPIB 錯誤代碼的解決方案。

 

下列內容大多來自《NI-488.2 適用於 Windows 的使用者手冊》(請參閱下方的其他資源)。

內容

EDVR (0)

錯誤條件:驅動程式錯誤。

說明:如果 GPIB 硬體配置不正確,或者傳遞給 ibfind 函式的介面名稱或裝置名稱不正確,就會傳回 EDVR。

可能的原因:通常,如果您錯誤輸入機板介面名稱或儀器裝置名稱,就會造成 EDVR 錯誤。舉例來說,NI 機板的預設介面名稱是 GPIB0,但您可能會誤寫為 GPIBO (使用「oh」而非「0」。如果傳遞至 ibdev 函式的機板索引不正確,也可能會發生這個錯誤。機板索引是 GPIB 機板介面名稱中的一個數字部分,但許多人誤會其是機板的主要位址。舉例來說,我可能會在電腦上安裝 PCI-GPIB 機板,並且提供 2 的主要位址。機板的預設介面名稱是 GPIB0,因此機板索引為 0,而非 2。

解決方案:

  • 在 GPIB Configuration Utility 中使用 GPIB 硬體的預設設定 (即介面名稱為 GPIB0,主要位址則為 0)。
  • 使用 ibdev 函式來開啟與儀器的通訊 (避免使用其裝置名稱),而非使用 ibfind 函式。
  • 如果儀器必須使用裝置名稱,請確定在 GPIB 設定公用程式的「裝置範本」中正確設定這些裝置名稱 (詳情請參閱 NI-488.2 使用手冊)。
  • 在後續 NI-488 函式中,使用自 ibdevibfind 所傳回的單位描述子做為第一個參數。在函式失敗前檢查該變數,以確保其值未損壞。

ECIC (1)

錯誤條件:函式要求 GPIB 機板為 Controller-In-Charge (CIC)。

說明:某些函式需要 GPIB 機板為 CIC,NI-488.2 函式參考手冊會說明這些函式 (請參閱下方的相關連結)。根據預設,您的 GPIB 機板會是系統控制器,但這與充電控制器不相同。系統控制器可以隨時成為 CIC (指定通用介面匯流排可能有 1 個系統控制器)。

可能的原因:通常,當您在程式開始時未將介面清除,以確保您的 GPIB 機板是 CIC,就會造成 ECIC 錯誤。

解決方案:

  • 如果您的 GPIB 機板應該是系統控制器,請使用 ibrsc 1 確認您的 GPIB 機板已設定為系統控制器。
  • 如果您的 GPIB 機板是系統控制器,請使用 ibsic 函式 (或 SendIFC 函式) 傳送介面清除訊息。如此會讓您的 GPIB 機板成為 CIC (也會將匯流排上的 GPIB 通訊重設)。
  • 如果您的 GPIB 機板是匯流排上的多個控制器之一,請務必在嘗試任何需要 GPIB 機板具有 CIC 狀態的函式呼叫前,先檢查狀態字詞 (ibsta) 的 CIC 位元。如果未顯示,則可呼叫 ibwait 函式 (設定 CIC 位元的等待遮罩),以延遲後續處理,直到控制項傳遞至 GPIB 機板為止。

ENOL (2)

錯誤條件:偵測到沒有偵聽器的函式。

說明:GPIB 通訊需要一個 Talker (寫入資料訊息) 與一個以上的 Listener (讀取資料訊息)。嘗試寫入作業時,通常會發生 ENOL,但沒有定址的 Listener,或者指定地址沒有 Listener。針對裝置寫入,ENOL 表示您嘗試通訊的 GPIB 位址與連接至匯流排的裝置的 GPIB 位址不一致。

可能的原因:您嘗試與之通訊的儀器不在預期主要地址,儀器電源未開啟,或是儀器連接線中斷或中斷。

解決方案:

  • 確認裝置的 GPIB 位址與要寫入資料的裝置的 GPIB 位址相符。
  • 確認連接線是否正確連接至儀器。請嘗試切換連接線以確認連接線未有損壞。
  • 請確認至少有三分二的裝置已開機。
  • 針對板件等級的通訊,請在 ibcmd 函式中使用適當的六精度代碼,將裝置設為 Listener。
  • 呼叫 ibpad 函式 (以及必要時的 ibsad),以設定裝置的主要位址。ibpad 函式將回傳裝置之前的設定,您可以檢查配置的位址是否與裝置的實際位址相符。

EADR (3)

錯誤條件:GPIB 機板 (GPIB0GPIB1) 定址不正確。

說明:當 GPIB 機板為 Controller-In-Charge (CIC) 且無法在讀取與寫入函式前正確排序,就會發生 EADR。在要求影像交握功能且尚未插入 GPIB ATN 通道時,函式 ibgts 也會傳回 EADR。在此情況下,將無法進行影形交握,並傳回錯誤通知您。

可能的原因:與您所通訊的儀器相同的主要位址,您的 GPIB 機板的設定都已完成。

解決方案:

  • 請勿將 GPIB 機板設定到與裝置相同的地址。您幾乎一律應將 GPIB 機板設定為主要位址 0,而非次要位址。在程式開始時,請呼叫 ibpad 0 ibsad 0,以正確設定機板位址。
  • 在呼叫 ibrd、ibwrt、RcvRespMsgSendDataBytes 之前,請先確認已正確定址 GPIB 機板。
  • 避免呼叫 ibgts,除非在 ibcmd 呼叫後立即進行。ibcmd 函式會導致 ATN 通道被插入,進而告知儀器應預期指令訊息,而非資料訊息。

EARG (4)

錯誤條件:函式呼叫的無效參數。

說明:如果將無效的引數傳遞至函式呼叫,就會造成 EARG。

可能的原因:以下舉例說明:您透過 0 到 17 之間的值呼叫 ibtmo (可能的逾時值會對應至 0 到 17 之間的值表,預設值為 13,代表 10 秒的逾時時間);您透過在第二個參數的高位元中設定的無意義位元呼叫 ibeo;或是使用無效位址呼叫 ibpad (或 ibsad)。

解決方案:

  • 請參閱 NI-488.2 函式參考手冊 (請參閱下方的相關連結),確認您的參數是否有效。
  • 請勿在機板層級函式中使用裝置描述子,或在裝置層級函式中使用機板描述子。

ESAC (5)

錯誤條件:GPIB 機板並非系統控制器 (如必要)。

說明:當 GPIB 機板不具備系統控制器功能時,當呼叫 ibsic、ibsre、SendIFCEnableRemote 時,就會造成 ESAC。

可能的原因:GPIB 機板並未設定為「系統控制器」。

解決方案:

  • 呼叫 ibrsc 1 或使用 GPIB Configuration Utility,為 GPIB 介面卡提供系統控制器的功能。

EABO (6)

錯誤條件:I/O 作業已中斷。

說明:EABO 表示 I/O 作業因某些原因而取消。

可能的原因:EABO 錯誤通常是讀取或寫入作業期間的逾時,但也可能是在執行 I/O 作業時呼叫 ibstop 函式、ibclr 函式或類似函式所造成的。如果 PCI 匯流排控制 (電腦的 BIOS 中的選項) 未啟用,您可能會在使用 PCI-GPIB 機板撰寫作業期間遭到逾時。如果您讀取的儀器不了解先前的指令,因此無法寫信給您,您可能會在讀取作業期間遭到逾時。儀器可能沒有用途的原因有幾個:

  • 可能出錯了儀器的訊息。舉例來說,「*IDN?」為 IEEE 488.2 標準儀器常見的識別查詢。要將此訊息錯字為「*IND?」很容易,儀器將無法理解,因此不會產生訊息字串供您從儀器讀取。
  • 傳送至儀器的訊息可能包含儀器不了解的指令。舉例來說,前一個範例中的「*IDN」訊息,僅能由符合 IEEE 488.2 標準的儀器了解。如果您的儀器是符合非 IEEE 488.2 標準的舊款裝置,則不會了解「*IDN?」,因此不會產生訊息字串供您從儀器中讀取。
  • 儀器可能會使用特定的 EOS (字串結束) 字元做為終止方法,但您可能會忘記將這個終止字元附加到訊息中。舉例來說,如果您的儀器預期會以 EOS 字元做為線性饋送,那麼「ID」不會發揮作用,而是「ID?\n"(在 \n (代表 IBIC 中的線路饋送) will。
  • 您可能會認為 EOI (結束或識別,是五條匯流排管理通道之一) 是終止方法,但若儀器在傳送訊息結束時未設定 EOI 通道,則執行的讀取作業將會超時。

解決方案:

  • 請確認您的訊息包含儀器可理解的指令。請參閱裝置使用者手冊,了解可能的指令清單。
  • 請參閱使用手冊,以了解您的儀器是否需要使用 GPIB 或 488.2 模式才能成為 GPIB 偵聽器。  通常儀器只會在放入此模式後才回應標準指令,否則即使傳送有效指令,就會產生錯誤。
  • 確認您使用的儀器終止方式是否正確。通常會使用位元組數 (預計會在訊息中接收特定位元組數),但有些儀器會使用 EOS 與位元組數,有些則使用 EOI 與位元組數,有些則僅使用位元組數。請參閱裝置使用手冊,以了解可搭配儀器使用的終止方法。
  • 如果 EOS 是終止方式,請務必將終止字元附加至訊息結尾處。您可以在 GPIB Configuration Utility 中指定終止字元,但 NI-488.2 驅動程式不會自動為您附加這個字元!
  • 使用 ibtmo 指令延長 I/O 作業的逾時期間。
  • 如果您收到所有資料並出現 EABO 錯誤,請尋找字串字元的特定結尾 (例如,線性饋送或車載退回),並使用 ibeos 函式設定 GPIB 機板以終止該字元的讀取。

ENEB (7)

錯誤條件:不存在的 GPIB 機板。

說明:如果 GPIB Configuration Utility 指定的 I/O 位址沒有任何 GPIB 介面卡,就會發生 ENEB。當機板未實際插入系統、設定期間指定的 I/O 位址與實際機板設定不一致、系統與基本 I/O 位址發生衝突,或是機板的介面名稱與與裝置相關的機板介面名稱不同時,就會發生這個問題。

解決方案:

  • 查看 GPIB Configuration Utility,判斷機板的基本 I/O 位址。檢查系統的資源管理程式,以了解其他機板是否嘗試使用此位址範圍的一部分或全部。確認機板的介面名稱與您裝置設定的介面名稱相同。
  • 若為舊版機板,請確認機板上的跳機和下潛切換器已設為 GPIB Configuration Utility 所使用的相同資源設定。
  • 關閉電腦電源,並確保機板已穩定固定在插槽中。

EDMA (8)

錯誤條件:在使用 DMA 進行資料傳輸時,發生錯誤。

說明:如果當 NI-488.2 驅動程式嘗試使用 DMA 來透過 GPIB 傳輸資料時,遇到系統 DMA 錯誤,就會發生 EDMA。

解決方案:

  • 只要使用 GPIB 設定公用程式重新設定 GPIB 介面卡,使其不會使用 DMA 資源,即可修正 EDMA 錯誤。
  • 若要修正軟體中的 EDMA 問題,請使用 ibdma 函式停用 DMA。

EOIP (10)

錯誤條件:當非同步 I/O 正在執行時,不允許使用函式。

說明:如果進行其他 GPIB 呼叫前,非同步 I/O 作業尚未完成,就會發生 EOIP。在非同步 I/O 作業期間,您只能使用 ibstop、ibnotify、ibonl 函式。如果嘗試進行其他任何 GPIB 呼叫,就會傳回 EOIP。

可能的原因:在非同步 I/O 期間呼叫任何不受支援的 GPIB 函式。

解決方案:

  • 先重新同步化驅動程式與應用程式,再進行後續的 GPIB 呼叫。重新同步化是透過下列任一函式來完成:ibnotify (如果傳送至 ibnotify 回呼的 ibsta 值包含 CMPL,則驅動程式與應用程式會重新同步化)、 ibwait (如果 傳回的 ibsta 包含 CMPL,則驅動程式與應用程式會重新同步化)、 ibstop ( 這會取消非同步 I/O 作業,讓驅動程式與應用程式立即重新同步化),或 ibonl ( 這會取消非同步 I/O 作業並重設介面,以便立即重新同步化驅動程式與應用程式)。

ECAP (11)

錯誤條件:無法進行作業。

說明:如果您的 GPIB 介面卡無法執行作業,或已透過軟體停用特定功能,而所進行的呼叫需要該項功能,就會造成 ECAP。

解決方案:

EFSO (12)

錯誤條件:檔案系統錯誤。

說明:如果 ibrdfibwrtf 呼叫在執行檔案作業期間遇到問題,就會造成 EFSO。具體而言,這個錯誤會指出函式無法開啟、建立、尋找、寫入或關閉所存取的檔案。此一情況的專屬作業系統錯誤碼會包含在 ibcntl 中。

解決方案:

EBUS (14)

錯誤條件:指令位元傳輸錯誤。

說明:如果裝置運作時遇到特定 GPIB 匯流排錯誤,就會造成 EBUS。所有裝置函式都會傳送指令位元,執行定址與其他匯流排管理作業。裝置應該在預設組態或 ibtmo 函式所指定的時間限制內,接受這些指令位元。如果傳送這些位元指令時發生逾時,就會造成 EBUS。

可能的原因:GPIB 控制器沒有連接任何 GPIB 裝置。如果所有儀器都未啟動、其中一部儀器發生錯誤並插入交握線路、GPIB 連接線與機板連線中斷,或 GPIB 連接線毀損,就會發生這個情況。

解決方案:

  • 確認所有儀器皆正常運作,而且想要進行通訊的儀器已開啟電源。
  • 中斷所有儀器的連線,然後每次連接一部儀器,以判斷發生問題的儀器為何。
  • 檢查連接線是否發生鬆動或故障,並確認至少已開啟 2/3 的儀器電源 (此為 IEEE 488 規格的需求)。
  • 如果驅動程式傳送指令位元的逾時期間過短,請延長逾時期間。

ESTB (15)

錯誤條件:序列輪詢狀態位元遺失。

說明:只有 ibrsp 函式會回報 ESTB。ESTB 表示從自動序列輪詢接收的一個或多個序列輪詢狀態位元,因缺乏儲存空間而遭到棄置。有許多較舊的狀態位元可供使用;不過,最舊的狀態位元正由 ibrsp 呼叫傳回。

可能的原因:儀器正在重複插入 SRQ 線路。

解決方案:

  • 更頻繁地呼叫 ibrsp,以清空白列。
  • 使用 ibconfig 函式 (選項 IbcAUTOPOLL) 停用自動輪詢,或停用 GPIB 設定公用程式中的自動輪詢。

ESRQ (16)

錯誤條件:SRQ 持續處於 ON 位置。

說明:ESRQ 只能由裝置層級的 ibwait 呼叫傳回,而您已在當中設定 ibwait 函式,使其傳回狀態字元 (ibsta) 所插入的 RSQ 位元。ESRQ 表示由於 GPIB SRQ 線路持續處於 ON,因此無法等候 RQS。

可能的原因:這個情況可能是由下列事件所造成:發生連接線問題,導致 SRQ 線路持續保持插入;由於軟體不認識這項裝置,因此插入 SRQ 線路的軟體對裝置無所知;無法序列詢裝置以取消插入 SRQ 線路;或 GPIB 匯流匯排測試器 (或相似裝置) 正在強迫插入 SRQ 線路。

解決方案:

  • 檢查匯流排上的任一裝置 (即使未使用在應用程式中) 是否正在插入 SRQ 線路。並中斷它們與 GPIB 的連線 (如有必要)。
  • 檢查 GPIB 連接線,並確認接頭是否妥善固定。

ETAB (20)

錯誤條件:表格問題。

說明:只有在 FindLstnFindRQS 函式運作期間,才會發生 ETAB。ETAB 表示這些函式使用的表格發生某些問題。

可能的原因:FindLstn 而言,ETAB 意味著指定的表格沒有足夠空間可以容納接收器找到的所有位址。就 FindRQS 而言,ETAB 意味著指定表格中的所有裝置都未提出服務要求。

解決方案:

  • 針對 FindLstn,請增加結果陣列的規模。
  • 針對 FindRQS,請檢查未使用在應用程式中的其他任何裝置,是否正在插入 SRQ。並中斷它們與 GPIB 的連線 (如有必要)。

ELCK (21)

錯誤條件:GPIB 介面已鎖定,且無法存取。

可能的原因:如果有 2 個以上的程序想要存取同一介面,但其中一個程序已鎖定該介面,就會發生這個錯誤。當作業因介面遭到鎖定而無法執行時,將會傳回這個錯誤。此外,如果任一程序試圖在未發生此類鎖定的情況下解鎖介面,也會傳回這個錯誤。

解決方案:

  • 只要先等候一段隨機長度的時間,再重新嘗試解鎖介面,即可避免 ELCK 錯誤。如果您使用 iblck 指令來鎖定介面,請增加 LockWaitTime,並等候其他程序釋出介面控制權。此外,請確認程序鎖定介面的時間不會長達整個執行週期。

EARM (22)

錯誤條件:ibnotify 回呼無法重新設定。

可能的原因:如果我們在 NI-488.2 應用程式中使用非同步通知 (ibnotify),就會發生這個錯誤。如果想要讓您的應用程式收到發生一個或多個 GPIB 事件的非同步通知,這個函式就能派上用場。這個事件通知會透過回呼函式執行。當 ibnotify 呼叫發出時,這個回呼函式會使用 NI-488.2 驅動程式註冊。這個錯誤表示此回呼通知無法透過傳回不合法的值來重新設定自身,或發生嚴重的驅動程式錯誤 (EDVR)。

解決方案:

EHDL(23)

錯誤條件:輸入控制代碼無效。

可能的原因:如果有多個 GPIB 指令接收了機板或裝置的輸入控制代碼,並將其做為輸入參數,就有可能造成這個錯誤。許多情況都有可能導致這個錯誤發生。下方列出了其中幾個情境:

  • 有效的機板控制代碼被當作裝置控制代碼參數傳入,反之亦然。
  • 有效的機板或裝置描述子被當作輸入,並傳送至任何 NI-488.2 函式。
  • 範圍不在 0-99 之間的機板 ID 被傳入至傳統 NI-488.2 板件等級的函式或 NI-488.2 常式。
  • 透過裝置單元描述子與單機板單元描述子,或透過機板單元描述子與僅限裝置的組態選項,呼叫 ibconfigibmask

解決方案:

  • 檢查裝置等級與板件等級的函式是否在呼叫對應函式時發生混用。
  • 檢查傳送至 NI 488.2 呼叫的機板索引是否為有效的索引號碼。

EWIP (26)

錯誤條件:特定輸入控制代碼持續處於進行中狀態。

可能的原因:如果相同程序中具有多個執行緒,或有 2 個以上的執行緒正在存取相同介面,就會發生這個錯誤。指定的單位描述子上已有一個 ibwait 呼叫正在進行,當執行緒已使用相同的描述子執行 ibwait,而其他執行緒嘗試呼叫相同描述子上的 ibwait,就會發生 EWIP。

解決方案:

  • 確認在任何時間點,都只有一個執行緒在指定的單元描述子上執行 ibwait 呼叫。

ERST (27)

錯誤條件:事件通知因介面重設而取消。

可能的原因:當事件通知因介面重設而取消時,就會造成 ERST。在下列情況下,驅動程式中擱置的 ibwait 呼叫會傳回 ERST:

  • 相同程序中的其他執行緒使用與 ibwait 相同的單元描述子呼叫 ibonl
  • 其他執行緒或程序發出板件等級的 ibonl 1

在下列情況下,可使用 ERST 請求 ibnotify 回呼:

  • 其他程序發出板件等級的 ibonl 1

解決方案:

  • 請勿使用驅動程式中仍處於 起子狀態的 ibwait 呼叫來呼叫 ibonl
  • 避免其他應用程式透過使用 iblck 鎖定介面的方式呼叫 ibonl

EPWR (28)

錯誤條件:介面失去電力。

可能的原因:如果介面失去電力,就會造成 EPWR。這個錯誤經常發生在系統進入待機模式時,以及從待機模式啟動時。

解決方案:

  • 讓所有控制代碼離線,並重新初始化應用程式。
  • 結束應用程式,並重新啟動系統。
  • 停用電腦上的待機與休眠模式。

Was this information helpful?

Yes

No