使用 NI-488.2 軟體與 LabVIEW 進行序列與 SRQ 服務

概觀

GPIB 控制器的其中一項功能,就是偵測並響應匯流排上裝置的服務需求。GPIB 的 Service Request Line (SRQ) 可在服務需求待處理時,向控制器發送訊號。接著控制器必須判斷哪個裝置觸發 SRQ 線路,並據此做出響應。序列輪詢是最常見的 SRQ 偵測與服務方法。本應用說明描述 NI-488.2 軟體如何偵測並響應 IEEE 488 裝置的服務需求。此外,本應用說明也包含程式碼範例,說明如何在 LabVIEW 程式中執行 NI-488.2 軟體常式與函式。

內容

序列必要性課堂類比

GPIB 控制器與儀器之間的通訊,可比擬為講師與教室學生之間的互動。在教室中,講師負責上課與控制活動。GPIB 的運作方式類似,是由控制器決定執行作業的時間。在課堂中,學生必須獲得許可才能發言,而在 GPIB 上,除非裝置被指定為匯流排上的發言端,否則無法進行通訊。但是,如果裝置未經控制器指示就不能與控制器通訊,該如何讓控制器知道其有通訊需求?

此問題可根據課堂類比來解釋為:如果講師不允許,學生就無法與講師對話,學生該如何讓講師知道自己有話要說?一個好的方法是學生舉手。同樣地,儀器也可以觸發名為 SRQ 的硬體線路。這是 GPIB 匯流排中完全獨立的專用線路,可讓控制器知道某個裝置需要處理。

為什麼裝置必須提出服務需求?在某些情況下,控制器可以向裝置提出資料需求 (寫入裝置),並在寫入作業完成後立即回讀資料。但這並非每種情況都可行。有時,控制器可能會嘗試在資料尚未準備好時 (儀器可能需要較長時間產生資料) 從儀器回讀資料,結果發生逾時錯誤。這種情況類似於教授在學生尚未完成問題前,就向學生詢問問題的答案。在這種情況下,教授會選擇等待學生完成問題後舉手。學生舉手後,教授會詢問學生答案。不過,在 GPIB 案例中,由於所有裝置皆共用 SRQ 線路,因此控制器並不知道是哪一個裝置提出服務需求。必須進行序列輪詢,才能讓控制器找出提出服務需求的裝置。

序列理論


序列輪詢是在 GPIB 裝置提出服務需求時,用於取得特定資訊的方法。進行序列輪詢時,控制器會查詢每個裝置,搜尋觸發 SRQ 線路的裝置。每個裝置均會響應輪詢,並傳回狀態位元組暫存器中的狀態位元組值 (見圖 1)。這個值由裝置相關的條件 (例如是否有資料可用,或是否存在錯誤狀況) 決定。ANSI/IEEE 標準 488.1-1987 規定,若裝置提出服務需求,狀態位元組中的 RQS 位元 (位元 6) 應為 TRUE。狀態位元組中的其他位元則由儀器製造商負責定義。IEEE 488.1 相容儀器可能會有位元,用於判斷是否發生儀器錯誤,或是裝置正在執行自我測試。由於這些位元定義在儀器廠商之間並不一致,因此判斷服務需求原因的方法因裝置而異。


圖 1.狀態位元組暫存器

ANSI/IEEE 標準 488.2-1987 透過定義特定服務需求條件解決這個問題,使得單一模型即可描述所有符合 488.2 標準裝置的狀態位元組。IEEE 488.2 標準以上一節討論的 IEEE 488.1 狀態位元組為基礎,並加以延伸 (見圖 2)。IEEE 488.2 定義 RQS 位元時,與 IEEE 488.1 標準相同。IEEE 488.2 新增訊息可用 (MAV) 位元與事件狀態位元 (ESB)。如果先前已查詢裝置的資料,且有待處理的資料訊息要傳送,就會設定 MAV 位元。ESB 位元表示已發生標準事件狀態暫存器中定義的其中一個標準事件。只要在標準事件狀態啟用暫存器中設定對應位元,即可定義哪些標準事件會設定 ESB。這些事件包括開機、使用者需求、指令錯誤、執行錯誤、裝置相關錯誤、查詢錯誤、需求控制,以及作業完成。只要在服務需求啟用暫存器中設定對應位元,即可設定儀器在 ESB 或 MAV 設定時,或發生製造商定義條件時,觸發 SRQ 線路。


圖 2.IEEE 488.2 狀態報告模型

適用於序列的 LabVIEW 函式

LabVIEW GPIB 488 子面板包含下列函式,對於在 LabVIEW 中進行序列輪詢非常重要:

GPIB 序列輪詢 (NI-488 中的 ibrsp) 會執行序列輪詢,並從單一裝置傳回狀態位元組的值。程式必須手動檢查狀態位元組值中的 RQS 位元,以判斷該裝置是否提出服務需求。

GPIB Wait (NI-488 中的 ibwait) 可在特定 GPIB 匯流排中等待由指定的狀態字元遮罩所示的狀態。狀態字元為全域變數 (16 位元),其中包含 GPIB 資訊,以及 SRQ 線路的狀態 (位元 12,SRQI),以及裝置是否提出服務需求 (位元 11,RQS)。如果傳遞的向量等於 0,則不會等待任何指定條件,並會更新 ibsta 或狀態字元。不過,如果將遮罩設為檢查位元 12 (SRQI),則函式將等待特定 GPIB 板卡觸發該特定線路 (其位址已於 GPIB Wait 中指定)。

Wait for GPIB RQS (NI-488 中的 ibwait,含位元 11 遮罩) 與使用 GPIB Wait 函式搭配位元 11 的遮罩相似,但使用特定裝置位址的 GPIB 位址,而非 GPIB 板卡的位址 (等待位元 12 時)。此函式會等待特定裝置提出服務需求,而非等待板卡 (可連接多台裝置) 收到服務需求。此函式將等待 RQS 位元被觸發或超過逾時。

下列範例示範如何使用 LabVIEW GPIB 函式處理 SRQ 與序列輪詢裝置。

在 LabVIEW 範例 1 (圖 3) 中,將指令寫入 NI Instrument Simulator。此指令包含指示,讓儀器在事件狀態暫存器 (ESR) 注冊作業完成事件時,產生服務需求 (SRQ)。前兩個指令會將這些指令寫入服務需求啟用暫存器與事件狀態啟用暫存器 (IEEE-488.2 規格)。第三個指令會要求儀器模擬器產生正弦波;最後一個指令會產生作業完成事件。下列程式碼部分會檢查狀態字元的位元 12,以等待 SRQ 產生。一旦產生,會在裝置模擬器上執行序列輪詢,以讀取狀態位元組,並了解產生 SRQ 的原因。如果設定了位元 5 (來自具有作業完成位元設定的事件狀態暫存器) 並設定了位元 6 (RQS,裝置已提出服務需求),則控制器會繼續從裝置模擬器回讀資料。請注意,必須清除 ESR 暫存器。如此可避免儀器產生不需要的服務需求。



圖 3.LabVIEW 範例 1

LabVIEW 範例 2 (圖 4) 顯示了另一種等待裝置提出服務需求的方式。不過,在最後一個範例中,處理器會停止並等待,不會執行其他任何操作。在第一個範例中,在等待裝置提出服務需求時,可能會同時執行其他作業。



圖 4.LabVIEW 範例 2

序列詢 LabVIEW GPIB 488.2 函式

GPIB 488.2 函式新增了序列輪詢功能,因此您可以使用單一 GPIB 指令輪詢多台裝置。LabVIEW 已將這些函式納入 GPIB 488.2 函式子面板 – AllSpoll 與 FindRQS。

AllSpoll 可透過單一常式呼叫,以序列輪詢多個裝置。AllSpoll 會將每個被輪詢儀器的狀態位元組置於預先定義的陣列中。您必須手動檢查每個裝置的狀態位元組中的 RQS 位元,以判斷該裝置是否提出服務需求。

FindRQS 能序列輪詢多個裝置。如果其中一個裝置透過觸發 SRQ 提出服務需求,則常式會傳回第一個提出服務需求的裝置的索引與狀態位元組值。

如果您知道只有一台儀器觸發了 SRQ,並且想知道是哪一台及其序列輪詢響應位元組,請使用 FindRQS 函式。如果您懷疑多台儀器可能已觸發 SRQ,請使用 AllSpoll 接收所有裝置的序列輪詢響應位元組。若狀態位元組具有位元 6 設定,則表示裝置已提出服務需求。換句話說,當裝置提出服務需求時,狀態位元組的值至少會是 hex 40。

LabVIEW 範例 3 (圖 5) 說明如何使用 LabVIEW NI-488.2 函式執行序列輪詢。請注意,此 GPIB 488.2 範例與先前所示的 GPIB 範例非常相似。多數 LabVIEW GPIB 函式都已被 LabVIEW GPIB 488.2 等效函式取代,例如「Send」與「Receive」取代「GPIB Write」與「GPIB Read」、「ReadStatus」取代「GPIB Serial Poll」,以及「Test SRQ」取代「GPIB Wait」,並將遮罩設為 0。此外,本範例也說明了如何透過移位暫存器,在 while 迴圈之間傳遞錯誤叢集,進而更有效地控制程式中可能的錯誤。



圖 5.LabVIEW 範例 3

結論

本應用說明描述 GPIB 控制器如何使用 NI-488 軟體,偵測並響應匯流排上 IEEE 488 裝置的服務需求。文中也包含 LabVIEW 程式碼範例,說明如何將 LabVIEW GPIB 函式用於序列輪詢裝置。

Was this information helpful?

Yes

No