The following classes implement different MDF version3 blocks.

Channel Class

class asammdf.mdf2.Channel(**kargs)

CNBLOCK class derived from dict

The Channel object can be created in two modes:

  • using the stream and address keyword parameters - when reading

from file * using any of the following presented keys - when creating a new Channel

The keys have the following meaning:

  • id - Block type identifier, always “CN”
  • block_len - Block size of this block in bytes (entire CNBLOCK)
  • next_ch_addr - Pointer to next channel block (CNBLOCK) of this channel

group (NIL allowed) * conversion_addr - Pointer to the conversion formula (CCBLOCK) of this signal (NIL allowed) * source_depend_addr - Pointer to the source-depending extensions (CEBLOCK) of this signal (NIL allowed) * ch_depend_addr - Pointer to the dependency block (CDBLOCK) of this signal (NIL allowed) * comment_addr - Pointer to the channel comment (TXBLOCK) of this signal (NIL allowed) * channel_type - Channel type

  • 0 = data channel
  • 1 = time channel for all signals of this group (in each channel group,

exactly one channel must be defined as time channel). The time stamps recording in a time channel are always relative to the start time of the measurement defined in HDBLOCK.

  • short_name - Short signal name, i.e. the first 31 characters of the

ASAM-MCD name of the signal (end of text should be indicated by 0) * description - Signal description (end of text should be indicated by 0) * start_offset - Start offset in bits to determine the first bit of the signal in the data record. The start offset N is divided into two parts: a “Byte offset” (= N div 8) and a “Bit offset” (= N mod 8). The channel block can define an “additional Byte offset” (see below) which must be added to the Byte offset. * bit_count - Number of bits used to encode the value of this signal in a data record * data_type - Signal data type * range_flag - Value range valid flag * min_raw_value - Minimum signal value that occurred for this signal (raw value) * max_raw_value - Maximum signal value that occurred for this signal (raw value) * sampling_rate - Sampling rate for a virtual time channel. Unit [s] * long_name_addr - Pointer to TXBLOCK that contains the ASAM-MCD long signal name * display_name_addr - Pointer to TXBLOCK that contains the signal’s display name (NIL allowed) * aditional_byte_offset - Additional Byte offset of the signal in the data record (default value: 0).

Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Examples

>>> with open('test.mdf', 'rb') as mdf:
...     ch1 = Channel(stream=mdf, address=0xBA52)
>>> ch2 = Channel()
>>> ch1.name
'VehicleSpeed'
>>> ch1['id']
b'CN'

Attributes

name (str) full channel name
address (int) block address inside mdf file
dependencies (list) lsit of channel dependencies

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

ChannelConversion Class

class asammdf.mdf2.ChannelConversion(**kargs)

CCBLOCK class derived from dict

The ChannelConversion object can be created in two modes:

  • using the stream and address keyword parameters - when reading

from file * using any of the following presented keys - when creating a new ChannelConversion

The first keys are common for all conversion types, and are followed by conversion specific keys. The keys have the following meaning:

  • common keys

    • id - Block type identifier, always “CC”
    • block_len - Block size of this block in bytes (entire CCBLOCK)
    • range_flag - Physical value range valid flag:
    • min_phy_value - Minimum physical signal value that occurred for this

    signal * max_phy_value - Maximum physical signal value that occurred for this signal * unit - Physical unit (string should be terminated with 0) * conversion_type - Conversion type (formula identifier) * ref_param_nr - Size information about additional conversion data

  • specific keys

    • linear conversion

      • b - offset
      • a - factor
      • CANapeHiddenExtra - sometimes CANape appends extra information;

      not compliant with MDF specs

    • ASAM formula conversion

      • formula - ecuation as string
    • polynomial or rational conversion

      • P1 .. P6 - factors
    • exponential or logarithmic conversion

      • P1 .. P7 - factors
    • tabular with or without interpolation (grouped by n)

      • raw_{n} - n-th raw integer value (X axis)
      • phys_{n} - n-th physical value (Y axis)
    • text table conversion

      • param_val_{n} - n-th integers value (X axis)
      • text_{n} - n-th text value (Y axis)
    • text range table conversion

      • lower_{n} - n-th lower raw value
      • upper_{n} - n-th upper raw value
      • text_{n} - n-th text value
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Examples

>>> with open('test.mdf', 'rb') as mdf:
...     cc1 = ChannelConversion(stream=mdf, address=0xBA52)
>>> cc2 = ChannelConversion(conversion_type=0)
>>> cc1['b'], cc1['a']
0, 100.0

Attributes

address (int) block address inside mdf file

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

ChannelDependency Class

class asammdf.mdf2.ChannelDependency(**kargs)

CDBLOCK class derived from dict

Currently the ChannelDependency object can only be created using the stream and address keyword parameters when reading from file

The keys have the following meaning:

  • id - Block type identifier, always “CD”

  • block_len - Block size of this block in bytes (entire CDBLOCK)

  • dependency_type - Dependency type

  • sd_nr - Total number of signals dependencies (m)

  • for each dependency there is a group of three keys:

    • dg_{n} - Pointer to the data group block (DGBLOCK) of signal dependency n
    • cg_{n} - Pointer to the channel group block (DGBLOCK) of signal dependency n
    • ch_{n} - Pointer to the channel block (DGBLOCK) of signal dependency n
  • there can also be optional keys which decribe dimensions for the N-dimensional dependencies:

    • dim_{n} - Optional: size of dimension n for N-dimensional dependency
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Attributes

address (int) block address inside mdf file

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

ChannelExtension Class

class asammdf.mdf2.ChannelExtension(**kargs)

CEBLOCK class derived from dict

The ChannelExtension object can be created in two modes:

  • using the stream and address keyword parameters - when reading from file
  • using any of the following presented keys - when creating a new ChannelExtension

The first keys are common for all conversion types, and are followed by conversion specific keys. The keys have the following meaning:

  • common keys

    • id - Block type identifier, always “CE”
    • block_len - Block size of this block in bytes (entire CEBLOCK)
    • type - Extension type identifier
  • specific keys

    • for DIM block

      • module_nr - Number of module
      • module_address - Address
      • description - Description
      • ECU_identification - Identification of ECU
      • reserved0’ - reserved
    • for Vector CAN block

      • CAN_id - Identifier of CAN message
      • CAN_ch_index - Index of CAN channel
      • message_name - Name of message (string should be terminated by 0)
      • sender_name - Name of sender (string should be terminated by 0)
      • reserved0 - reserved
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Attributes

address (int) block address inside mdf file

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

ChannelGroup Class

class asammdf.mdf2.ChannelGroup(**kargs)

CGBLOCK class derived from dict

The ChannelGroup object can be created in two modes:

  • using the stream and address keyword parameters - when reading from file
  • using any of the following presented keys - when creating a new ChannelGroup

The keys have the following meaning:

  • id - Block type identifier, always “CG”
  • block_len - Block size of this block in bytes (entire CGBLOCK)
  • next_cg_addr - Pointer to next channel group block (CGBLOCK) (NIL allowed)
  • first_ch_addr - Pointer to first channel block (CNBLOCK) (NIL allowed)
  • comment_addr - Pointer to channel group comment text (TXBLOCK) (NIL allowed)
  • record_id - Record ID, i.e. value of the identifier for a record if the DGBLOCK defines a number of record IDs > 0
  • ch_nr - Number of channels (redundant information)
  • samples_byte_nr - Size of data record in Bytes (without record ID), i.e. size of plain data for a each recorded sample of this channel group
  • cycles_nr - Number of records of this type in the data block i.e. number of samples for this channel group
  • sample_reduction_addr - only since version 3.3. Pointer to first sample reduction block (SRBLOCK) (NIL allowed) Default value: NIL.
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Examples

>>> with open('test.mdf', 'rb') as mdf:
...     cg1 = ChannelGroup(stream=mdf, address=0xBA52)
>>> cg2 = ChannelGroup(sample_bytes_nr=32)
>>> hex(cg1.address)
0xBA52
>>> cg1['id']
b'CG'

Attributes

address (int) block address inside mdf file

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

DataGroup Class

class asammdf.mdf2.DataGroup(**kargs)

DGBLOCK class derived from dict

The DataGroup object can be created in two modes:

  • using the stream and address keyword parameters - when reading from file
  • using any of the following presented keys - when creating a new DataGroup

The keys have the following meaning:

  • id - Block type identifier, always “DG”
  • block_len - Block size of this block in bytes (entire DGBLOCK)
  • next_dg_addr - Pointer to next data group block (DGBLOCK) (NIL allowed)
  • first_cg_addr - Pointer to first channel group block (CGBLOCK) (NIL allowed)
  • trigger_addr - Pointer to trigger block (TRBLOCK) (NIL allowed)
  • data_block_addr - Pointer to the data block (see separate chapter on data storage)
  • cg_nr - Number of channel groups (redundant information)
  • record_id_nr - Number of record IDs in the data block
  • reserved0 - since version 3.2; Reserved
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Attributes

address (int) block address inside mdf file

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

FileIdentificationBlock Class

class asammdf.mdf2.FileIdentificationBlock(**kargs)

IDBLOCK class derived from dict

The TriggerBlock object can be created in two modes:

  • using the stream and address keyword parameters - when reading from file
  • using the classmethod from_text

The keys have the following meaning:

  • file_identification - file identifier
  • version_str - format identifier
  • program_identification - program identifier
  • byte_order - default byte order
  • float_format - default floating-point format
  • mdf_version - version number of MDF format
  • code_page - code page number
  • reserved0 - reserved
  • reserved1 - reserved
  • unfinalized_standard_flags - Standard Flags for unfinalized MDF
  • unfinalized_custom_flags - Custom Flags for unfinalized MDF
Parameters:

stream : file handle

mdf file handle

version : int

mdf version in case of new file

Attributes

address (int) block address inside mdf file; should be 0 always

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

HeaderBlock Class

class asammdf.mdf2.HeaderBlock(**kargs)

HDBLOCK class derived from dict

The TriggerBlock object can be created in two modes:

  • using the stream - when reading from file
  • using the classmethod from_text

The keys have the following meaning:

  • id - Block type identifier, always “HD”
  • block_len - Block size of this block in bytes (entire HDBLOCK)
  • first_dg_addr - Pointer to the first data group block (DGBLOCK)
  • comment_addr - Pointer to the measurement file comment text (TXBLOCK) (NIL allowed)
  • program_addr - Pointer to program block (PRBLOCK) (NIL allowed)
  • dg_nr - Number of data groups (redundant information)
  • date - Date at which the recording was started in “DD:MM:YYYY” format
  • time - Time at which the recording was started in “HH:MM:SS” format
  • author - author name
  • organization - organization
  • project - project name
  • subject - subject

Since version 3.2 the following extra keys were added:

  • abs_time - Time stamp at which recording was started in nanoseconds.
  • tz_offset - UTC time offset in hours (= GMT time zone)
  • time_quality - Time quality class
  • timer_identification - Timer identification (time source),
Parameters:

stream : file handle

mdf file handle

Attributes

address (int) block address inside mdf file; should be 64 always

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

ProgramBlock Class

SampleReduction Class

TextBlock Class

class asammdf.mdf2.TextBlock(**kargs)

TXBLOCK class derived from dict

The ProgramBlock object can be created in two modes:

  • using the stream and address keyword parameters - when reading from file
  • using the classmethod from_text

The keys have the following meaning:

  • id - Block type identifier, always “TX”
  • block_len - Block size of this block in bytes (entire TXBLOCK)
  • text - Text (new line indicated by CR and LF; end of text indicated by 0)
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

text : bytes

bytes for creating a new TextBlock

Examples

>>> tx1 = TextBlock.from_text('VehicleSpeed')
>>> tx1.text_str
'VehicleSpeed'
>>> tx1['text']
b'VehicleSpeed'

Attributes

address (int) block address inside mdf file
text_str (str) text data as unicode string

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)

TriggerBlock Class

class asammdf.mdf2.TriggerBlock(**kargs)

TRBLOCK class derived from dict

The TriggerBlock object can be created in two modes:

  • using the stream and address keyword parameters - when reading from file
  • using the classmethod from_text

The keys have the following meaning:

  • id - Block type identifier, always “TX”
  • block_len - Block size of this block in bytes (entire TRBLOCK)
  • text_addr - Pointer to trigger comment text (TXBLOCK) (NIL allowed)
  • trigger_events_nr - Number of trigger events n (0 allowed)
  • trigger_{n}_time - Trigger time [s] of trigger event n
  • trigger_{n}_pretime - Pre trigger time [s] of trigger event n
  • trigger_{n}_posttime - Post trigger time [s] of trigger event n
Parameters:

stream : file handle

mdf file handle

address : int

block address inside mdf file

Attributes

address (int) block address inside mdf file

Methods

clear(() -> None.  Remove all items from D.)
copy(() -> a shallow copy of D)
fromkeys($type, iterable[, value]) Returns a new dict with keys from iterable and values equal to value.
get((k[,d]) -> D[k] if k in D, …)
items(…)
keys(…)
pop((k[,d]) -> v, …) If key is not found, d is returned if given, otherwise KeyError is raised
popitem(() -> (k, v), …) 2-tuple; but raise KeyError if D is empty.
setdefault((k[,d]) -> D.get(k,d), …)
update(([E, …) If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
values(…)