Especificación de archivo de registro NI-XNET

Información general

Esta especificación de archivo de registro NI-XNET define un formato de archivo binario simple y abierto para el almacenamiento de datos de red embebidos (CAN, FlexRay y LIN). El propósito principal del archivo de registro es su uso en ejemplos de NI-XNET, NI-CAN y CompactRIO para el registro, la reproducción y la visualización de datos de red embebidos. El archivo de registro NI-XNET también se utiliza en las herramientas de NI, como el NI-XNET Bus Monitor.

Contenido

Nota

Aunque el formato de archivo de registro NCL es compatible para la compatibilidad, el formato de archivo de registro TDMS se recomienda para nuevas aplicaciones. Para obtener más información, consulte Datos de red incrustados en TDMS.

Metas

Objetivos de la especificación de archivo de registro NI-XNET:

  • Simple: El formato de cada evento (frame) en el archivo de registro es análogo al formato de frame utilizado por NI-XNET, NI-CAN y la interfaz de E/S LabVIEW FPGA para CAN (módulo CompactRIO CAN). Esto hace que el desarrollo de aplicaciones sea más fácil y eficiente.
  • Abierto: La codificación del archivo de registro NI-XNET se especifica completamente en este documento, y el código fuente se proporciona en ejemplos. Puede incorporar el código de ejemplo en su aplicación sin cambios, lo que garantizará que su aplicación funcione correctamente con herramientas NI. Alternativamente, puede mejorar el código de ejemplo para crear su propio formato de archivo de registro (con su propia extensión de archivo).
  • Binario: Con el fin de apoyar el registro eficiente de cargas de bus completas, el formato es binario en lugar de texto legible por humanos. Este formato binario es muy similar al formato raw frame de NI-XNET. La única diferencia entre este formato de archivo y el formato crudo NI-XNET es que dentro del archivo, los elementos de varios bytes usan un orden de bytes específico, mientras NI-XNET siempre usa el orden de bytes nativo.
  • Extensible: Cada archivo de registro NI-XNET comienza con un encabezado que incluye información de versión. Las versiones posteriores de esta especificación darán como resultado archivos con versiones actualizadas. Aunque sus aplicaciones pueden centrarse en el soporte de una sola versión, las futuras herramientas NI interpretarán todas las versiones.
  • Tramas (no formas de onda): Todo el software de red integrado de NI proporciona lectura y escritura de datos como tramas. Los datos de trama representan los bits brutos que se transfieren a través del cable. Dado que los datos de trama son eficientes y su sincronización corresponde a la sincronización de red, este es el formato utilizado dentro del archivo de registro NI-XNET. NI-XNET también soporta formas de onda con cada señal obtenida de una trama de red específica. Aunque el almacenamiento de datos de red incrustados como formas de onda es menos eficiente, puede usar formatos binarios como el formato de transmisión NI TDM (.tdms) para este fin (consulte la ayuda de LabVIEW o DIAdem para obtener más información).

NOTA!

El archivo de registro creado con la especificación NI-XNET Logfile no se puede utilizar con una aplicación diseñada para las especificaciones NI-CAN Logfile.

Los archivos de registro NI-CAN se pueden utilizar con aplicaciones diseñadas para la especificación de archivo de registro NI-XNET.

Extensión de archivo

La extensión de archivo utilizada por los archivos de registro NI-XNET es:

       .ncl.ncl

Todos los productos de red embebidos de NI asumen que cualquier archivo con esta extensión cumple completamente con esta especificación.

NI proporciona código fuente para acceder a los archivos de registro NI-XNET. Si incorpora el código fuente a su aplicación sin cambios, puede seguir usando la extensión .ncl para los archivos utilizados por esa aplicación.

Si cambia la codificación de los archivos de registro NI-XNET, incluso de una manera aparentemente compatible, debe cambiar la extensión de archivo de .ncl a alguna otra extensión. Esta nueva extensión de archivo identifica sus archivos como conformes a su propia especificación y, por lo tanto, garantiza que el archivo no será malinterpretado por los productos de software de NI para redes embebidas.

Convenios

La especificación utiliza los siguientes tipos para cada elemento:

U8 8 bit entero sin signo

U16 Número entero sin signo de 16 bits, alineado en desplazamiento de 16 bits en el archivo

U32 32 bits entero sin signo, alineado en el desplazamiento de 32 bits en el archivo

U64 64 bits entero sin signo, alineado en desplazamiento de 64 bits en el archivo

Dentro de la cabecera, los elementos de tipo U16, U32 o U64 usan el orden de bytes endian grande (el byte más significativo primero). Dentro de cada Evento (trama), los elementos de varios bytes utilizan el orden de bytes especificado por el elemento EventIsLittleEndian del encabezado.

En el texto siguiente, el término API se refiere al software de National Instruments que utiliza para acceder al hardware de redes incrustadas. Estos son los nodos NI-XNET, NI-CAN o LabVIEW FPGA CAN.

Dentro del formato de tramas sin procesar NI-XNET, los elementos de U16, U32 o U64 siempre utilizan el orden de bytes nativo. Dado que ese orden de bytes nativo puede diferir del elemento EventIsLittleEndian en un archivo de registro, esta es la única diferencia entre el formato NI-XNET y el formato de archivo de registro.

Encabezado

El encabezado es la primera secuencia de elementos del archivo de registro. Solo existe un encabezado por archivo de registro.

ElementoTipoDescripción
FirmaU16Un valor fijo para todos los archivos de registro NI-XNET, utilizado para validar que la codificación binaria del archivo cumple con esta especificación. El valor es hexadecimal 4E49 (“NI” en ASCII).
HeaderSizeU16Tamaño del encabezado en múltiplos de U32 (incrementos de 4 bytes), incluyendo Signature y HeaderSize.
HeaderMajorVersiónU8Versión principal para el encabezado (es decir, 1 en 1.5). Esto indica un cambio que rompe la compatibilidad con la versión anterior.
HeaderUpgradeVersiónU8Versión de actualización para el encabezado (es decir, 5 en 1.5). Esto indica un cambio que conserva la compatibilidad con la versión 0 de actualización.
EventMajorVersiónU8Versión principal para todos los eventos del archivo.  Esto indica un cambio que rompe la compatibilidad con la versión anterior.
EventUpgradeVersionU8Versión de actualización para todos los eventos del archivo.  Esto indica un cambio que conserva la compatibilidad con la versión 0 de actualización.
EventIsLittleEndianU8

Si este elemento es 0, todos los elementos de varios bytes (tipo U16, U32 o U64) en el evento usan el orden de bytes big-endian (el byte más significativo primero). Si este elemento es 1, todos los elementos de varios bytes en el Evento usan un orden de bytes little-endian (primero el byte menos significativo).

Para un rendimiento óptimo, se recomienda utilizar el orden de bytes que es nativo de su plataforma de computación. Esto es típicamente little-endian para Windows y PXI LabVIEW Real-Time, y big-endian para CompactRIO.

Para la mejor portabilidad de los archivos de registro de una plataforma de computación a otra, se recomienda usar el orden de bytes big-endian.

En el código de ejemplo, la función Abrir archivo de registro toma un parámetro de entrada que se utiliza para especificar el orden de bytes deseado: nativo o big-endian. Después de esa función Abrir, todo el intercambio de bytes se gestiona automáticamente. Su aplicación puede leer/escribir fotogramas usando la API e intercambiarlos con las funciones de archivo de registro de lectura/escritura, sin necesidad de intercambiar códigos de bytes especiales entre ellos.

(reservado)3 U8Los tres bytes deben ser cero. Estos bytes rellenan la cabecera de tal manera que permanece un múltiplo de 4 bytes de tamaño.

 

Para esta especificación, el encabezado debe consistir siempre en la siguiente secuencia de bytes en hexadecimal:

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

XX es EventIsLittleEndian, que es 0 (big-endian) o 1 (little-endian).

La actualización del encabezado de 1.0 a 1.1 se debió a la adición del elemento EventIsLittleEndian. Si el código de ejemplo NI-XNET lee el encabezado 1.0 (HeaderSize 2), asume big-endian para el evento.

La actualización del evento de 1.0 a 2.0 se debió a la adición de tipos de eventos para FlexRay. A diferencia de los marcos CAN anteriores, los marcos FlexRay pueden variar de tamaño. La actualización también refleja la posibilidad de elementos little-endian (1.0 siempre fue big-endian). Si el código de ejemplo NI-XNET lee el evento 1.0, asume que todos los eventos son tramas CAN de 24 bytes, con todos los elementos big-endian.

Evento

Después del encabezado, el archivo de registro NI-XNET contendrá cero o más eventos. Cada evento normalmente representa una sola trama, pero también puede codificar otra información como errores o desencadenantes.

Cada evento en el archivo de registro comienza con la siguiente unidad base de 24 bytes. La unidad base es seguida por cero o más unidades de carga útil de 8 bytes. Las unidades de carga útil adicionales son necesarias para las tramas FlexRay, que pueden contener hasta 254 bytes de carga útil total.

5.1. Unidad de base

ElementoTipoDescripción
TimestampU64

Marca de tiempo de 64 bits en incrementos de 100 nanosegundos. El formato de marca de tiempo puede ser absoluto (fecha/hora) o relativo (base cero).

Para NI-XNET, el formato de sello de tiempo es siempre absoluto. Para el desarrollo en LabVIEW, la marca de tiempo dentro de los marcos NI-XNET es el tipo de marca de tiempo LabVIEW, que el código de ejemplo convierte a U64 como parte de la E/S del archivo. Para el desarrollo en C/C++, la marca de tiempo dentro de las tramas NI-XNET es U64 (igual que este elemento).

Para NI-CAN, el formato de marca de tiempo predeterminado es absoluto, pero puede configurar el tiempo relativo si lo desea. Para el desarrollo en LabVIEW, la marca de tiempo dentro de los marcos NI-CAN es de coma flotante (DBL) segundos, que el código de ejemplo convierte a U64 como parte de la E/S del archivo. Para el desarrollo NI-CAN en C/C++, la marca de tiempo dentro de las tramas NI-CAN es de dos elementos U32 en orden little-endian.

Para el desarrollo de FPGA LabVIEW, el formato de marca de tiempo es siempre relativo. La marca de tiempo es de dos elementos U32 en orden little-endian.

IdentificadorU32

Identificador del marco.

Cuando Type especifica una trama CAN, el bit 29 (hexadecimal 20000000) indica el formato del identificador CAN: set for extended, clear for standard. Si el bit 29 está claro, los 11 bits inferiores (0-10) contienen el identificador de trama CAN. Si se establece el bit 29, los 29 bits inferiores (0-28) contienen el identificador de trama CAN.

Cuando Type especifica una trama FlexRay, los 16 bits inferiores contienen el número de ranura.

Todos los bits no usados son cero.

TipoU8

Tipo de evento (marco).

Este elemento especifica el tipo fundamental del marco. La interpretación de los elementos Identificador, Banderas e Info es diferente para cada tipo.

Para el desarrollo NI-XNET, esto corresponde al elemento Type en las tramas CAN y FlexRay.

Para el desarrollo NI-CAN en LabVIEW, esto corresponde al elemento IsRemote en las tramas CAN y LIN.

Para el desarrollo NI-CAN en C/C++ (u otros lenguajes), esto corresponde al elemento FrameType en las tramas CAN y LIN.

Para el desarrollo FPGA LabVIEW, esto corresponde al elemento Type en el marco CAN.

Los 4 bits superiores de este elemento especifican el protocolo (hexadecimal):

  • 0 CAN
  • 1 LIN
  • 2 FlexRay
  • 3-D Reservado (sin usar)
  • Ninguno (sin relación con el protocolo)
  • F Custom (tipos específicos de cliente en logfile solamente)

Los 4 bits inferiores de este elemento son del tipo específico.

Los tipos más comunes en hexadecimal son 00 (cuadro de datos CAN), 01 (cuadro remoto CAN), 12 (cuadro completo LIN), 20 (cuadro de datos FlexRay) y 21 (cuadro nulo FlexRay). Consulte la documentación de su API para otros tipos.

La categoría Personalizada (F en 4 bits superiores) está diseñada específicamente para su uso en archivos de registro. Además de usar este formato de archivo de registro para marcos de red incrustados, es posible que deba codificar otros datos, como mediciones analógicas o digitales, o el tiempo que se presiona un botón del panel frontal. Cuando cree eventos personalizados de este tipo, debe saber que las versiones futuras de la API no devolverán ese tipo desde la función Leer. Además, es posible que desee que la función API Write ignore estos eventos personalizados. Aunque todos los tipos de 00 a EF hex están reservados para su uso por los productos NI, los tipos F0 a FF están disponibles para usted como tipos personalizados. Cuando utiliza uno de estos tipos personalizados, los productos NI ignoran el evento. La definición del identificador, banderas, información y carga útil depende de usted. Si tiene la intención de intercambiar archivos de registro con otras empresas, recomendamos utilizar una extensión de archivo diferente a .ncl (o una firma diferente), para evitar conflictos entre las diferentes definiciones de tipos personalizados.

Aparte del Tipo de fotograma personalizado y los 2 bits superiores del elemento Info, debe asumir que todos los demás bits del evento están reservados para su uso futuro por los productos NI. Para los bits que no se utilizan actualmente (es decir, los bits 30 y 31 de Identifier), la función API Read siempre devolverá 0, y siempre debe usar 0 para los fotogramas pasados a API Write.

BanderasU8

Ocho banderas booleanas que califican el Tipo de marco.

Este elemento existe en NI-XNET. Se utiliza para CAN y FlexRay (consulte la documentación NI-XNET para más detalles).

Este elemento no existe en los marcos NI-CAN.

Este elemento existe en LabVIEW FPGA CAN frames (InfoA), pero actualmente no se utiliza (reservado para el futuro).

InfoU8

Información que califica el Tipo de fotograma.

Este elemento existe en NI-XNET. No se utiliza para CAN. Para fotogramas FlexRay, proporciona el recuento de ciclos para el fotograma (0 a 63).

Este elemento no existe en los marcos NI-CAN.

Este elemento existe en LabVIEW FPGA CAN frames (InfoB), pero actualmente no se utiliza (reservado para el futuro).

Los 2 bits superiores de este elemento están dedicados al uso personalizado, al igual que el rango personalizado para el elemento Tipo. Estos 2 bits personalizados le permiten agregar información a los marcos CAN, LIN y FlexRay (tipos en el rango NI). La API Read siempre devolverá los 2 bits personalizados como 0, pero puede O en sus propios bits antes de escribir en el archivo de registro. Si desea leer fotogramas de un archivo de registro y pasarlos a la función API Write, la API ignorará cualquier valor en estos 2 bits personalizados.

Longitud de cargaU8

La longitud de la carga útil indica el número de bytes de datos válidos en la carga útil.

Para todas las tramas CAN y LIN, PayloadLength no puede exceder de 8. Dado que esta unidad base siempre incluye 8 bytes de datos de carga útil, toda la trama CAN/LIN está contenida en la unidad base y no existen unidades de carga útil adicionales.

Para tramas FlexRay, PayloadLength varía de 0 a 254 bytes. Si PayloadLength es 0 a 8, solo existe la unidad base. Si PayloadLength es 9 o mayor, una o más unidades de carga útil siguen a la unidad base. Se proporcionan unidades de carga útil adicionales en incrementos de 8 bytes, para optimizar la eficiencia de las transferencias de DMA. Por ejemplo, si PayloadLength es 9, los bytes 0-7 están en la carga útil de la unidad base, el byte 8 está en el primer byte de la siguiente unidad de carga útil y se ignoran los últimos siete bytes de la siguiente unidad de carga útil.

En otras palabras, cada fotograma en los datos sin procesar puede variar en longitud. El tamaño (en bytes) de cada trama se puede calcular utilizando el pseudocódigo:

U16 FrameSize; // máximo 272 para el cuadro FlexRay más grande
  FrameSize = 24; // unidad base de 24 bytes
  if (Longitud de carga útil > 8)
    FrameSize = FrameSize +
      (U16) (longitud de la carga útil - 1) Y 0xFFF8;

La última línea en el pseudocódigo resta uno, y trunca al múltiplo de 8 más cercano (usando AND bit a bit). Esto agrega bytes para unidades de carga útil adicionales. Por ejemplo, PayloadLength de 9 a 16 requiere una unidad de carga adicional de 8 bytes.

El código de ejemplo maneja los detalles de esta codificación de trama de longitud variable en su nombre.

Carga útil8 U8Este elemento siempre utiliza 8 bytes en el archivo de registro, pero el número de bytes válidos se determina por PayloadLength.

 

5.2. Unidad(es) de carga útil

El número de unidades de carga útil adicionales (0 a 31) viene determinado por el elemento Longitud de carga útil de la unidad base.

ElementoTipoDescripción
Carga útil8 U8Este elemento siempre utiliza 8 bytes en el archivo de registro, pero el número de bytes válidos se determina por PayloadLength.

 

Más información 

Las especificaciones NI-XNET Logfile también se instalan con NI-XNET (normalmente en C:\Archivos de programa\National Instruments\NI-XNET\Documentación)

Was this information helpful?

Yes

No