Main Content

使用未最终化和未排序的 MDF 文件

此示例说明如何使用未最终化和未排序的 MDF 文件。此示例中使用的未最终化的 MDF 文件 MDFUnfinalized.MF4 是由 CSS Electronics 提供的 CANedge2 CAN 总线数据记录器记录的。

未最终化和未排序的 MDF 文件简介

有时,因为意外停电或应用程序错误,MDF 文件创建器工具可能会过早终止。在这种情形下,MDF 文件可能会处于未最终化状态,这可能会违反 ASAM MDF 标准的某些格式规则,或在读取操作期间导致数据丢失。

通常,数据组可以是已排序的,也可以是未排序的。有些录制工具会在录制完成后写入未排序的 MDF 文件,而不会对它们进行排序。一个已排序的数据组不能包含一个以上的通道组,而未排序的数据组可能包含多个通道组。如果对一个 MDF 文件中的所有数据组都进行排序,则该 MDF 文件是排序文件;如果有至少一个数据组未排序,则整个 MDF 文件是未排序文件。

未最终化的 MDF 文件可以是经过排序的,也可以是未排序的。反过来,未排序的 MDF 文件可以是最终化的,也可以是未最终化的。

在 MATLAB 中使用未最终化的 MDF 文件

由于未最终化的文件可能包含格式问题并导致不可靠的操作,因此当尝试使用 mdfInfo 函数访问未最终化的 MDF 文件的元数据时会引发错误。

try
    info = mdfInfo("MDFUnfinalized.MF4")
catch ME
    disp(ME.message)
end
Cannot perform operation on unfinalized file. Use mdfFinalize to create a finalized file.

您可以使用函数 mdfFinalize 最终化未最终化的 MDF 文件。如果 MDF 文件既未最终化又未排序,则 mdfFinalize 还会尝试在最终化过程中对文件进行排序。

在 MATLAB 中使用已最终化但未排序的 MDF 文件

如果某 MDF 文件已最终化但未排序,您可以使用 mdfInfo 函数访问该文件元数据,但如果您尝试使用 mdfRead 函数从该未排序的文件中读取数据,则可能会出错。

您可以使用函数 mdfSort 对已最终化但未排序的 MDF 文件进行排序。如果未排序的 MDF 文件也未最终化,则对该文件使用 mdfSort 会导致错误。在这种情况下,请使用 mdfFinalize 同时对文件进行最终化和排序。

此示例继续说明如何将 mdfFinalize 用于未最终化的 MDF 文件。但是,您可以按照类似的工作流对已最终化但未排序的 MDF 文件使用 mdfSort 函数。

就地最终化 MDF 文件

mdfFinalize 函数允许您通过用最终化的副本覆盖源文件来就地最终化未最终化的 MDF 文件。

出于演示目的,使用 copyfile 制作原始文件的副本,并在后续的最终化操作中使用额外的副本 MDFFinalizedInPlace.MF4

copyfile("MDFUnfinalized.MF4", "MDFFinalizedInPlace.MF4")

使用仅指定了源文件名 MDFFinalizedInPlace.MF4mdfFinalize 来创建覆盖自身的最终化副本。该函数返回最终化文件的完整路径。

finalizedPath1 = mdfFinalize("MDFFinalizedInPlace.MF4")
finalizedPath1 = 
"/tmp/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex16754708/MDFFinalizedInPlace.MF4"

MDFFinalizedInPlace.MF4 现已最终化,可以使用 mdfInfo 函数访问。您可以指定由 mdfFinalize 返回的完整路径。如果文件名位于 MATLAB® 路径中,也可以指定文件名。

info1 = mdfInfo(finalizedPath1)
info1 = 
  MDFInfo with properties:

   File Details
                  Name: "MDFFinalizedInPlace.MF4"
                  Path: "/tmp/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex16754708/MDFFinalizedInPlace.MF4"
                Author: ""
            Department: ""
               Project: ""
               Subject: ""
               Comment: ""
               Version: "4.11"
      InitialTimestamp: 2021-04-12 10:06:43.000000000

   Creator Details
     ProgramIdentifier: "CE     "
     CreatorVendorName: ""
       CreatorToolName: "CE"
    CreatorToolVersion: "01.04.01"
       CreatorUserName: ""
        CreatorComment: "Creation and logging of data."

   File Contents
            Attachment: [0x7 table]
     ChannelGroupCount: 8

使用 mdfChannelGroupInfo 函数获取关于最终文件中所有通道组的信息。检查每个通道组的 Sorted 值。请注意,所有通道组现在都已排序。

chanGrpInfo1 = mdfChannelGroupInfo(finalizedPath1)
chanGrpInfo1=8×13 table
    GroupNumber       AcquisitionName         Comment      NumSamples    DataSize    Sorted    SourceName    SourcePath    SourceComment    SourceType    SourceBusType    SourceBusChannelNumber    SourceSimulated
    ___________    _____________________    ___________    __________    ________    ______    __________    __________    _____________    __________    _____________    ______________________    _______________

         1         LIN_TransmissionError    <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         2         LIN_SyncError            <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         3         LIN_TransmissionError    <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         4         LIN_Frame                <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         5         LIN_ChecksumError        <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         6         CAN_RemoteFrame          <undefined>           0            0     true         CAN           CAN             CAN            Bus             CAN                   0                    false     
         7         CAN_ErrorFrame           <undefined>           0            0     true         CAN           CAN             CAN            Bus             CAN                   0                    false     
         8         CAN_DataFrame            <undefined>      118037      2596814     true         CAN           CAN             CAN            Bus             CAN                   0                    false     

在 MDF 文件最终化并排序后,您可以继续使用所有 MDF 功能,例如使用 mdfRead 功能提取数据。

非就地最终化 MDF 文件

mdfFinalize 函数还允许您通过创建一个单独的最终化副本以非就地方式来最终化未最终化的 MDF 文件。调用同时指定了源文件名和目标文件名的函数。

finalizedPath2 = mdfFinalize("MDFUnfinalized.MF4", "MDFFinalizedOutOfPlace.MF4")
finalizedPath2 = 
"/tmp/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex16754708/MDFFinalizedOutOfPlace.MF4"

MDFFinalizedOutOfPlace.MF4 是新创建的最终化副本,可以使用 mdfInfo 函数访问。

info2 = mdfInfo(finalizedPath2)
info2 = 
  MDFInfo with properties:

   File Details
                  Name: "MDFFinalizedOutOfPlace.MF4"
                  Path: "/tmp/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex16754708/MDFFinalizedOutOfPlace.MF4"
                Author: ""
            Department: ""
               Project: ""
               Subject: ""
               Comment: ""
               Version: "4.11"
      InitialTimestamp: 2021-04-12 10:06:43.000000000

   Creator Details
     ProgramIdentifier: "CE     "
     CreatorVendorName: ""
       CreatorToolName: "CE"
    CreatorToolVersion: "01.04.01"
       CreatorUserName: ""
        CreatorComment: "Creation and logging of data."

   File Contents
            Attachment: [0x7 table]
     ChannelGroupCount: 8

使用 mdfChannelGroupInfo 函数获取关于最终文件中所有通道组的信息。检查每个通道组的 Sorted 值。请注意,所有通道组现在都已排序。

chanGrpInfo2 = mdfChannelGroupInfo(finalizedPath2)
chanGrpInfo2=8×13 table
    GroupNumber       AcquisitionName         Comment      NumSamples    DataSize    Sorted    SourceName    SourcePath    SourceComment    SourceType    SourceBusType    SourceBusChannelNumber    SourceSimulated
    ___________    _____________________    ___________    __________    ________    ______    __________    __________    _____________    __________    _____________    ______________________    _______________

         1         LIN_TransmissionError    <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         2         LIN_SyncError            <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         3         LIN_TransmissionError    <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         4         LIN_Frame                <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         5         LIN_ChecksumError        <undefined>           0            0     true         LIN           LIN             LIN            Bus             LIN                   0                    false     
         6         CAN_RemoteFrame          <undefined>           0            0     true         CAN           CAN             CAN            Bus             CAN                   0                    false     
         7         CAN_ErrorFrame           <undefined>           0            0     true         CAN           CAN             CAN            Bus             CAN                   0                    false     
         8         CAN_DataFrame            <undefined>      118037      2596814     true         CAN           CAN             CAN            Bus             CAN                   0                    false     

在 MDF 文件最终化并排序后,您可以继续使用所有 MDF 功能,例如使用 mdfRead 功能提取数据。

删除创建的 MDF 文件

删除此示例中创建的 MDF 文件以清理工作目录。

delete MDFFinalizedInPlace.MF4 MDFFinalizedOutOfPlace.MF4

结论

mdfFinalize 类似,mdfSort 函数支持就地和非就地两种排序操作。您可以应用相同的工作流对未排序的 MDF 文件进行排序。

总结:

  • 如果 MDF 文件已最终化并排序,则可以使用 mdfInfo 访问其文件信息,使用 mdfRead 读取其数据。

  • 如果 MDF 文件已最终化但未排序,则可以访问其文件信息,但无法读取其数据。请使用 mdfSort 对文件进行排序。

  • 如果 MDF 文件未最终化,则无法访问其文件信息和数据。请使用 mdfFinalize 最终化该文件。