1. MDF란?
MDF(Measure Data Format)는 계측 데이터용 바이너리 파일 포맷으로 번역될 수 있습니다. 이름에서도 알 수 있듯이 계측된 데이터를 바이너리 파일 형식으로 저장하는 양식 또는 서식이라고 풀이할 수 있습니다.
조금 더 자세하게 설명하자면, 자동차 산업, 특히 차량 ECU의 개발, 교정, 테스팅에 주로 사용되며, 자동차 애플리케이션에서 발생하는 신호를 획득, 처리, 표시, 문서화/후처리 하는 목적으로 사용되는 파일 포맷입니다.
자동차 애플리케이션에서의 신호는 센서 데이터, ECU 내부 변수/상태, 차량 네트워크 내 버스 트래픽 또는 내부적으로 계산된 값을 뜻하며, 쉽게 말해 자동차 내의 각 기기들에서 발생하는 신호를 처리하기 위해 사용된다고 생각하시면 됩니다.
자동차 애플리케이션의 신호들은 CAN, CAN FD, LIN 등의 프로토콜을 이용해 전달되기 때문에, 이러한 데이터들을 기록하는 목적으로 사용됩니다.
2. ASAM MDF
기존에 존재하던 MDF는 전송 용량이 4GB 정도에 불과해 뚜렷한 한계가 존재했습니다. 이를 극복하며 새롭게 등장한 것이 ASAM MDF이며 2022년 현재 가장 최신 버전은 MDF4입니다. 지금부터 기술하는 모든 내용은 이 MDF4에 맞춰져 있습니다.
ASAM MDF는 XML, 사용자 지정 그룹화, 이벤트, 첨부파일 지원 등을 통해 확장성의 증대를 제공하며, 표준화된 포맷으로 데이터 손실 및 변환 리스크를 최소화했습니다. 또한 측정 중 쓰기, 오프라인 읽기 등을 지원하여 성능면에서도 기대치를 충족시켰습니다.
Benefit of MDF (MDF4)
1. Interoperable - 개방적이고 표준화
2. Fast Writing - 데이터의 빠른 입력이 가능하도록 설계
3. Fast Reading - 인덱스를 기반으로 읽기, 수정 등의 속도가 빠름
4. Compressible - 압축을 지원하여 파일 크기를 크게 줄일 수 있음
5. Raw / Physical - Raw Value와 Physical Value를 모두 사용할 수 있음
6. Software/API - Matlab, CSV, Pandas 등 많은 소프트웨어, API와 호환
3. MDF BLOCK
MDF는 여러 Binary Block들을 모아놓은 형태로 구성됩니다.
그리고 각각의 Block들은 3개의 Section으로 나누어집니다.
1. Header Section: Block ID, Block의 길이, Link Section의 Link의 개수 등 해당 Block의 정보
2. Link Section: 다른 Block으로의 Link 정보 (파일 시작점으로부터의 절대 경로)
3. Data Section: Block 타입에 맞는 실제 데이터를 저장 즉, Header Section에는 해당 Block에 대한 정보가, Link Section에는 관련되어 있는 Block과의 연결 정보가, 그리고 Data Section에는 실제 데이터가 저장되게 됩니다.
4. Block Hierarchy
각각의 Block들은 저장하는 데이터의 내용과 성격에 따라 여러 가지로 분류됩니다. 또한 이러한 분류에 따라 Hierarchy가 형성되게 됩니다.
가장 중요한 Block들은 다음과 같습니다.
ID: MDF 파일임을 명시, 버전 정보
HD: MDF 파일에 대한 데이터(측정 시간 등). 데이터 그룹(DG) 블록에 대한 링크
DG: 데이터가 저장된 블록(DT)을 가리키고, 데이터에 대한 정보를 수집
CG: DG Block의 하위 트리로써 채널 그룹(항상 공동으로 측정되는 채널)에 대한 설명
CN: DG Block의 하위 트리로써 측정된 신호에 대한 정보 및 신호 값의 저장 방법과 같은 채널에 대한 설명
DT: 신호 값에대한 데이터 레코드를 저장
이 외에 주요 Block들은 다음과 같습니다.
MD (Metadata Block) - 가변 길이의 XML 문자열을 저장
TX (Text Block) - 가변 길이의 일반 문자열을 저장
SI (Source Information Block) - 채널 또는 채널 그룹을 획득하는데 필요한 소스 정보 (센서 이름, 유형 등)
CC (Channel Conversion Block) - 채널에 대한 변환 공식 설명
FH (File History Block) - MDF 파일의 기록 변경에 관한 정보
EV (Event Block) : Trigger, Marker와 같은 이벤트에 관한 정보
5. Record Layout
DT 블록 내의 Data Section에는 데이터가 레코드 형식으로 저장됩니다.
각 레코드에는 동시에 획득되거나 샘플링된 신호 값이 포함됩니다. 즉, 한 레코드 내의 모든 신호 값은 동일한 타임스탬프를 가집니다.
만일 서로 다른 레코드가 하나의 DT 블록에 포함될 경우, 각각의 레코드는 레코드 ID로 시작됩니다.
6. Channel
앞에서 살펴보았던 CN Block (Channel Block)에 대해 조금 더 자세하게 알아보겠습니다.
CN Block의 Data Section에는 기록된 신호에 대한 설명과 인코딩하는 방법 등의 정보가 저장됩니다. 채널 이름이 중복될 수 있기 때문에 채널 이름 만으로는 채널을 고유하게 식별할 수 없습니다. 따라서 다른 필드 값과 조합하여 채널을 식별해야 합니다.
Data Section의 크기를 초과하는 복잡한 정보에 대해서는 CN Block 내의 Link Section에서 참조되는 추가 MDF Block에 저장하게 됩니다.
Channel에는 대표적으로 다음과 같은 Type이 있습니다.
1. Fixed Length Data Channel: Raw Value가 고정된 길이로 레코드에 저장되는 가장 일반적인 채널
2. Virtual Data Channel: 신호 값 대신 레코드 인덱스가 Raw Value로 사용되는 채널
3. Variable Length Signal Data Channel(VLSD): 가변 길이의 신호 값을 저장하기 위한 채널
4. Master Channel: 신호 값을 이용하여 기록된 샘플 또는 이벤트의 발생과 관련하여 순서를 지정할 수 있는 채널
7. Composition of Channel
채널은 Structure 또는 Array를 이용하여 구성될 수 있습니다.
Array의 경우 모든 요소의 크기와 데이터 타입이 같아야 하며, Structure 채널이 더 큰 Structure 내에 포함되어 있을 수도 있고, Array의 요소가 다시 Structure 또는 Array일 수 있습니다.
8. Sorted & Unsorted MDF File
Sorted MDF File는 레코드 레이아웃이 고정된 길이를 가지기 때문에 인덱스 기반으로 레코드 위치를 찾기 용이하며, 시간 정보가 규칙적으로 증가하기 때문에 타임스탬프에 대한 레코드를 이진 탐색을 통해 검색이 가능하다는 장점이 있습니다.
Unsorted MDF File은 구현이 쉽고, 레코드를 추가할 때 파일 끝에 간단히 레코드를 붙여 넣을 수 있다는 장점이 있습니다. 하지만 원하는 레코드를 검색할 때는 모든 레코드를 읽으면서 검색해야 한다는 단점이 존재합니다.
9. Raw vs. Physical MDF File
Raw Value는 레코드에 인코딩 된 신호 값을 의미하며, Physical Value는 사람이 읽을 수 있는 값을 의미합니다.
MDF에서는 DBC Database 등의 저장된 변환 규칙을 통해 Raw Value를 Physical Value로 변환할 수 있습니다. 이러한 기능을 통해 다음과 같은 장점을 얻을 수 있습니다.
1. Physical Value로의 변환을 온라인 측정 중에 생략함으로써 성능 최적화 가능
2. 레코드 크기 및 파일 크기를 크게 줄여 메모리 최적화 가능
3. 여러 신호가 하나의 Data Chunk로 왔을 때 별도의 추출 없이 저장할 수 있어 성능 최적화 가능
4. 오프라인 분석 시 Raw Value와 Physical Value를 모두 활용 가능
Reference
https://www.asam.net/standards/detail/mdf/wiki/
https://www.vector.com/kr/ko/products/application-areas/ecu-calibration/measurement/mdf/#c56641
https://www.csselectronics.com/pages/mf4-mdf4-measurement-data-format#what-is-asam-mdf