-
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)
다양한 도구 호환사용법
- 기존 blf & dbc --> mdf or csv 와 동일하다. (blf & dbc --> mdf or csv 변환 :: hsl's tsmaster 사용기)
- 변환 파일 형식을 MDF4 (.mf4)를 선택하면 CTB가 적용된다.

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

코드
- 코드 파일을 첨부한다.
blf_dbc_to_mdf_csv_mp.ctb.py0.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 사용기
'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