USB 儀器控制線上教學

概觀

此篇技術文件將概述 NI-VISA 溝通 USB 裝置的方法。內容並未說明 USB 架構或 USB 通訊作業所使用的多種協定。在閱讀此篇技術文件之後,只要讀者對於裝置通訊協定已略知一二,則應可安裝 USB 裝置並透過 NI-VISA 溝通之。

目錄

  1. USB 與 VISA 的背景
  2. 設定 NI-VISA 以控制 USB 裝置
  3. 使用 NI-VISA 溝通自己的 USB 裝置
  4. Linux® 與 Mac 的 USB

1. USB 與 VISA 的背景

VISA 為溝通儀控匯流排的高階 API。並屬於獨立平台、獨立匯流排,與獨立環境。換句話說,所撰寫的程式不論是要於 Windows 2000 電腦中,透過 LabVIEW 溝通 USB 裝置;或要於 Mac OS X 電腦中,透過 C 溝通 GPIB 裝置,均是使用相同的 API。

USB 為訊息架構 (Message-based) 的通訊匯流排,意即若要溝通電腦與 USB 裝置,則必須以文字或二進位資料的格式,透過匯流排傳輸指令與資料。各組 USB 裝置均具有自己的指令集。使用者可透過 NI-VISA 的「Read」與「Write」函式,將指令傳送至儀器,並讀取來自於儀器的回應。請針對手邊的儀器,自行參閱儀器製造商的有效指令。

從 NI-VISA 3.0 版開始,即支援 USB 通訊功能。並支援 2 種 VISA 資源:USB INSTR 與 USB RAW。

USB 裝置是以 USB Test and Measurement Class (USBTMC) 協定為基礎,使用 USB INSTR 資源類別。USBTMC 裝置的協定架構,亦為 VISA USB INSTR 資源類別所能辨識。且不需進行任何設定,即可溝通 USBTMC 裝置。若要溝通 USBTMC 儀器,則可參閱文章第三段。若要進一步了解 USBTMC 的規格,則可參閱下方的 USB Implementers 討論區連結。

只要是尚未通過 USBTMC 規格的 USB 儀器,均歸類為 USB RAW 儀器。若正使用 USB RAW 裝置,則可參閱文章第二段以設定 NI-VISA 並控制該裝置。若要進一步了解通訊協定與儀器的指令集,則可聯絡儀器製造商。

若需要 NI-VISA API 的特定資訊,則可參閱 NI-VISA Help。此篇文件包含於 NI-VISA 中,亦附於此篇線上教學之後。

2. 設定 NI-VISA 以控制 USB 裝置

此章節將逐步說明應如何使用 Windows 電腦,透過 NI-VISA 3.0 設定 USB RAW 裝置並控制之。若正使用 USBTMC 相容的裝置,則可直接跳到 2.3 章節。

在開始時,請於電腦安裝 NI-VISA 完畢,且不要連接 USB 裝置。且不要安裝 USB 裝置的驅動程式。要設定 USB 裝置使用 NI-VISA 共有 3 個步驟:

  1. 使用驅動程式開發精靈 (Driver Development Wizard) 建立 INF 檔案。
  2. 接著安裝 INF 檔案,還有使用該 INF 檔案的 USB 裝置。
  3. 以「NI-VISA Interactive Control」測試該裝置。

針對此篇技術文件,我們使用 NI DAQPad-6020E 做為 USB 裝置範例,並安裝於 Windows XP 系統中。由於此篇線上教學將說明通用 USB 裝置的設定,因此 DAQPad-6020E 的詳細規格將不予贅述。請注意:NI-DAQ 是唯一支援 DAQPad-6020E 的驅動程式。

2.1. 使用 Driver Development Wizard 建立 INF 檔案

若要使用 NI-VISA,必須先要求 Windows 將 NI-VISA 做為裝置的預設驅動程式。在 Windows 環境中,可透過 INF 檔案進行設定。NI-VISA 3.0 與更高的版本均包含 VISA Driver Development Wizard (DDW),可針對 USB 裝置建立 INF 檔案。

  1. 若要開啟 DDW,請點選 Start» Programs» National Instruments» VISA» VISA Driver Developer Wizard 。圖 1 即為所開啟的視窗。

圖 1. VISA DDW 硬體匯流排視窗

此精靈亦可針對 PXI/PCI、USB,或 IEEE 1394 裝置,建立所需的 INF 檔案。要建立 USB 裝置的驅動程式,則點選「 USB 」並接著「 Next 」。則接著開啟圖 2 的「VISA DDW Basic Device Information」視窗。

圖 2.「VISA DDW Basic Device Information」視窗

在此步驟中,使用者必須知道 USB 製造商 ID,與該 USB 儀器的產品 ID。當安裝該裝置並要進行溝通時,這些編號將可識別使用者的 USB 裝置。根據 USB 規格,此 2 組編號均為 16 進位數字,並由裝置製造商所提供。

若使用者不知道 USB 製造商 ID 與產品 ID,則可將該裝置連接電腦,讓電腦識別該新裝置。若電腦啟動「搜尋新增硬體精靈 (Found New Hardware Wizard)」,則先關閉之。請至「控制台 (Control Panel)」開啟「裝置管理員 (Device Manager)」,並於清單中找到該裝置;一般均位於「其他裝置 (Other Devices)」之下。並可能以黃色標記表示為未知裝置。對裝置連點滑鼠 2 次,以開啟「內容」視窗。點選「詳細資料 (Details)」分頁,即可找到下拉式屬性對話框中的「裝置識別碼 (Device Instance Id)」。如圖 3 所顯示的字串相似,「VID_」與「PID_」右邊的 4 個字元即分別為製造商 ID 與產品 ID。抄下裝置的 ID,關閉「裝置管理員」並從電腦移除該裝置。亦可直接聯絡該製造商取得相關資訊。

圖 3. 透過「裝置管理員」取得 Vendor ID 與 Product ID

而 DAQPad-6020E 的製造商 ID 與產品 ID 分別為 0x3923 與 0x12C0。若並非使用 NI DAQPad-6020E,則製造商 ID 與產品 ID 將有所不同。

注意:在開始進行 Driver Development Wizard 之前,請先確認已從電腦移除裝置。

分別於對應欄位中輸入製造商 ID、產品 ID、製造商名稱,與產品型號。

按下「 下一步 (Next) 」。則將顯示圖 4 的「Output Files Properties」視窗。

圖 4. VISA DDW 的「Output Files Properties」視窗

  1. 「USB Instrument Prefix」將可識別該裝置所使用的檔案。輸入 USB 儀器的自首,接著選擇放置這些檔案的路徑,最後點選 Next 。下 1 個視窗將顯示安裝選項。預設選項將安裝作業系統的設定資訊,並為建議使用的選項。一旦選擇所需選項,則點選「 Finish 」以退出精靈。系統將根據上 1 個視窗所指定的輸出檔案路徑,建立相關 INF 檔案。

2.2. 安裝 INF 檔案與 USB 裝置。

各版本 Windows 的 INF 檔案安裝作業不盡相同。當 DDW 建立 INF 檔案時,安裝說明將包含於 INF 檔案頂端的表頭 (Header) 中。由於 INF 檔案為 ASCII 文字檔,因此可於如「記事本 (Notepad)」的文字編輯器中觀看之。若要進一步了解 INF 檔案的安裝資訊,請於文字編輯器中開啟 INF 檔,並依照檔案頂端的說明進行作業。此篇線上教學則以 Windows XP 為作業環境。

  1. 將 INF 檔案複製到 INF 資料夾。在 Windows XP 作業系統中,該資料夾預設為 C:\WINDOWS\INF 。系統可能隱藏此資料夾,因此使用者必須變更資料夾選項,才能看到隱藏的檔案。
  2. C:\WINDOWS\INF 中對 INF 檔案點選滑鼠右鍵並按下「 Install 」。系統將針對該裝置建立 PNF 檔案。現在即可安裝 USB 裝置。
  3. 連接該 USB 裝置。由於 USB 均為可熱插拔功能,因此當 USB 裝置連接至電腦的 USB 埠時,Windows 將可偵測到 USB 裝置並自動開啟「新增硬體精靈 (Add New Hardware Wizard)」。根據精靈指示逐步進行。當要選擇此裝置的驅動程式時,則先瀏覽到 INF 資料夾並選擇透過 DDW 所建立的 INF 檔案。

注意:在某些情況下,Windows 可能已內建該 USB 裝置的相關預設驅動程式。在此情況下,Windows 將先行安裝此驅動程式。若插入 USB 裝置且 Windows 安裝了該預設的驅動程式,則於「我的電腦 (My Computer)」點選滑鼠右鍵並選擇「內容 (Properties)」。找到「硬體 (Hardware)」分頁並點選「裝置管理員 (Device Manager)」。開啟裝置管理員之後,展開「人性化介面裝置 (Human Interface Devices)」。如圖 5 所示,按下滑鼠右鍵並選擇「內容」,查看「詳細資料」分頁是否有符合的 VID 與 PID,以找到該 USB 裝置相對應的「USB 人性化介面裝置」。

圖 5. 找到該 USB 裝置的正確「USB 人性化介面裝置」

如圖 6 所示,一旦找到該 USB 裝置 VID 與 PID 所對應的「USB 人性化介面裝置」之後,按下滑鼠右鍵並進入「更新驅動程式 (Update Driver)」。

圖 6. 更新 USB 裝置的驅動程式

在第一個畫面中,點選「不,這次不要 (No, not at this time)」並按下「下一步 (Next)」。第二個畫面中,選擇「從清單或特定位置安裝 (進階)」並按下「下一步 (Next)」。第三個畫面中,選擇「不要搜尋,我將選擇要安裝的驅動程式 (Don’t search, I will choose the driver to install)」。第四個畫面將如同圖 7 所示,反白強調使用者自行建立的驅動程式。點選該驅動程式並按下「下一步」。安裝驅動程式完畢即按下「完成 (Finished)」。

圖 7. 選擇該 USB 裝置的 VISA 驅動程式

2.3. 以VISA Interactive Control 測試通訊作業。

  1. 開啟 Measurement & Automation Explorer (MAX)。選擇 Tools» Refresh 以重新整理檢視。如圖 8 所示,使用者的 USB 裝置應於「 Devices and Interfaces 」中列為 USB 裝置,則代表該 USB 裝置已安裝完畢並設定使用 NI-VISA。

若點選該 USB 裝置,則將於「USB Settings」視窗中顯示裝置資訊。透過此視窗,即可取得如製造商 ID、產品型號,與裝置序號的相關資訊。

圖 8. MAX 中所顯示的 USB 裝置

若要透過 VISA 以溝通裝置,則可使用裝置的 VISA 儀器描述子 (Descriptor)。USB INSTR 裝置的儀器描述子格式為:「USB[board]::manufacturer ID::model code::serial number[:: USB interface number]::INSTR」。USB RAW 裝置的儀器描述子格式為:「USB[board]::manufacturer ID::model code::serial number[:: USB interface number]::RAW」。

根據 USBTMC 的規格,所有的 USBTMC 裝置均必須具有 1 組序號。某些 USB RAW 裝置可能不具序號。若該裝置不具序號,則 NI-VISA 將自動指定 1 組 VISA 特定序號。該序號格式為「NI-VISA-#」,而「#」為自動產生的號碼。

某些 USB 裝置具有多重介面。即與 PCI 裝置具有多種功能的原理相似。若使用者的 USB 裝置僅支援單一介面,則不需納入 USB 介面號碼。
DAQPad-6020E 使用 RAW 類別,而其製造商代碼與產品型號分別為 0x3923 與 0x12C0。而 DAQPad-6020E 的儀器描述子應為「USB0::0x3923::0x12C0::00B50DAE::RAW」。

若要測試通訊作業,則可開啟 MAX 並點選 Tools» NI-VISA» VISA Interactive Control 。則將開啟如圖 9 的視窗。

圖 9. VISA Interactive Control

VISA Interactive Control (VISAIC) 為公用程式,可輕鬆溝通任何 VISA 資源。在設定 USB 裝置必須使用 VISA 之後,該裝置則將列於 USB 的樹狀分支中。用滑鼠連點該裝置 2 次,以開啟裝置的 VISA 工作階段。則將開啟如圖 10 的視窗。


圖 10. VISA Interactive Control 所開啟的 VISA Session

當以 VISAIC 開啟 VISA Session 時,將自動選擇「Template」分頁與「Property Node (Set)」分頁。若要了解其內容,則可點選「Property Node (Get)」分頁,選擇所需的屬性並點選「 Execute 」。目前「 Attribute Name 」所指定的屬性值,將顯示於「 Current Value 」描述子中。圖 10 中即可看到「 Resource Name 」的內容。

若要進一步了解 VISAIC,可參閱 Developer Zone:「VISA Interactive Control (VISAIC)」。若需要 NI-VISA API 的相關資訊,則可參閱 NI-VISA Help。此篇線上教學將於文件最後附上連結。若要 USB 儀器的可用指令清單,請聯絡該款儀器的製造商。

回到頂端

3. 使用 NI-VISA 溝通自己的 USB 裝置

此章節將針對 NI-VISA 3.0 或更高版本,說明 USB 裝置的溝通方法請先回想 USB 裝置的 2 個分類。而通訊方式亦因裝置類型而有所不同。

3.1 USB INSTR Class (USBTMC)

屬於 USB Test and Measurement Class (USBTMC) 規格的裝置則使用 NI-VISA USB INSTR 類型。這些裝置均使用 488.2 的通訊方法。若要使用此種裝置溝通 GPIB 儀器時,則可依相同方法簡單使用 VISA Open、VISA Close、VISA Read,與 VISA Write 函式。

圖 11 則為 LabVIEW VI 溝通 USBTMC 裝置。在此範例中,系統針對 USB 裝置開啟 VISA 工作階段 (Session)。並針對該裝置撰寫 1 組指令,且接著回讀其響應。此範例所傳送的特殊指令,即為該裝置的 ID Query。請聯絡裝置製造商詢問該裝置的指令集。在完成所有通訊作業之後,隨即關閉 VISA 工作階段。

圖 11. USBTMC LabVIEW 範例程式圖

3.2 USB RAW Class

由於各組裝置可能使用自有的通訊協定,因此 USB RAW 的溝通作業較為複雜。請聯絡裝置製造商以了解該裝置的通訊協定。

USB 通訊作業使用 4 種 Pipe 或 Endpoint:「Control」、「Bulk」、「Interrupt」,與「Isochronous」。每 1 種 Pipe 均傳輸不同類型的資訊。此外,任何類型的 Endpoint 均可為任何數量的 Endpoint。將 Endpoint 想像為通訊插槽 (Socket)。若要了解 USB 架構的其他細節,請參閱下方的 USB 規格連結。

NI-VISA 可支援 3 種 USB Pipe:「Control」、「Bulk」,與「Interrupt」。當 NI-VISA 偵測到 USB 儀器時,則將自動掃瞄每組類型的最低可用 Endpoint。

又 VISA 偵測到最低可用的 Endpoint 時,則接著將該值指派至合適的 VISA 屬性。而「Bulk in endpoint」與「Bulk out endpoint」將分別儲存於「VI_ATTR_USB_BULK_IN_PIPE」屬性與「VI_ATTR_USB_BULK_OUT_PIPE」屬性中。而「Interrupt in endpoint」則儲存於「VI_ATTR_USB_INTR_IN_PIPE」屬性中。「-1」的值則表示該 USB 裝置並不支援該類型的 Pipe。而 Control Pipe 僅支援 Endpoint Zero。若正使用 C API,則可透過 viSetAttribute 函式變更 Endpoints。在 LabVIEW 中則可使用「Write VISA Property」節點。

NI-VISA 包含的 4 組函式,可透過 USB Pipes 傳輸資料。在使用這些函式溝通裝置之前,必須先使用 VISA USB 屬性以設定通訊協定。下方清單將說明可用函式。

  • 透過 Control pipe,使用「VISA USB Control In」與「VISA USB Control Out」傳輸資料。
  • 透過「VISA Read」與「VISA Write」,使用「Bulk pipe」傳輸資料。

若正使用 LabVIEW,則 VISA 內含的附加函式將可使用「Interrupt pipe」:VISA Get USB Interrupt Data。在 C API 中,亦可存取 VI_EVENT_USB_INTR 事件物件的「VI_ATTR_USB_RECV_INTR_SIZE」與「VI_ATTR_USB_RECV_INTR_DATA」屬性,達到上述作業。 See the NI-VISA Help for more information about VISA Events.

回到頂端

4. Linux® 與 Mac 的 USB

4.1 Linux

NI-VISA 必須依賴 Linux Kernel Feature 才能支援 USB。此功能即所謂的「usbfs」,而較舊版的 Linux Kernels 則為「usbdevfs」 NI-VISA 必須透過此功能才能支援 USB 裝置 (如同必要的檔案系統)。此支援絕大多數的主要 Linux 套件 (Distributions),如 Red Hat、SuSE,與 Mandrake。使用者必須透過固定指令 (Mount command) 顯示目前所固定的檔案系統,以了解系統目前是否支援此功能。

同樣的,VISA 使用者必須擁有「Write」以存取代表 USB 裝置的檔案;一般均位於 /proc/bus/usb 子目錄下。若不為上述情形,則 VISA 將無法存取 USB 裝置 (將無法使用 viFindRsrc 尋找,而 viOpen 將發生錯誤)。大多數系統的預設設定,則是 Root user 具有 Write access,而其他使用者均不具有此存取權限。.

仍有多個選項可讓 Nonroot user 存取 USB 裝置。

  • 使用 Hotplug 封包。此封包是預設安裝於大多數的套件中,包含 Red Hat、SuSE,與 Mandrake。「Hotplug」封包可讓使用者根據如 Vendor ID (VID) 與 Product ID (PID) 的特性,針對特定 USB 裝置執行指令碼。若已有「Hotplug」封包,則 NI-VISA 安裝檔案將依預設值安裝指令碼,給予使用者所有 USB TMC 裝置與 USB RAW 裝置架構的 Write access。若要針對特定 USB RAW 裝置新增 Write permission,則可執行內含的指令:

<VXIPNPPATH>/linux/NIvisa/USB/AddUsbRawPermissions.sh

若要進一步了解「Hotplug」封包,則可參閱下列網頁:http://linux-hotplug.sourceforge.net/.

  • usbfs (即為 usbdevfs) 可能透過「devmode=0666」選項固定之。此將針對所有 USB 裝置,給予所有使用者 Read 與 Write。
  • Root user 可能將 Write permissions 新增至代表 USB 裝置的檔案;一般均位於 /proc/bus/usb 子目錄下。請注意,若自電腦移除這些裝置,則亦將喪失這些 Permission。因此不建議使用此種方法。

4.2 Mac OS X

只要系統中沒有其他驅動程式要求 (Claim) USB 裝置,即可使用 NI-VISA 存取之。另外並沒有特殊設定。