User Tools

Site Tools

prog:csharp:blf-read:index

2025-02-25 CAN資料格式-BLF

Local Backup

  • Vector工具錄製的數據,一般有ASC和BLF兩種格式,本文介紹ASC。
  • 1.BLF定義
    • BLF(binary logging format)即二進位資料檔。
  • 2.BLF查看
    • 因其是二進位文件,又做了資料壓縮,已經無法直接看到物理數值。需要在Vector工具中回放。
  • 3.BLF組成
    • 安裝完Vector軟體後,可以在Doc\LoggingFormat_BLF目錄下看到《CAN_and_General_BLF_Format.pdf》(回覆「BLF文件」取得)。此文件詳細說明了BLF內容。 BLF內由一系列資料塊組成。介紹幾個常用的:
    • 1)VBLObjectHeaderBase
Parameter Type
mSignature DWORD
mHeaderSize WORD
mHeaderVersion WORD
mObjectSize DWORD
mObjectType DWORD
  • 2)VBLObjectHeader
Parameter Type
mBase VBLObjectHeaderBase
mObjectFlags DWORD
mClientIndex WORD
mObjectVersion WORD
mObjectTimeStamp ULONGLONG
  • 3)VBLCANMessage
Parameter Type
mHeader VBLObjectHeader
mChannel DWORD
mFlags BYTE
mDLC BYTE
mID DWORD
mData[8] BYTE
  • 4.BLF解析
    • 因BLF的保密性,無法直接讀取數值,需要使用Vector提供的binlog.dll,相關的例子可以參考《C:\Users\Public\Documents\Vector\CANoe\9.0 (x64)\CANoe Sample Configurations\Programming\BLF_Logging》。以下介紹《bl.c》的函數read_test。 (回覆“BLF例子”,可以取得ector範例)
      /******************************************************************************
      * *
      * read BL file *
      * *
      ******************************************************************************/
      int read_test( LPCTSTR pFileName, LPDWORD pRead)
      {
          HANDLE hFile;
          VBLObjectHeaderBase base;
          VBLCANMessage message;
          VBLEnvironmentVariable variable;
          VBLEthernetFrame ethframe;
          VBLAppText appText;
          VBLFileStatisticsEx statistics = { sizeof( statistics)};
          BOOL bSuccess;
       
          if ( NULL == pRead)
          {
              return -1;
          }
       
          *pRead = 0;
       
          /* open file */
          hFile = BLCreateFile( pFileName, GENERIC_READ);
       
          if ( INVALID_HANDLE_VALUE == hFile)
          {
              return -1;
          }
       
          BLGetFileStatisticsEx( hFile, &statistics);
       
          bSuccess = TRUE;
          
          /* read base object header from file */
          while ( bSuccess && BLPeekObject( hFile, &base))
          {
              switch ( base.mObjectType)
              {
              case BL_OBJ_TYPE_CAN_MESSAGE:
                  /* read CAN message */
                  message.mHeader.mBase = base;
                  bSuccess = BLReadObjectSecure( hFile, &message.mHeader.mBase, sizeof(message));
                  /* free memory for the CAN message */
                  if( bSuccess) {
                    BLFreeObject( hFile, &message.mHeader.mBase);
                  }
                  break;
              case BL_OBJ_TYPE_ENV_INTEGER:
              case BL_OBJ_TYPE_ENV_DOUBLE:
              case BL_OBJ_TYPE_ENV_STRING:
              case BL_OBJ_TYPE_ENV_DATA:
                  /* read environment variable */
                  variable.mHeader.mBase = base;
                  bSuccess = BLReadObjectSecure( hFile, &variable.mHeader.mBase, sizeof(variable));
                  /* free memory for the environment variable */
                  if( bSuccess) {
                    BLFreeObject( hFile, &variable.mHeader.mBase);
                  }
                  break;
              case BL_OBJ_TYPE_ETHERNET_FRAME:
                  /* read ethernet frame */
                  ethframe.mHeader.mBase = base;
                  bSuccess = BLReadObjectSecure( hFile, ðframe.mHeader.mBase, sizeof(ethframe));
                  /* free memory for the frame */
                  if( bSuccess) {
                    BLFreeObject( hFile, ðframe.mHeader.mBase);
                  }
                  break;
              case BL_OBJ_TYPE_APP_TEXT:
                  /* read text */
                  appText.mHeader.mBase = base;
                  bSuccess = BLReadObjectSecure( hFile, &appText.mHeader.mBase, sizeof(appText));
                  if ( NULL != appText.mText)
                  {
                      printf( "%s\n", appText.mText);
                  }
                  /* free memory for the text */
                  if( bSuccess) {
                    BLFreeObject( hFile, &appText.mHeader.mBase);
                  }
                  break;
              default:
                  /* skip all other objects */
                  bSuccess = BLSkipObject( hFile, &base);
                  break;
              }
       
              if ( bSuccess)
              {
                *pRead += 1;
              }
          }
       
          /* close file */
          if ( !BLCloseHandle( hFile))
          {
              return -1;
          }
       
          return bSuccess ? 0 : -1;
      }
    • 1)hFile = BLCreateFile( pFileName, GENERIC_READ);
      • 以讀取的方式,開啟BLF文件
    • 2)BLGetFileStatisticsEx( hFile, &statistics);
      • 讀取文件統計訊息
    • 3)while ( bSuccess && BLPeekObject( hFile, &base))
      • 讀取文件object
    • 4)switch ( base.mObjectType)
    • 5)bSuccess = BLReadObjectSecure( hFile, &message.mHeader.mBase, sizeof(message));
      • 讀取CAN message
    • 6)bSuccess = BLSkipObject( hFile, &base);
      • 跳過其他object
    • 7) if ( !BLCloseHandle( hFile))
  • 5.開發步驟
    • 需要c/c++基礎
    • 1)新建vc++項目
    • 2)引入頭檔:binlog.h和binlog_objects.h
    • 3)引入庫檔案:binlog.dll和binlog.lib
    • 4)參考bl.c開發

Using CANoe .NET API

  • 6 person(s) visited this page until now.

Permalink prog/csharp/blf-read/index.txt · Last modified: 2025/02/25 13:40 by jethro

oeffentlich