天天看點

TDMS資料 讀取/轉換/儲存 為MATLAB/Python 可讀取的通用資料格式的的方法

TDMS格式是NI主推的高速測試測量采集系統中的一種二進制資料存儲類型,适合存儲海量才幾級資料,兼有高速。友善和易存取等多種優點。做過實際測量項目的筒子們在NI的相關平台例如:CompactRIO/Labview上應該是能夠非常明顯的感受到上述特點的。TDMS與常見的csv,txt等通用格式相比,具有非常多的優點,但缺點也非常明顯:格式較為封閉,無法友善地分享或者被MATLAB、Python等常見的資料分析軟體讀取和處理。是以在一般的采樣率不是很高或者采集通道不是很多的時候,個人還是比較傾向直接将資料儲存為txt等通用資料格式。對于高采樣率和多通道采集的情況,一般将采集後的資料轉換為通用資料之後進行儲存。

目前個人比較熟悉的轉換方式有兩種:一種是直接在Labview中編寫腳本進行轉換,第二種是在MATLAB中通過第三方的“CovertTDMS”函數直接讀取tdms檔案後進行處理或儲存。下面對這兩大類方法分别進行介紹和說明,本文的重點是介紹第二部分“ConvertTDMS”函數的使用方法。

Labview 中直接進行轉換

(1)手動寫入

Labview中轉換最直接也是最靈活的方法就是直接逐行讀取現有的tdms檔案,并将其寫入建立的txt,或csv等格式檔案。好處非常明顯,操作靈活,在寫入的過程中還可以對資料進行簡單的處理:如剔除異常值,無效值等。但缺點也比較明顯:程式設計過程略顯繁瑣,同時程式運作時間較長,如果有較多檔案需要轉換的話,耗費時間太久。

(2)調用VI控件

這種方法操作較為簡單,直接在Labview中讀取TDMS檔案,并重新利用官方的“寫入測量檔案”VI重新寫入指定格式檔案即可。從設定中可以看到,能選擇的格式不多,如果轉換為xlsx格式的話,可以在MATLAB中使用xlsread()函數進行讀取。

TDMS資料 讀取/轉換/儲存 為MATLAB/Python 可讀取的通用資料格式的的方法
TDMS資料 讀取/轉換/儲存 為MATLAB/Python 可讀取的通用資料格式的的方法

MATLAB中直接讀取TDMS檔案

MATLAB無法直接讀取tdms格式的檔案,讀取tdms格式檔案需要在MATLAB的官網或者GitHub上下載下傳一個第三方送出的ConvertTDMS函數檔案,函數的具體說明也都可以在源檔案中找到。該函數在讀取tdms檔案的過程中,不僅能夠簡單的提取出測試資料,還能同時提取出TDMS中儲存的相關通道性質資訊,非常強大與友善。先對該函數的主要使用方法做一個簡單介紹。

下載下傳得到的ConvertTDMS壓縮包中主要有ConvertTDMS和simpleConvertTDMS:官方對這兩個函數的說明如下:

ConvertTDMS - Function to load LabView TDMS data file(s) into variables in the MATLAB workspace. An *.MAT file can also be created.

simpleConvertTDMS - Function to convert .tdms files to .mat files. the .mat files can then be easily loaded into MATLAB when needed.

可以看出來最主要的差別就是ConvertTDMS可以在将tdms檔案轉換為.MAT的檔案的同時,将相關資料導入到MATLAB的工作空間中,兩者并沒有明顯的差別。下面就來簡單介紹如何ConvertTDMS函數轉換單個tdms檔案(也可以批量輸入位址,具體請檢視源函數說明)的用法吧:

函數原型[ConvertedData,ConvertVer,ChanNames,GroupNames,ci]=convertTDMS(SaveConvertedFile,filename)

輸入量

SaveConvertedFile(必填):true/false,确定.mat檔案是否生成,生成的.mat檔案和原始的tdms檔案同名,僅檔案字尾發生更改。

filename(選填):完整的檔案位址名稱,如果為空的話會跳出一個檔案選擇框,也可以輸入一個cell來進行批量轉換。

輸出量

ConvertedData (required) - Structure of all of the data objects(資料對象的結構)

ConvertVer (optional) - 函數版本

ChanNames (optional) - Cell array of channel names(通道名的cell)

GroupNames (optional) - Cell array of group names(組名的cell)

ci (optional) - Structure of the channel index (an index to where all of the information for a channel resides in a file.

  • 在上面中,最為重要的是‘ConvertedData’,該structure中有'FileName', 'FileFolder', 'SegTDMSVerNum','NumOfSegments' 和'Data'的域
  • 其中'Data'域指向的也是一個structure,該structure中有'Root' 和'MeasuredData'兩個域
  • 'Root'域指向的是一個包含‘Name’和‘Property’域的結構體
  • 而'MeasuredData'是一個包含所有通道/組資訊的結構體,可以通過數字索引來通路每一個通道的structure,每一個通道的structure中又包含'Name', 'Data'和 'Property'三個fields。通過選擇合适的通道索引來選擇相應的資料

下面舉一個擷取有一個tdms檔案中某一通道資料的例子,該檔案隻有‘TimeData’一個組,共有17個通道,我們取第1個通道的資料的第3個值。

>>result=convertTDMS(true,'D:\電機故障轉換後資料\rotor_unb30HZ40Load20181012141105.tdms')
>>result.('Data').('MeasuredData')(3).('Data')(3)
           

這裡有一點需要注意,我輸入的原始檔案中隻有1個名為“TimeData”的group,而該group下共有17個通道,但當我們運作下列代碼時,可以放回如下結果:

>> result.('Data').('MeasuredData')

ans = 

  包含以下字段的 1×19 struct 數組:

    Name
    Data
    Total_Samples
    Property
           

通過測試得到,該structure數組中第一和第二個值的‘Name’項的值為‘Root’和‘TimeData’,一個為根檔案名,一個是group名,相應的通道數也想向後移。

本文隻介紹了ConvertTDMS函數最主要的功能,想要體驗更多功能還是建議直接參考函數本身的說明文檔。

最後需要注意的是,函數編寫者最高測試過3GB大小的資料檔案轉換,但他同時也建議測量過程中單個tdms檔案的大小不要超過1GB。這樣當采集過程中labview的檔案管理系統奔潰的時候,不至于丢失太大的資料量。

繼續閱讀