ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • blf & dbc --> mdf or csv 개선
    application 2026. 4. 3. 22:29

    시작하기 전에 

    • blf는 CAN 프레임 단위로 타임스탬프와 함께 데이터를 저장한다.
    • mdf는 신호 별로 타임스탬프와 함께 데이터를 저장한다.
    • 한 CAN 프레임에 10개 신호들이 있다고 가정하자. 이 10개 신호들을 저장할 때, 동일한 타임스탬프가 10번 저장된다. 타임스탬프를 1회 저장하고 10개 신호들이 공통으로 이 타임스탬프를 참조하도록 하면, 파일 저장 공간을 절약할 수 있다. 이런 CAN 프레임이 10개 있고, 각 프레임에 신호가 10개씩 있다면, 절약할 수 있는 파일 저장 공간이 상당할 것이다.
    • 설마 내가 지구에 왔다갔거나 아직 있는 사람들 중에서 최초로 이런 생각을 한 사람은 아닐 것이다. 찾아보니 ASAM mdf v4 부터는 공통 타임스탬프(Common Time Base: CTB)가 적용되어 있다. 
    • 기존에 만든 blf & dbc --> mdf or csv 변환기는 공통 타임스탬프를 적용하지 않았다. 개선한다.

    프레임 기반 blf 파일과 신호 기반 mdf 파일의 구조를 비교하면 위 그림과 같다.

     

    • blf와 mdf 포맷의 차이점은 아래와 같다.
    Aspect  BLF  MDF4
    Data organization 메시지(프레임) 단위 저장
    여러 신호가 raw bytes로 혼재
    신호(채널) 단위 저장
    각 신호가 독립 컬럼으로 분리
    Timestamp structure 단일 타임라인에 모든 ID가 시간순 혼재 채널별 독립 타임스탬프 배열
    같은 메시지 내 신호는 동일 타임스탬프 공유
    Signal decoding 읽기 시점에 DBC 파일 필요
    (bit position, factor, offset 적용)
    변환 시 이미 디코딩 완료
    읽기에 DBC 불필요, 자체 완결
    Stored values Raw hex bytes
    (factor/offset 미적용, 단위 없음)
    물리값 저장 (rpm, km/h, % 등)
    단위·정밀도 메타데이터 내장
    Multiplexing (MUX) MUX selector byte가 같은 행 안에 혼재
    (구분 불명확)
    selector 값별로 독립 채널로 분리 저장
    (Mux_A, Mux_B…)
    Sample rate per signal 혼재 — ID마다 다른 주기가 단일 스트림에 섞임 채널마다 명확히 분리
    주기·샘플 수가 채널별로 독립
    File size & compression 상대적으로 소형
    이벤트 기록 방식의 compact binary
    상대적으로 대형
    DZ/DL 블록으로 채널 단위 압축 지원
    Common Timebase 개념 없음. 채널 간 공통 시간 기준 미정의 CTB(Common Timebase) 지원
    채널 간 시간 동기화 메타데이터 포함
    Standard & ecosystem Vector 독점 포맷
    CANalyzer/CANoe 중심 생태계
    ASAM 국제 공개 표준 (MDF 4.x)
    다양한 도구 호환

     

     

    사용법

    • 뷰어에서 .mf4 파일을 로드하여 그래프를 그릴 수 있다.  

     

    코드

    • 코드 파일을 첨부한다. 

    blf_dbc_to_mdf_csv_mp.ctb.py
    0.14MB

     

    • 코드를 개선하는 차에 CLI 실행이 가능하도록 하였다. 가능한 커맨드 라인 옵션은 아래와 같다.
    옵션 설명 기본값
    -b, --blf BLF 파일 경로 (필수) -
    -d, --dbc DBC 파일 경로 (필수) -
    -o, --output 출력 파일 경로 (필수) -
    -f, --format 출력 형식 (mdf4/mdf3/csv) mdf4
    --resample-ms 리샘플 주기(ms). 미지정 시 비활성화 (비활성화)
    --resample-method 리샘플 방법 (interp/ffill/mode) ffill
    --normalize-ts 타임스탬프 0초 시작 ✓ 활성화
    --no-normalize-ts 타임스탬프 정규화 비활성화 -
    --workers 병렬 프로세스 수 CPU-1
    --batch-size 배치 크기(프레임) 200000
    --if-exist 기존 파일 처리 (overwrite/skip) overwrite
    -s, --signals 신호 선택 (all 또는 JSON 파일 경로) all
    --scan-limit-mb BLF 스캔 크기 5.0

     

    # 1. 기본 변환 (MDF4, 모든 신호, 정규화)
    python blf_dbc_to_mdf_csv_mp.ctb.py \
      -b test.blf -d database.dbc -o output.mf4
    
    # 2. 리샘플링 + CSV 출력 (50ms 주기, 선형 보간)
    python blf_dbc_to_mdf_csv_mp.ctb.py \
      -b test.blf -d database.dbc -o output.csv \
      --format csv --resample-ms 50 --resample-method interp
    
    # 3. 기존 파일 있으면 건너뛰기 + MDF3 + 여러 워커
    python blf_dbc_to_mdf_csv_mp.ctb.py \
      -b test.blf -d database.dbc -o output.mdf \
      --format mdf3 --if-exist skip --workers 8 --batch-size 500000
    
    # 4. 타임스탬프 정규화 안 함
    python blf_dbc_to_mdf_csv_mp.ctb.py \
      -b test.blf -d database.dbc -o output.mf4 --no-normalize-ts
    
    # 5. JSON 신호 선택 파일 사용
    python blf_dbc_to_mdf_csv_mp.ctb.py \
      -b test.blf -d database.dbc -o output.mf4 \
      --signals my_signals.json

     

     

    결론

    • 기존 blf & dbc --> mdf 변환기를 개선하여 공통 타임스탬프를 사용하는 md4  형식 파일로 저장할 수 있도록 했다.
    • 변환 기능을 툴 체인에 넣어 자동화 할 수 있도록 CLI로 사용할 수 있도록 하였다.
    • md4로 저장할 때 압축 옵션을 사용할 수 있다는 것을 알았다. 압축을 적용하도록 하였다. 50Mbyte 크기의 blf 파일을 변환했다. md4 파일은 45Mbyte이다. mdf 파일은 675Mbyte이다. mdf에 비해 90% 이상 파일 크기가 줄었다. CTB로 파일 크기가 어느 정도 줄었겠지만, 압축으로 파일 크기가 상당히 줄었을 것으로 짐작한다.   

     

    blf & dbc --> mdf 변환 :: hsl's tsmaster 사용기    

    blf & dbc --> mdf or csv 변환 :: hsl's tsmaster 사용기    

    hsl's tsmaster 사용기 목차 :: hsl's tsmaster 사용기    

    'application' 카테고리의 다른 글

    타이어 마모 인덱스  (0) 2026.04.10
    dbc 병합  (1) 2026.03.16
    blf & dbc --> mdf or csv 변환  (0) 2026.03.10
    blf & dbc --> mdf 변환  (1) 2026.03.08
    바이브 코딩으로 진단기 만들기  (0) 2026.01.19