使用未最终化和未排序的 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.MF4
的 mdfFinalize
来创建覆盖自身的最终化副本。该函数返回最终化文件的完整路径。
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 文件进行排序。
总结: