NI-XNET 로그 파일 사양

개요

이 NI-XNET 로그 파일 사양은 임베디드 네트워크 데이터(CAN, FlexRay, LIN)를 저장하는 간단하고 개방형 2진 파일 포맷을 정의합니다. 로그 파일의 주요 목적은 NI-XNET, NI-CAN 및 CompactRIO 예제 내에서 임베디드 네트워크 데이터의 로깅, 재생 및 디스플레이에 사용됩니다. NI-XNET 로그 파일은 NI-XNET 버스 모니터와 같은 National Instruments 도구에서도 사용됩니다.

내용

참고

NCL 로그 파일 형식은 호환성을 위해 지원되지만, TDMS 로그 파일 형식은 새로운 어플리케이션에 권장됩니다. 자세한 내용은 TDMS의 임베디드 네트워크 데이터를 참조하십시오.

목표

NI-XNET 로그 파일 사양의 목표:

  • 단순: 로그 파일의 각 이벤트(프레임) 포맷은 NI-XNET, NI-CAN 및 CAN용 LabVIEW FPGA I/O 인터페이스(CompactRIO CAN 모듈)에서 사용하는 프레임 포맷과 유사합니다. 이렇게 하면 애플리케이션 개발이 더 쉽고 효율적입니다.
  • Open: 이 문서에서는 NI-XNET 로그 파일의 인코딩을 완전히 설명하고, 소스 코드는 예제에 제공됩니다. 어플리케이션에 변경 없이 예제 코드를 통합하여 어플리케이션이 NI 도구와 올바르게 작동하도록 할 수 있습니다. 또는 예제 코드를 향상시켜 자체 로그 파일 포맷(파일 확장자 포함)을 생성할 수 있습니다.
  • 바이너리: 전체 버스 로드의 효율적인 로깅을 지원하기 위해, 이 포맷은 사용자가 읽을 수 있는 텍스트가 아닌 2진 포맷입니다. 이 2진 포맷은 NI-XNET 원시 프레임 포맷과 매우 비슷합니다. 이 파일 형식과 NI-XNET 원시 형식의 유일한 차이점은 파일 내에서 멀티 바이트 원소가 특정 바이트 순서를 사용하는 반면 NI-XNET은 항상 기본 바이트 순서를 사용한다는 점입니다.
  • 확장 가능: 각 NI-XNET 로그 파일은 버전 정보를 포함하는 헤더로 시작합니다. 이 스펙의 이후 버전에서는 업데이트된 버전의 파일이 생성됩니다. 어플리케이션이 단일 버전의 지원에 중점을 두어도, 향후 NI 도구는 모든 버전을 해석할 수 있습니다.
  • 프레임 (웨이브폼 제외): 모든 NI 임베디드 네트워크 소프트웨어는 프레임으로 데이터를 읽고 쓸 수 있도록 지원합니다. 프레임 데이터는 케이블을 통해 전송되는 원시 비트를 나타냅니다. 프레임 데이터는 효율적이며 네트워크 타이밍에 해당하기 때문에, NI-XNET 로그 파일 내에서 사용되는 형식입니다. NI-XNET 또한 특정 네트워크 프레임에서 수집된 각 신호가 있는 웨이브폼을 지원합니다. 임베디드 네트워크 데이터를 웨이브폼으로 저장하는 것은 덜 효율적이지만, NI TDM 스트리밍 포맷(.tdms)과 같은 2진 포맷을 사용할 수 있습니다(자세한 정보는 LabVIEW 또는 DIAdem 도움말을 참조하십시오).

참고!

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 타입의 원소는 큰 엔디언 바이트 순서를 사용합니다(최상위 바이트는 먼저). 각 이벤트(프레임) 내에서 멀티 바이트 원소는 헤더의 EventIsLittleEndian 원소에 의해 지정된 바이트 순서를 사용합니다.

다음 텍스트에서, API라는 용어는 임베디드 네트워크 하드웨어에 액세스하는데 사용하는 National Instruments 소프트웨어를 의미합니다. 이것은 NI-XNET, NI-CAN 또는 LabVIEW FPGA CAN 노드입니다.

NI-XNET 원시 프레임 포맷에서 U16, U32 또는 U64의 원소는 항상 기본 바이트 순서를 사용합니다. 이 기본 바이트 순서는 로그 파일의 EventIsLittleEndian 요소와 다를 수 있으므로, NI-XNET 포맷과 로그 파일 포맷 사이의 유일한 차이점입니다.

헤더

헤더는 로그 파일의 첫 번째 원소 시퀀스입니다. 로그 파일당 하나의 헤더만 존재합니다.

원소타입설명
서명U16파일의 2진 인코딩이 이 스펙을 준수하는지 확인하는 데 사용되는 모든 NI-XNET 로그 파일의 고정된 값. 값은 16진수 4E49("NI"는 ASCII)입니다.
헤더 크기U16부호 및 헤더 크기를 포함하여 U32의 배수(4 바이트 증가)로 표시되는 헤더 크기.
HeaderMajorVersionU8헤더의 주요 버전 (즉, 1.5에서 1). 이는 이전 버전과의 호환성을 끊는 변경을 나타냅니다.
HeaderUpgradeVersionU8헤더의 업그레이드 버전(즉, 1.5에서 5). 이는 업그레이드 버전 0과 호환되는 변경 사항을 나타냅니다.
EventMajorVersionU8파일의 모든 이벤트에 대한 주요 버전.  이는 이전 버전과의 호환성을 끊는 변경을 나타냅니다.
EventUpgradeVersionU8파일의 모든 이벤트에 대한 업그레이드 버전.  이는 업그레이드 버전 0과 호환되는 변경 사항을 나타냅니다.
EventIsLittleEndianU8

이 원소가 0인 경우, 이벤트의 모든 멀티 바이트 원소(U16, U32 또는 U64)는 빅 엔디언 바이트 순서를 사용합니다(최상위 바이트 먼저). 이 원소가 1인 경우, 이벤트의 모든 멀티 바이트 원소는 리틀 엔디언 바이트 순서를 사용합니다(최하위 바이트 먼저).

최적의 성능을 위해 계산 플랫폼에 기본적인 바이트 순서를 사용하는 것이 좋습니다. 이것은 일반적으로 Windows 및 PXI LabVIEW Real-Time에서 little-endian이고 CompactRIO에서 big-endian입니다.

로그 파일을 한 컴퓨팅 플랫폼에서 다른 컴퓨팅 플랫폼으로 이동하려면 빅 엔디언 바이트 순서를 사용하는 것이 좋습니다.

예제 코드에서 [로그 파일 열기] 함수는 원하는 바이트 순서(native 또는 big-endian)를 지정하는데 사용하는 입력 파라미터를 취합니다. [열기] 함수 이후에는 모든 바이트 교환이 자동으로 처리됩니다. 어플리케이션은 API를 사용하여 프레임을 읽고 쓸 수 있으며, 이 프레임을 읽기/쓰기 로그 파일 함수로 교환할 수 있습니다.

(예약됨)3 U8세 바이트는 모두 0이어야 합니다. 이 바이트는 헤더를 4 바이트의 배수로 유지하도록 채웁니다.

 

이 스펙의 경우, 헤더는 항상 16진수로 표시된 다음 바이트 시퀀스로 구성되어야 합니다.

4E 49 00 03 01 01 02 00 XX 00 00 00

XX는 EventIsLittleEndian이며, 0 (빅 엔디언) 또는 1 (리틀 엔디언)입니다.

1.0에서 1.1로 헤더의 업그레이드 는 EventIsLittleEndian 요소가 추가되었기 때문입니다. NI-XNET 예제 코드가 헤더 1.0 (HeaderSize 2)을 읽는 경우 이벤트의 big-endian을 가정합니다.

FlexRay의 이벤트 타입이 추가되었기 때문에 이벤트가 1.0에서 2.0으로 업그레이드되었습니다. 이전 CAN 프레임과 달리, FlexRay 프레임은 크기가 다를 수 있습니다. 또한 이 업그레이드에서는 리틀-엔디언 원소가 있을 가능성이 반영됩니다.(1.0은 항상 빅-엔디언) NI-XNET 예제 코드가 이벤트 1.0을 읽는 경우, 모든 이벤트가 24 바이트 CAN 프레임이며 모든 원소는 big-endian이라고 가정합니다.

이벤트

헤더 이후 NI-XNET 로그 파일에는 0개 이상의 이벤트가 포함됩니다. 각 이벤트는 일반적으로 단일 프레임을 나타내지만 에러 또는 트리거와 같은 다른 정보를 인코딩할 수도 있습니다.

로그 파일의 모든 이벤트는 다음의 24 바이트 베이스 유닛에서 시작합니다. 베이스 유닛 뒤에는 0 또는 그 이상의 8 바이트 페이로드 유닛이 따라옵니다. FlexRay 프레임에는 추가 페이로드 단위가 필요하며, 전체 페이로드 바이트가 최대 254개가 될 수 있습니다.

5.1. 기본 단위

원소타입설명
타임스탬프U64

100 나노초 단위로 증가하는 64비트 타임스탬프. 타임스탬프 포맷은 절대(날짜/시간) 또는 상대(제로 기준)일 수 있습니다.

NI-XNET의 경우, 타임스탬프 형식은 항상 절대적입니다. LabVIEW 개발에서, NI-XNET 프레임 내의 타임스탬프는 LabVIEW 타임스탬프 타입으로, 예제 코드는 파일 I/O의 일부로 U64로 변환합니다. C/C++로 개발하는 경우, NI-XNET 프레임 내의 타임스탬프는 U64입니다(이 요소와 동일).

NI-CAN의 경우, 기본 타임스탬프 포맷은 절대적이지만 원하는 경우 상대 시간을 구성할 수 있습니다. LabVIEW 개발하는 경우, NI-CAN 프레임 내의 타임스탬프는 부동소수(DBL) 초이며, 예제 코드는 파일 I/O의 일부로 U64로 변환합니다. C/C++에서 NI-CAN 개발의 경우, NI-CAN 프레임 내의 타임스탬프는 리틀 엔디언 순서의 두 개의 U32 요소입니다.

LabVIEW FPGA 개발의 경우, 타임스탬프 포맷은 항상 상대적입니다. 타임스탬프는 리틀 엔디언 순서의 두 U32 요소입니다.

식별자U32

프레임의 식별자.

타입이 CAN 프레임을 지정할 때, 비트 29(16,0000000)는 CAN 식별자의 포맷을 나타냅니다: 확장형으로 설정, 표준으로 지우기. 비트 29가 지워진 경우, 하위 11비트(0-10)는 CAN 프레임 식별자를 포함합니다. 비트 29가 설정된 경우, 하위 29비트(0~28)는 CAN 프레임 식별자를 포함합니다.

타입이 FlexRay 프레임을 지정하는 경우, 하위 16비트는 슬롯 번호를 포함합니다.

사용하지 않는 모든 비트는 0입니다.

유형U8

이벤트 유형(프레임).

이 요소는 프레임의 기본 타입을 지정합니다. 식별자, 플래그, 정보 요소의 해석은 각 타입에 따라 다릅니다.

NI-XNET 개발에서는 CAN 및 FlexRay 프레임의 Type 요소에 해당합니다.

LabVIEW에서 NI-CAN 개발의 경우, 이는 CAN 및 LIN 프레임의 IsRemote 요소에 해당합니다.

C/C++(또는 다른 언어)에서 NI-CAN을 개발하는 경우, 이는 CAN 및 LIN 프레임의 FrameType 요소에 해당합니다.

LabVIEW FPGA 개발의 경우, 이는 CAN 프레임의 Type 요소에 해당합니다.

이 원소의 위쪽 4비트는 프로토콜을 지정합니다(16진수):

  • 0 CAN
  • LIN
  • 2 FlexRay
  • 3-D 예약됨(사용하지 않음)
  • E 없음(프로토콜과 관련없음)
  • F 사용자 지정(로그 파일에서 고객별 유형만)

이 원소의 하위 4비트는 특정 유형입니다.

16진수에서 가장 일반적인 타입은 00 (CAN 데이터 프레임), 01 (CAN 원격 프레임), 12 (LIN 전체 프레임), 20 (FlexRay 데이터 프레임), 21 (FlexRay 널 프레임)입니다. 다른 유형에 대해서는 API 문서를 참조하십시오.

사용자 지정 범주(상위 4비트의 F)는 로그 파일에 사용하도록 특별히 설계되었습니다. 임베디드 네트워크 프레임에 이 로그 파일 포맷을 사용하는 것 외에도, 아날로그 또는 디지털 측정과 같은 다른 데이터 또는 프런트패널 버튼을 누르는 시간을 인코딩해야 할 수도 있습니다. 이러한 사용자 이벤트를 생성할 때, [읽기] 함수로부터 이후 API 버전이 해당 타입을 반환하지 않는다는 것을 알아야 합니다. 또한 API 쓰기 함수가 이러한 사용자 이벤트를 무시하도록 할 수도 있습니다. 00부터 EF 16까지의 모든 타입은 NI 제품에서 사용하도록 예약되었지만, F0부터 FF까지의 타입은 사용자 정의 타입으로 사용할 수 있습니다. 이러한 사용자 정의 타입 중 하나를 사용할 때, NI 제품은 이벤트를 무시합니다. 식별자, 플래그, 정보, 페이로드의 정의는 사용자가 결정할 수 있습니다. 로그 파일을 다른 회사와 교환하려는 경우, 사용자 정의 타입의 서로 다른 정의 사이의 충돌을 피하기 위해 .ncl(또는 다른 서명)과 다른 파일 확장자를 사용할 것을 권장합니다.

사용자 프레임 타입 및 정보 원소의 상위 2 비트를 제외하고, 이벤트의 다른 모든 비트가 NI 제품이 향후 사용을 위해 예약된 것으로 가정해야 합니다. 현재 사용되지 않는 비트(즉, 식별자의 비트 30과 31)의 경우, API 읽기 함수는 항상 0을 반환하며, API 쓰기에 전달된 프레임에는 항상 0을 사용해야 합니다.

플래그U8

프레임의 유형을 명시하는 8개의 불리언 플래그입니다.

이 요소는 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 비트는 타입 요소의 사용자 정의 범위와 마찬가지로 사용자 정의 용도로 사용됩니다. 이 2개의 사용자 정의 비트를 사용하면 CAN, LIN, FlexRay 프레임(NI 범위의 타입)에 정보를 추가할 수 있습니다. API 읽기는 항상 2개의 사용자 비트를 0으로 반환하지만, 로그 파일에 쓰기 전에 자체 비트로 OR을 사용할 수 있습니다. 로그 파일에서 프레임을 읽고 API 쓰기 함수로 전달하려는 경우, API는 이 2개의 사용자 지정 비트의 값을 무시합니다.

PayloadLengthU8

PayloadLength는 페이로드의 유효한 데이터 바이트 수를 나타냅니다.

모든 CAN 및 LIN 프레임의 경우 페이로드 길이는 8을 초과할 수 없습니다. 이 베이스 유닛은 항상 8 바이트의 페이로드 데이터를 포함하기 때문에, 전체 CAN/LIN 프레임이 베이스 유닛에 포함되며 추가적인 페이로드 유닛이 존재하지 않습니다.

FlexRay 프레임의 경우, 페이로드 길이는 0 ~ 254 바이트 범위입니다. 페이로드 길이가 0에서 8인 경우, 베이스 유닛만 존재합니다. 페이로드 길이가 9 또는 그 이상인 경우, 하나 이상의 페이로드 단위가 베이스 단위를 따릅니다. DMA 전송의 효율성을 최적화하기 위해 추가적인 페이로드 단위는 8 바이트 증가로 제공됩니다. 예를 들어 페이로드 길이가 9인 경우, 바이트 0-7은 베이스 유닛의 페이로드, 바이트 8은 다음 페이로드 유닛의 첫번째 바이트, 다음 페이로드 유닛의 마지막 7 바이트는 무시됩니다.

즉, 원시 데이터의 각 프레임의 길이는 달라질 수 있습니다. 각 프레임의 크기(바이트 단위)는 다음의 유사 코드를 사용하여 계산할 수 있습니다:

U16 FrameSize; // 최대 272 (최대 FlexRay 프레임)
  FrameSize = 24; // 24 바이트 베이스 단위
  if (PayloadLength > 8)
    프레임 크기 = 프레임 크기 +
      (U16)(PayloadLength - 1) 및 0xFFF8;

유사 코드의 마지막 라인은 1을 빼고 가장 가까운 8의 배수로 자릅니다(비트 단위 AND를 사용). 이렇게 하면 추가적인 페이로드 단위의 바이트가 추가됩니다. 예를 들어 페이로드 길이(9 ~ 16)는 8 바이트의 페이로드 유닛을 하나 더 필요로 합니다.

예제 코드는 이 변수 길이 프레임 인코딩의 세부사항을 귀하를 대신하여 처리합니다.

페이로드8 U8이 원소는 로그 파일에서 항상 8 바이트를 사용하지만 유효한 바이트의 개수는 페이로드 길이에 의해 결정됩니다.

 

5.2. 페이로드 단위

추가 페이로드 유닛의 개수(0 ~ 31)는 베이스 유닛의 페이로드 길이 요소에 의해 결정됩니다.

원소타입설명
페이로드8 U8이 원소는 로그 파일에서 항상 8 바이트를 사용하지만 유효한 바이트의 개수는 페이로드 길이에 의해 결정됩니다.

 

추가 정보 

NI-XNET Logfile 사양은 NI-XNET과 함께 설치됩니다(일반적으로 C:\Program Files\National Instruments\NI-XNET\Documentation)

Was this information helpful?

Yes

No