使用 NI-488.2 軟體基本課程進行序列與 SRQ 維修

概觀

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

內容

序列理論

序列輪詢是在 GPIB 裝置要求服務時,用於取得特定資訊的方式。進行序列輪詢時,控制器會查詢每個裝置,以尋找發出 SRQ 訊號的裝置。裝置會回應輪詢,並傳回 Status Byte 的值。裝置相關條件 (例如可用資料或錯誤條件) 會決定此值。ANSI/IEEE 標準 488.1-1987 只在 Status Byte (狀態位元) 中指定 1 位元,如果裝置要求服務,則為 TRUE。Status Byte 中的其他位元,則由儀器製造商負責定義。IEEE 488.1 相容儀器具有位元,可判斷是否發生儀器錯誤,或是裝置正在執行自我測試。儀器廠商之間沒有一致的這些位元定義,而且判斷服務需求原因的方式因裝置而異。

ANSI/IEEE 標準 488.2-1987 定義特定的服務需求條件,以便針對所有相容裝置說明狀態位元。Bit 6,即裝置需求服務 (RQS) 位元,會維持 IEEE 488.1 定義。如果設定了 Bit 6,則表示裝置要求服務。IEEE 488.2 標準定義位元 4 與 5;儀器製造商定義剩餘位元 (0 到 3 與 7)。位元 4 是訊息可用 (MAV) 位元。如果裝置先前已被查詢資料,且裝置有待傳送待處理的資料訊息,就會設定此位元。位元 5 是事件狀態位元 (ESB)。如果發生啟用 IEEE 488.2 定義之一或多個事件,就會設定此位元。這些事件包含開機、使用者要求、指令錯誤、執行錯誤、裝置相依錯誤、查詢錯誤、要求控制,以及作業完成。在設定 ESB 或 MAV 時,或發生製造商定義的條件時,裝置可以插入 SRQ。

NI-488.2 常式以 IEEE 488.2 標準中的序列為準。SRQ 維修與序列輪詢常式包括:AllSpoll、FindRQS、ReadStatusByte、TestSRQ 與 WaitSRQ。

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

FindRQS 能序列輪詢多個裝置。如果其中一個裝置透過插入 SRQ 要求服務,則常式會傳回要求服務的裝置的索引與狀態位元值。

ReadStatusByte 會回傳單一裝置的 Status Byte 值,也就是執行單一序列輪詢。程式必須手動檢查 Status Byte 值中的 RQS 位元,以判斷該裝置是否要求服務。

TestSRQ 可判斷 SRQ 線路是否為插入或不插入。

WaitSRQ 與 TestSRQ 類似,但在 SRQ 被插入或超時之前,WaitSRQ 會暫停應用程式。

 

測試 SRQ 的狀態


下列 QuickBASIC 範例會執行 SRQ 維修,接著使用 NI-488.2 常式判斷要求服務的裝置為何。在下列範例中,我們會假設這些假設:GPIB 的 3 個裝置位於位址 3、4 與 5,GPIB 介面則稱為匯流排索引 0。

REM $包含:qbdecl.bas

使用 NI-488.2 常式的 REM SRQ 維修方案。此程式碼 REM 會在迴圈中無限期等待 SRQ 被插入。建立 REM SRQ 時,程式會跳至使用者定義的 REM 子常式,以便序列輪詢裝置並分析序列輪詢狀態位元。

.

.      board% = 0

100    CALL TestSRQ(board%, result%) IF result% = 1 THEN

CALL serial.poll ELSE

GOTO 100 END IF

或者,您也可以執行 WaitSRQ 常式來執行相同的工作項目,如下方範例所示。主要差別在於,作業會暫停,直到 SRQ 成立為止,或是超過逾時限制為止。

CALL WaitSRQ(board%, result%) IF result% = 1 THEN

CALL serial.poll ELSE 

PRINT "WaitSRQ timed out; no SRQ" END IF

 

使用 NI-488.2 常進行序列


一旦 GPIB 控制器使用 NI-488.2 常式之一偵測到 SRQ 通道,接下來就是序列輪詢每個裝置。每個裝置所傳回的序列輪詢狀態位元可提供重要的狀態資訊,例如裝置是否要求服務,以及為何。控制器可分析從每個裝置取得的序列輪詢狀態位元,以取得這項資訊。

您可以使用 FindRQS 常式判斷要求服務的裝置為何。FindRQS 會序列輪詢每個裝置,並僅傳回要求服務的裝置的狀態位元。常式會自動檢查每個序列輪詢狀態位元中的 RQS 位元。位址陣列中列出的要求服務的裝置索引,會以全域變數 ibcnt 傳回。在下列範例中,假設位於位址 3、4 與 5 的 3 個裝置已連接 GPIB,且其中一個裝置已插入 SRQ。

REM $include: 'qbdecl.bas'

DIM addresslist%(3) .

. addresslist% (0) = 3 addresslist% (1) = 4 addresslist% (2) = 5 addresslist% (3) = NOADDR

CALL FindRQS (0, addresslist% (), result%)

PRINT "Device at index";ibcnt;"requested service"

REM 分析 result% ,判斷裝置插入 SRQ 的原因。REM 請參閱裝置隨附的說明文件,進一步了解序列輪詢狀態位元組定義。

您可以使用 AllSpoll 或 ReadStatusByte 序列輪詢裝置。下列程式碼顯示了 AllSpoll 的可能實作方式。假設位於位址 3、4、5 的 GPIB 已有 3 個裝置,且 SRQ 已由控制器偵測到。每個裝置的序列輪詢狀態位元會儲存在陣列 resultlist%() 中,以利進一步分析。

REM $include: 'qbdecl.bas'

DIM resultlist% (2) .

.

CALL AllSpoll (0, addresslist% (), resultlist% ())

FOR i% = 0 to 2

IF resultlist% (i%) AND &H40 THEN

PRINT "The device at index";i%;"requested service" END IF

NEXT i%

 

具備 NI-488 功能序列


NI-488 函式是儀器控制應用的業界標準。本節將說明偵測 SRQ 與執行序列輪詢所需的功能。

NI-488 函式可分為兩種:裝置函式與機板函式。裝置函式會在單一呼叫中執行裝置的定址與資料傳輸作業。相較之下,某個機板函式可能會用於 GPIB 機板上的裝置,而另一個機板函式可能會實際執行資料傳輸。函式的指定是機板函式還是裝置函式,取決於當中傳遞的單位描述子值為函式中的參數之一。若單元描述子代表介面卡,則該函式會指定為機板函式。

用於序列輪詢的 NI-488 函式是 ibrsp。ibrsp 會執行單一序列輪詢,並將序列輪詢回應位元傳回應用程式。它與先前所述的 NI-488.2 ReadStatusByte 常式類比。

 

自動序列


NI-488.2 驅動程式具有名為「自動序列輪詢」或「自動輪詢」的內建功能。若啟用了自動輪詢 (Autopolling) 並將 SRQ 通道提高,驅動程式將自動執行下列操作:1) 開始對每個由 ibfind 或 ibdev 開啟的裝置進行序列輪詢,並在 SRQ 行低時停止進行輪詢;2) 將序列輪詢回覆狀態位元儲存在記憶體队列中,以供後續檢索;3) 將每個以 6 位元集傳回狀態位元的裝置的狀態字詞 (ibsta) 中設定 RQS 位元。

必須啟用並允許自動輪詢才能生效。自動輪詢是否啟用,取決於驅動程式設定程式或 ibconfig 函式。請注意,所有 NI 驅動程式均隨附預設啟用的自動輪詢 (Autopolling)。執行任何 NI-488 裝置層級的函式之後,即可進行自動輪詢。執行任何 NI-488 板件等級函式或 NI-488.2 常式之後,不允許自動輪詢。

如果 GPIB 介面卡具有指派的中斷,只要 GPIB I/O 尚未執行,自動輪詢就能立即回應 SRQ 通道。如果機板沒有中斷,則 Autopolling 只能在裝置進行 RQS 待機期間,或是在裝置函式完成並即將返回應用程式後直接回應服務需求。

使用自動輪詢的主要優勢,在於需要服務的裝置會盡快進行輪詢。如果 GPIB 介面卡具有指派的中斷,則自動輪詢是中斷服務常式,可確保對所設定的 SRQ 線路做出最快速回應。使用自動輪詢的缺點是,您必須謹慎設計應用程式,確保自動輪詢已啟用 (啟用與允許)。

從程式設計的角度來看,自動輪詢最適合一次只要求服務的裝置。這是因為在啟動自動輪詢時,監控 SRQ 通道以表示服務需求並不可靠。因此,若要在 Autopolling 啟用時檢查服務需求,您必須在可能需要維修的 每個裝置的 ibsta 狀態字詞中檢查 RQS 位元。如果自動輪詢並未啟用,請檢查 SRQ 通道以監控服務需求,只要檢查任何 IBsta 的 SRQI 位元,或是使用 IBlines 即可完成這項作業。

 

使用 NI-488 函式


下列程式碼說明了在停用自動序列輪詢的典型 SRQ 維修情況中,使用 ibwait 與 ibrsp 函式的方式。ibwait 會暫停程式執行作業,直到 GPIB 符合特定條件為止。

REM $include: 'qbdecl.bas'

REM 在此範例中,假設 2 台裝置已將 REM 連接至 GPIB。兩種裝置皆可插入 SRQ。REM 其中一個裝置是示波器 (稱示波器)、REM,另一個則是多功能數位電錶 (稱為 dmm)。

REM 第一項作業是等待 SRQ 線路進行插入。此 REM 可透過 SRQI 的 ibwait 或使用 ibwait 0 或 iblines 函式的迴圈結構 REM 進行。在此圖例中,REM 使用 ibwait 函式等待 SRQI 位元設定 REM 或超時。

CALL ibfind ("gpib0", brd0%) CALL ibfind ("dev1", scope%) CALL ibfind ("dev2", dmm%)

CALL ibwait (brd0%, SRQI|TIMO)

REM 若 ibwait 因 SRQI 設定的原因而終止,請輪詢 REM 裝置並解譯傳回的狀態位元,以了解 REM 是否同時要求服務。

IF (ibsta% AND SRQI) THEN

REM 在此情況下,由於自動輪詢並未啟用,ibrsp REM 會使用 gpib 匯流排從示波器取得狀態位元組。CALL ibrsp(scope%, spr.scope%) IF (spr.scope% AND &H40) THEN PRINT "Scope asserted SRQ."

REM 在此,您要分析序列輪詢狀態位元 REM spr.scope%,以判斷 SRQ 的原因。

CALL ibrsp(dmm%, spr.meter%)

IF (spr.meter% AND &H40) THEN PRINT "DMM asserted SRQ."

REM 分析序列輪詢狀態位元 REM spr.meter%,以判斷 SRQ 的原因。

END IF

若啟用了自動輪詢功能,則必須使用相關裝置的 ibsta RQS 位元來判斷該裝置是否要求服務。請注意,再次使用 ibrsp 回傳 Status Byte,但這次我們已經知道 Bit 6 已設定,因為 RQS 位元是以單一裝置進行檢查。此外,ibrsp 只能存取先前由自動輪詢常式取得並儲存的狀態位元組。

REM 當「自動輪詢」啟動時,下列程式碼片段可做為子常式,以便檢查特定裝置是否為 REM 要求服務。

SUB RQScheck(device%)

CALL ibwait (device%, 0) IF (ibsta% AND RQS) THEN

PRINT "Device asserted SRQ."

REM 在此情況下,ibrsp 不會輪詢裝置,而 REM 只會從記憶體傳回響應位元組。REM 將用來判斷如何為裝置進行 REM 服務。

CALL ibrsp (device%, spr.device%)

END IF

END SUB

 

結論


本文件說明 GPIB 控制器如何使用 NI-488.2 軟體,以偵測並回應匯流排上 IEEE 488 裝置的服務需求。只要執行本文件中所述的 NI-488.2 常式與 NI-488 函式,即可進行 SRQ 維修與序列輪詢。程式碼範例示範如何在應用程式環境中使用常式與函式。


Was this information helpful?

Yes

No