NI-CAN 通道 API

概觀


本文件說明適用於 NI-CAN 驅動程式軟體的通道 API 基本概念。適用於剛開始使用 NI-CAN 2.0 及更新版本的工程師。如需軟體的完整概述,請參閱 NI-CAN 硬體與軟體使用者手冊。 


NI-CAN 相容於 LabVIEW 到 LabVIEW 2018 的版本,若使用後續版本的 LabVIEW 使用者,請參閱《將 NI-CAN 應用程式轉移至 NI-XNET》指南。

內容

簡介

NI-CAN 驅動程式軟體除了可在 NI Measurement & Automation Explorer (MAX) 中進行設定與分析的工具之外,還提供 2 個功能完整的應用程式設計介面 (API)。NI-CAN API 可讓您開發專為測試與模擬需求客制化的應用。NI-CAN Channel API 具備高階且簡單易用的函式,可存取由 Vector database (.dbc) 或 NI CAN 資料庫 (.ncd) 檔案所定義的 CAN 通道。Channel API 並推薦予 CAN 初階使用者。Frame API 則是可進行位元組的初階存取作業,並可透過 CAN 匯流排傳輸位元,推薦予高階使用者。本文件著重說明通道 API。如需框架 API 的詳細資訊,請參閱 NI-CAN 硬體與軟體手冊。

NI-CAN Channel API 運用預定義的 CAN 通道進行類似 NI-DAQ 程式設計的 CAN 程式設計。圖 1 顯示通道 API 的基本程式設計模型。

LabVIEW 的基本 NI-CAN Channel API 程式設計模型


圖 1 LabVIEW 的基本 NI-CAN Channel API 程式設計模型

通道設定


首先必須定義或匯入 CAN 通道。您可以使用 Measurement & Automation Explorer (MAX) 完成這項作業,這是一款設定架構的公用程式,可用來安裝、測試與設定大多數的 NI 硬體,包括 CAN 介面。MAX 也可用來匯入或建立 CAN 資料庫檔案,並提供其他工具,例如 CAN 匯流排監控與 CAN 通道測試面板。


圖 2:Measurement & Automation Explorer 中的 CAN 通道

資料庫檔案匯入通道


通常建議您從資料庫檔案匯入 CAN 通道。若要從向量資料庫 (.dbc) 檔案匯入 CAN 通道,請展開 Data Neighborhood 樹狀結構,查看 CAN 通道。以滑鼠右鍵按一下「CAN 通道」,然後選擇「從 CANdb 檔案匯入」。這些資料庫檔案通常是由設計 CAN 裝置的工程師所建立。現在瀏覽直到找到所需的資料庫檔案為止。找到並選擇該檔案後,您可以選擇匯入檔案中的所有訊息,也可以選擇要匯入的特定通道。按一下「匯入」按鈕,然後按一下「完成」。訊息與通道 (Messages and Channels) 現將出現在 MAX (CAN Channels) 下,如圖 2 所示。只要展開訊息樹狀結構、以滑鼠右鍵按一下所需的通道,然後進入屬性,即可檢視並編輯這些訊息與通道。檢視通道的屬性,即可查看訊息網格中的通道位置。

在 Measurement & Automation Explorer 中建立通道


有時您可能沒有可用的向量資料庫檔案,因此需要在 MAX 中建立通道。首先以滑鼠右鍵按一下「CAN 通道」,然後選擇「建立訊息」。請指定名稱、仲裁 ID、資料位元組數量與預設介面,然後選擇「確定」(OK)。現在,只要以滑鼠右鍵按一下訊息並選擇「建立通道」(Create Channel),即可建立個別通道。您應指定通道名稱、開始位元、位元數、調整資訊與單位。請注意,指定開始位元與位元數時,右下方的網格會顯示訊息中的通道位置。

點擊「確定」(OK) 後,該頻道將出現在 MAX (訊息) 下方。若要建立其他通道,請以滑鼠右鍵再次按一下訊息,並選擇「建立通道」。這次請注意,網格已醒目提示您為上一個通道保留的位元。若您嘗試為相同位元設定其他通道,會看到紅色的錯誤指標。其他步驟為建立通道以完成訊息的相同步驟。您可以使用類比與數位通道組合設定訊息;每個通道最多可使用 64 個 1 位元的數位通道。

只要有所需的通道設定,即可儲存並用於其他電腦。以滑鼠右鍵按一下「CAN 通道」,並選擇「儲存通道設定」。如此將設定儲存為 NI CAN 資料庫 (.ncd) 檔案,可匯入 MAX,或使用 NI-CAN 2.0 或更新版本的驅動程式軟體直接從您的應用呼叫。如同先前的向量資料庫 (.dbc) 檔案所示,您也可以從已儲存的設定,將 NI 資料庫 (.ncd) 檔案匯入 MAX。若要執行此操作,請以滑鼠右鍵按一下「CAN 通道」,並選擇「Load Channel Configuration」(載入通道設定)、瀏覽至 .ncd 檔案,並選擇所需的訊息。選擇「載入」(Load),然後按一下「完成」(Done)」,現在,通道將再次顯示在 MAX 中。

通道 API 函式


基本的 NI-CAN 程式包含 Initialization、Read or Write 與 Clear (見圖 1)。函式之間的連結是「Task」(工作)。CAN 工作項目是具有相同時序與通訊方向 (讀取/寫入) 的 CAN 通道集合。工作項目可以包含多個訊息,但所有訊息必須位於相同介面 (連接埠)。無論您使用的是 LabVIEW、LabWindows/CVI、C/C++ 或 Visual Basic 6.0,此程式設計模型一律相同。如需 LabVIEW 教學內容,請前往 ni.com/tutorials。

CAN Init 開始


CAN Init Start VI:CAN Init Start 函式將通道清單初始化為單一工作項目,並開始進行該工作項目的通訊。CAN Init Start 函式會使用下列輸入參數:

CAN Init Start 函式
通道清單:指定工作項目通道清單
介面:指定用於作業的 CAN 介面 (CAN0、CAN1 等)。
模式:指定要用於工作項目的 I/O 模式 (資料傳輸方向)。
取樣率—指定資料傳輸的取樣率 (每秒取樣率)

可讀


多個讀取模式能讓您更輕鬆地客制化應用程式。NI-CAN 有 3 種讀取模式。每個項目將於下列章節中討論:

1.單點
2.連續
3.時間戳記

如果 Init Start 的模式為 Input,則應用必須呼叫 Read 函式,以取得樣本。您的應用通常會呼叫「讀取迴圈」,直到完成。讀取函式是 LabVIEW 中的 CAN Read (所有類型不結束於 Time & Dbl) 與其他語言中的 nctRead。讀取行為取決於初始化取樣率:

CAN Read VI:

在 LabVIEW 中讀取 CAN

單點讀數 (模式 = 輸入,取樣率 = 0)
這項讀取會回傳從網路收到的最新訊息中的單一樣本。Init Start (開始) 清單中的每個通道會傳回一個樣本。想要快速存取最新的 CAN 訊息時最實用。


圖 3 所示的讀取範例為取樣率 = 0。A、B 與 C 代表初始化通道的訊息。若自應用程式啟動後未收到任何訊息,就會傳回 MAX 中的預設值 (def),以及警告。


連續讀取 (模式 = 輸入,取樣率 > 0)
如果想要將資料與 DAQ 裝置的類比或數位資料一起記錄,連續模式就很實用。這項讀取功能會回傳 Init Start (開始) 清單中每個通道的樣本陣列。指定時間每過一次,就會將最新訊息的樣本插入陣列中。換句話說,樣本會以指定的速率在陣列中重複運作,直到收到新的訊息為止。如果想要將資料與 DAQ 裝置的類比或數位資料一起記錄,連續模式就很實用。使用相同的取樣率搭配 NI-DAQ 類比輸入通道後,即可比較隨時間推移的 CAN 與 DAQ 樣本。


圖 4 所示為取樣率 > 0 的讀數範例。A、B 與 C 代表初始化通道的訊息。Δt 代表取樣率指定的取樣間隔時間。def 代表 MAX 中的預設值。


時間戳記讀取 (模式 = 時間戳記輸入)
時戳記模式適用於需要 CAN/DAQ 同步化作業的測試用途,但不需要進一步處理 CAN 資料。如果 Init Start 模式為 Time Stamped Input,則應用必須呼叫 Read Timestamped 函式,以取得值。應用程式通常會在迴圈中呼叫 Read Timestamped,直到完成。Read Timestamped 函式會回傳對應於從網路接收的訊息的樣本。每個訊息都會傳回相關樣本,以及時間戳記,用於指定訊息抵達的時間。InitStart 清單中的每個通道,都會傳回 1 組時間戳記樣本。Read Timestamped 函式是 LabVIEW 中的 CAN Read (結束於 Time & Dbl 的類型),以及其他語言中的 nctReadTimestamped。



圖 5 所示為讀取時間戳記的範例。A、B 與 C 代表初始化通道的訊息。At、B t 與 Ct 代表每個訊息接收的時間。

CAN 寫入


多個寫入模式,可讓您更輕鬆地客制化應用程式。NI-CAN 有 3 種寫入模式。每個項目將於下列章節中討論:

1.單點
2.連續
3.時間戳記

如果 Init Start (開始) 模式為 Output (或 Output Recent),則應用必須呼叫 Write 函式,以輸出值。您的應用通常會呼叫 Write in a Loop 直到完成。Write 函式是 LabVIEW 中的 CAN Write,以及其他語言中的 nctWrite。Write 的行為取決於初始化取樣率:

CAN Write VI

LabVIEW 中的 CAN 寫入

非週期性單點寫入 (模式 = 輸出,取樣率 = 0)
Write 會立即將訊息傳輸至網路。提供給寫入時的樣本可用來形成訊息資料位元組。Init Start (開始) 清單中,必須針對每個通道指定一個樣本。此行為必須使用 Init Start (開始) 模式做為輸出 (而非輸出最近)。圖 6 所示為取樣率 = 0 的寫入範例。A、B、C 與 D 代表初始化通道的訊息。每一次 Write 都會盡快傳輸相關訊息。



圖 6.取樣率寫入範例 = 0

連續寫入 (模式 = 輸出,取樣率 > 0)
在 Init Start (開始) 清單中,您可為每個通道提供一組樣本陣列。每次指定時間過後,就會傳送下一個訊息。每個訊息均會使用陣列中的下一個樣本形成訊息的資料位元組。換句話說,陣列中的樣本會定期傳輸至網路。使用相同的取樣率搭配 NI-DAQ 類比輸出通道,即可隨著時間的推移輸出同步的 CAN 與 DAQ 樣本。



圖 7 所示為取樣率 > 0 與輸出模式的 Write 範例。A、B、C 與 D 代表初始化通道的訊息。Δt 代表取樣率指定的訊息傳輸間隔時間。


單點寫入 (模式 = 輸出近期,取樣率 > 0,您在 Init Start 清單中,為每個通道提供一個樣本。每當時脈按指定的速率旋轉時,就會使用您提供的最新樣本,傳送下一個訊息。若有多項作業在不同速率下執行,輸出近期 (Output Recent) 模式就很實用,因為您可以在單一迴圈中針對所有工作項目撰寫樣本。圖 8 所示為使用取樣率 > 0 與輸出近期模式的寫入範例。



圖 8.取樣率 > 0 的寫入範例,輸出最近模式

CAN 清除


CAN Clear VI:Clear 函式會停止工作項目的通訊,並清除該設定。針對您初始化的每項作業,您必須在結束應用之前呼叫 Clear。Clear 函式是 LabVIEW 中的 CAN Clear,其他的語言則是 nctClear。

在 LabVIEW 中清除 CAN

其他通道 API 功能


下列段落提供可用於擴充基本程式設計模型的資訊。

取得名稱
如果您正在開發其他人想要使用的應用程式,您可能不想在應用程式中指定固定通道清單。理想情況下,您希望使用者從使用者介面控制元件 (例如條列框) 中選擇感興趣的通道。Get Names 函式會查詢 MAX 或 CAN 資料庫,並傳回該資料庫中的所有通道或訊息清單。您可以使用此清單來填入使用者介面控制項。接著您可以從這些控制項中選擇通道,不必使用鍵盤來輸入每個名稱。選擇完成後,您的應用可將結果清單傳遞至 Init Start。Get Names 函式是 LabVIEW 中的 CAN Get Names,以及其他語言中的 nctGetNames。

同步化
NI-CAN Channel API 使用 RTSI 來同步化每個介面卡上的特定功能單元。針對 CAN 介面卡,功能單位是介面 (連接埠)。DAQ 介面卡的功能單元是特定的量測單元,例如類比輸入或類比輸出。每個函式皆會透過 RTSI 連線路由 2 個訊號:
· 時基:指定多個介面卡共用的時脈,以防止時脈漂移。
· 啟動觸發器—指定從一個機板傳送到另一個機板的啟動訊號,以防止開始潛時

設定屬性
此函式可讓您設定網路屬性,包括鮑率、收發器類型與濾波器模式。Init Start 函式使用 MAX 或 CAN 資料庫檔案中指定的介面與通道設定。如果您需要在應用程式中變更此設定,則無法使用 Init Start,因為在工作項目執行時,無法變更大多數屬性。而是先使用 Init,然後設定屬性並啟動工作項目。

取得屬性
此函式可讓您取得通道、訊息或網路的屬性,包括鮑率、訊息 ID 與通道調整係數。


如需通道 API 或框架 API 的詳細資訊,請自 ni.com/manuals 下載 NI-CAN 硬體與軟體 手冊與規格


相關連結:
NI 控制器區域網路 (CAN) 首頁
針對裝置檢驗進行 CAN 與 類比訊號的同步化

Was this information helpful?

Yes

No