雖然 NCL 記錄檔格式可為相容性提供支援,但建議新應用使用 TDMS 記錄檔格式。如需詳細資訊,請參閱「TDMS 中的嵌入式網路資料」。
NI-XNET 記錄檔規格的目標:
使用 NI-XNET Logfile Specification 建立的記錄檔無法搭配針對 NI-CAN Logfile Specifications 設計的應用使用。
NI-CAN 記錄檔可搭配以 NI-XNET 記錄檔規格設計的應用使用。
NI-XNET logfiles 使用的檔案副檔名為:
.ncl
所有 NI 嵌入式網路產品均假設具有此副檔名的檔案完全符合此規格。
NI 提供原始碼,用於存取 NI-XNET 記錄檔案。若您在未經變更的情況下將原始碼整合至應用程式,則可繼續使用 .ncl 副檔名處理該應用程式所使用的檔案。
即使是以看似相容的方式變更 NI-XNET 記錄檔的編碼方式,您也必須將檔案副檔名從 .ncl 變更為其他副檔名。這個新的檔案副檔名可將檔案視為不符合您個人規格的問題,因此可確保 NI 嵌入式網路軟體產品不會誤解檔案。
規格會針對每個元件使用下列類型:
U8 8 位元非正負號整數
U16 16 位元非正負號整數,在檔案中以 16 位元偏移進行對齊
U32 32 位元非正負號整數,在檔案中以 32 位元偏移進行對齊
U64 64 位元非正負號整數,在檔案中以 64 位元偏移進行對齊
表頭內的 U16、U32 或 U64 類型元素會使用大位元組順序 (最有效位元先出)。在每個 Event (框架) 中,多位元元素會使用標頭的 EventIsLittleEndian 元素指定的位元順序。
在下文中,「API」一詞指的是使用以存取嵌入式網路硬體的 NI 軟體。此為 NI-XNET、NI-CAN 或 LabVIEW FPGA CAN 節點。
在 NI-XNET 原始框架格式中,U16、U32 或 U64 的元素一律使用原生位元組順序。由於原生位元順序可能與記錄檔案中的 EventIsLittleEndian 元素不同,因此,這就是 NI-XNET 格式與記錄檔格式之間的唯一差別。
標頭是記錄檔中第一個元素序列。每個記錄檔案僅有一個標頭。
| 元素 | 類型 | 說明 |
| 簽名 | U16 | 所有 NI-XNET 記錄檔的固定值,用於驗證檔案的二進位編碼是否符合此規格。該值為六分數 4E49 (在 ASCII 中稱為「NI」)。 |
| 標頭大小 | U16 | 標頭大小 (使用 U32 的倍數 (增加 4 位元組),包括簽名與標頭大小。 |
| HeaderMajor版本 | U8 | 標頭的 主要版本 (即 1.5 中的 1 個)。這表示變更無法與舊版相容。 |
| HeaderUpgrade 版本 | U8 | 標頭的 升級版本 (即 5 in 1.5)。這表示該變更仍與升級版本 0 相容。 |
| EventMajor 版本 | U8 | 檔案中所有事件的 主要版本。 這表示變更無法與舊版相容。 |
| 事件升級版本 | U8 | 針對檔案中的所有事件進行版本升級。 這表示該變更仍與升級版本 0 相容。 |
| EventIsLittleEndian | U8 | 如果此元素為 0,事件中所有多位元元素 (類型 U16、U32 或 U64) 皆使用大到大位元組順序 (最有效位元先出)。若這個元素為 1,則事件中的所有多位元元元素都會使用小位元組序列 (以最低有效位元先出)。 為了達到最佳效能,建議使用原生的運算平台位元組排序。通常這對 Windows 與 PXI LabVIEW Real-Time 而言很少,對 CompactRIO 來說則是很少。 為了讓記錄檔從一個運算平台移植到另一個運算平台,建議使用大到大位元組排序。 在範例程式碼中,Open Logfile 函式會使用輸入參數來指定所需的位元組順序:native 或 big-endian。Open 函式之後,會自動處理所有位元交換作業。應用程式可使用 API 讀取/寫入框架,再使用 Read/Write Logfile 函式加以交換,且不需在兩者之間交換特定的位元組碼。 |
| (保留) | 3 名 U8 | 全部 3 位元組必須為零。這些位元組可將標頭夾住,使其大小保持 4 位元的倍數。 |
針對此規格,標頭一律以六分數為單位,包含下列位元組序列:
4E 49 00 03 01 02 00 XX 00 00 00
XX是 EventIsLittleEndian,也就是 0 (大到大) 或 1 (小到大)。
由於 EventIsLittleEndian 元素新增,標頭從 1.0 升級為 1.1。如果 NI-XNET 範例程式碼讀取標頭 1.0 (HeaderSize 2),則會假設該事件的 big-endian。
事件從 1.0 升級至 2.0,是因為新增了 FlexRay 的事件類型。FlexRay 框架大小不同於先前的 CAN 框架。這項升級也反映出「小到小」(0 始終是大到小)。如果 NI-XNET 範例程式碼讀取事件 1.0,則會假設所有事件均為 24 位元的 CAN 框架,且所有元素皆為大寫字元。
標頭之後,NI-XNET 記錄檔案將包含零個或更多事件。每個事件通常都代表單一框架,但也可編碼其他資訊,例如錯誤或觸發。
記錄檔中的 每個事件一律以以下的 24 位元基本單位開頭。接著的基本單位為零或更多 8 位元酬載單位。FlexRay 框架最多可容納 254 個酬載位元,因此需要額外的酬載單位。
| 元素 | 類型 | 說明 |
| 時間戳記 | U64 | 每 100 毫微秒漸進的 64 位元時間戳記。時間戳記格式可以是絕對 (日期/時間) 或相對 (以零為準)。 針對 NI-XNET,時間戳記格式一律為絕對格式。在 LabVIEW 中進行開發時,NI-XNET 框架中的時間戳記為 LabVIEW 時間戳記類型,範例程式碼會將其轉換為 U64 做為檔案 I/O 的一部分。以 C/C++ 進行開發時,NI-XNET 框架中的時間戳記為 U64 (與此元素相同)。 針對 NI-CAN,預設時間戳記格式為絕對格式,但如有需要,您可以設定相對時間。在 LabVIEW 中進行開發時,NI-CAN 框架內的時間戳記為浮點 (DBL) 秒,範例程式碼會將其轉換為 U64 做為檔案 I/O 的一部分。針對 C/C++ 中的 NI-CAN 開發,NI-CAN 框架中的時間戳記為 2 個 U32 元件,順序相當小。 在 LabVIEW FPGA 開發中,時間戳記格式一律相對。時間戳記是依序幾分別使用的 2 個 U32 項目。 |
| 識別器 | U32 | 框架識別碼. 當 Type 指定 CAN 框架時,位元 29 (hex 20000000) 表示 CAN 識別元格式: set for extended, clear for standard。如果位元 29 為空白,則較低的 11 位元 (0-10) 會包含 CAN 框架識別元。如果設定了位元 29,則較低的 29 位元 (0-28) 會包含 CAN 框架識別元。 當 Type 指定 FlexRay 框架時,較低的 16 位元會包含插槽號。 所有未使用位元皆為零。 |
| 類型 | U8 | 事件 (框架) 類型。 此元素指定框架的基本類型。識別元件、標記與資訊元素的解釋,各類型各不相同。 針對 NI-XNET 開發,這會對應至 CAN 與 FlexRay 框架中的 Type 元素。 在 LabVIEW 中開發 NI-CAN 時,這會對應 CAN 與 LIN 框架中的 IsRemote 元素。 使用 C/C++ (或其他語言) 開發 NI-CAN 時,這會對應於 CAN 與 LIN 框架中的 FrameType 元素。 在 LabVIEW FPGA 開發中,這會對應至 CAN 框架中的 Type 元素。 此元素的上 4 位元指定協定 (六分數):
此元件的下 4 位元為特定類型。 六十位元中最常見的類型為 00 (CAN 資料框架)、01 (CAN 遠端框架)、12 (LIN 完整框架)、20 (FlexRay 資料框架) 與 21 (FlexRay null 框架)。請參閱 API 使用說明,了解其他類型。 自訂類別 (上 4 位元的 F) 是專為記錄檔案所設計。除了將此記錄檔格式用於嵌入式網路框架之外,您可能還需要編碼其他資料,例如類比或數位量測,或是按下人機介面按鈕的時間。建立此類客制化事件時,請務必注意,未來的 API 版本不會從 Read 函式傳回該類型。此外,您可能會想讓 API Write 函式忽略這些客制化事件。雖然所有從 00 到 EF hex 的型別皆可由 NI 產品使用,但 F0 到 FF 型別可供您客制化。使用上述客制化類型時,NI 產品會忽略事件。識別元、標記、資訊與酬載的定義,由您自行決定。如果您打算與其他公司交換記錄檔,建議使用不同於 .ncl (或其他的 Signature) 的檔案副檔名,以避免不同客制化類型定義之間的衝突。 除了客制框架類型與 Info 元件的上 2 位元之外,您必須假設事件的所有其他位元均為 NI 產品的後續使用所保留。針對目前未使用的位元 (即識別元件的 30 位元與 31 位元),API Read 函式一律會傳回 0,而您一律必須針對傳遞至 API Write 的框架使用 0。 |
| 標誌 | U8 | 八個布林標記,可符合框架類型。 此元素存在於 NI-XNET 中。適用於 CAN 與 FlexRay (詳情請參閱 NI-XNET 說明文件)。 NI-CAN 框架中不存在此元素。 此元素存在於 LabVIEW FPGA CAN 框架 (InfoA),但目前並未使用 (為未來預留)。 |
| 資訊 | U8 | 符合框架類型的資訊. 此元素存在於 NI-XNET 中。不適用於 CAN。針對 FlexRay 框架,它會提供框架的週期數 (0 至 63)。 NI-CAN 框架中不存在此元素。 此元素存在於 LabVIEW FPGA CAN 框架 (InfoB),但目前並未使用 (為未來預留)。 此元件的上 2 位元專為客制化使用,就像 Type 元件的 Custom 範圍一樣。這 2 個客制位元可讓您將資訊新增至 CAN、LIN 與 FlexRay 框架 (NI 範圍內的類型)。API Read 會一律將 2 個客制化位元回傳為 0,但在寫入記錄檔之前,您可以使用您自己的位元 OR。若要從記錄檔案讀取框架,並將其傳遞至 API Write 函式,則 API 將忽略這 2 個客制化位元中的任何值。 |
| PayloadLength | U8 | PayloadLength (酬載長度) 表示 Payload 中的有效資料位元組數。 針對所有 CAN 與 LIN 框架,酬載長度不可超過 8。由於此基本裝置一律包含 8 位元的負載資料,因此,整個 CAN/LIN 框架已包含在基本裝置中,且沒有其他負載單位。 針對 FlexRay 框架,PayloadLength 範圍為 0 到 254 位元組。如果酬載長度為 0 到 8,則只有基本單位可存在。若酬載長度為 9 或更高,則有一或多個酬載單位會依循基本單位。額外的酬載單位可透過 8 位元的漸進方式提供,以最佳化 DMA 傳輸效率。例如,如果 PayloadLength 為 9,則位元 0-7 位元位於基本單元的 Payload 中,位元 8 位元位於下一個 payload 單元的第一位元,而下一個 payload 單元的最後七位元位元則會遭到忽略。 換句話說,原始資料中的每個框架長度都有可能不同。每個框架的大小 (位元) 皆可使用虛擬程式碼計算: U16 FrameSize; // 最大型 FlexRay 訊框最多 272 位元組 虛擬程式碼中的最後一行會扣除 1 個,並中斷為最近的 8 倍數 (使用位元設定 AND)。如此會新增額外酬載單位所需的位元組,舉例來說,在 9 到 16 的酬載長度中,需要額外使用 8 位元組的酬載單元。 範例程式碼負責處理此變數長度框架編碼的詳細資料。 |
| 有效載荷 | 8 名 U8 | 此元素一律在記錄檔案中使用 8 位元組,但有效位元組數由 PayloadLength 決定。 |
額外的負載單元 (0 到 31) 數量,由基本單元的負載長度元素決定。
| 元素 | 類型 | 說明 |
| 有效載荷 | 8 名 U8 | 此元素一律在記錄檔案中使用 8 位元組,但有效位元組數由 PayloadLength 決定。 |
NI-XNET Logfile 規格也會隨同 NI-XNET 一起安裝 (通常位於 C:\Program Files\National Instruments\NI-XNET\Documentation)