图片缩略图

ConvertTDMS (v10)

version 1.5.0.0 (400 KB) by 布拉德·汉弗莱斯
导入或转换LabView TDMS文件到MATLAB工作空间或mat文件
4.8
37评级

170下载

更新2017年6月16日

从GitHub

查看版本历史

在GitHub上查看许可证

编者按:该文件被选为MATLAB Central本周精选

导入或转换LabView TDMS文件(版本1.0到2.0)。支持交错和非交错的tdms文件。金宝app
这些函数也适用于包含使用DAQmxRaw数据类型(由LV写入的原始ADC数据)的通道的tdms文件,如果文件首先使用以下信息进行翻译:https://decibel.ni.com/content/docs/DOC-32817

添加另一个提交,这样Robert Seltzer(多年来提供了大量支持,现在不再积极处理TDMS文件)就可以放下开发工作了。金宝app

用MATLAB 2010b编写。最初的函数是基于ZIN Technologies的Brad Humphreys和GTRI的Grant Lohsen和Jeff Sitterle的工作(该函数的版本1到4)。第9版函数(由Philip Top编写),除了包含了添加到以前版本的各种更新之外,还可以处理由LabView“优化”的文件。Borg Warner的Robert Seltzer提供了大量的支持和投入。金宝app这个版本是第一个使用FileEx的新GitHub接口(感谢Mathworks!)

这个功能已经用有限数量的不同TDMS文件进行了测试。

引用作为

布拉德·汉弗莱斯(2021)。ConvertTDMS (v10)GitHub (https://github.com/humphreysb/ConvertTDMS)。检索

评论及评分(120

雨果大蒜素原

优秀的功能!非常感谢!
我无法分辨ConvertTDMS和SimpleConvertTDMS之间的区别,但是,它甚至可以在tdms文件bbb10gb和几个通道上工作,所以这很酷。

米甲Chalus

罗伯塔·坎德拉

我没法让这个运行。我对matlab很陌生,但我有一些更有经验的人看它,他们也不能得到它。最常见的错误是
1."似乎每次循环迭代都会改变大小"
2."赋值给(与大量变量一起发生)的值似乎未使用"
3.输入参数不够
4."无法达成本声明及可能的后续声明"

我敢肯定很多是我对matlab的新鲜感,但我找不到分解所需/如何排除故障的指令。如果有人有tdms阅读器/转换为傻瓜的帮助,我将非常感激

詹姆斯·汤普森

在使用LabVIEW的高级tdms功能创建tdms文件时,我发现了一个我认为是错误的地方。如果有更好的地方报道这件事,请提前告诉我并表示抱歉。在这种情况下,Labview需要每个通道指定数量的值,而不是事后计算。在文档中,当不使用交错时,该值显示为设置为1,并且建议从文件导入中的下一个段偏移量和原始数据偏移量计算总通道长度。因此,在尝试转换这些文件时,只转换第一个数据值。我已经为我的用例找到了一个补丁。

在这个matlab脚本中,数据长度被正确计算并保存在SegInfo中。但不是使用这个值来查找要转换的样本数量,convertTDMS第596行读取每个通道值的样本,并写入通道的属性,这在本实例中是不正确的。将第596行“index.(obname). nvalues (ccnt)=fread(fid,1,'uint64',kTocEndian);”替换为“index.(obname). nvalues (ccnt)=SegInfo.DataLength/index.(obname).datasize;”修复了只有一个段且后续写入文件之间没有元数据更改的情况。我还没有测试当有多个通道,交错,或多个不同的段在一个通道,但我希望它应该适用于所有这些情况下的行为。

迈克尔Isnardi

Safwan易卜拉欣

珀斯Vandendriessche

嘿,

我有一个大的(1.2 GB) TDMS文件,我需要在matlab中读取。我首先运行你的代码加载在几个例子文件(你的2个文件和另一个我在网上找到的),这工作得很好。然而,当我试图加载更大的文件时,我得到以下错误:

无法找到TDSm标签。这可能不是一个tdms文件,或者您忘记在文件名中添加.tdms扩展名,并且正在读取错误的文件

convertTDMS错误(第320行)
[SegInfo, NumOfSeg] = getSegInfo (fid);

这是我的代码:
>> test3 = convertTDMS(0,'C:\Users\jervdndr\Documents\MATLAB\ block - 003_engs .tdms');

将“块- 003 _eng.tdms”……

转换完成。

>> test4 = convertTDMS(0,'C:\Users\jervdndr\Documents\MATLAB\03052019_13h56m27 .tdms');

当我运行最后一行时,我得到了上面提到的错误。在Labview文件工作良好,它没有损坏或任何东西。你知道为什么会发生这种情况,我能做些什么来解决吗?谢谢你!

亲切的问候

Shivani Sivakumar

我只是运行代码(不做任何改变)下载后,我得到了一个错误;“p.parse(变长度输入宗量{:});”
它说没有足够的输入参数。我该怎么办?

燕李

对于小文件,它工作得很好。对于我的30M文件,我得到错误说日期数字超出范围…我检查了文件。它在postProcess函数中
情况下“时间”
明确的价值
如果指数。(cname)。(cfield) .cnt = = 1
如果iscell(指数。(cname)。(cfield) value)
值= datestr (cell2mat(指数(cname)。(cfield) Value), dd-mmm-yyyy HH: MM: SS);
其他的
值= datestr(指数。(cname)。(cfield)。价值,“dd-mmm-yyyy HH: MM: SS”);
结束
其他的
值=细胞(指数。(cname)。(cfield) .cnt, 1);
c = 1:指数。(cname)。(cfield) .cnt
如果iscell(指数。(cname)。(cfield) value)
值(c) = {datestr (cell2mat(指数。(cname)。(cfield) Value), dd-mmm-yyyy HH: MM: SS)};
其他的
值(c) = {datestr(指数。(cname)。(cfield)。价值,dd-mmm-yyyy HH: MM: SS)};
结束
结束
结束

错误发生在datestr,我的日期号码是2.135039830300231e+14。我不确定当我用labview或matlab函数保存数据时,此错误是否来自数据。

有人能帮忙吗?提前感谢。

1月

这个文件很有帮助。
错误“LVData类型4未定义”是通过在函数getDataSize(LVType)中将case 4添加到case 8和10来解决的。
情况下{4、8、10}
深圳= 8;
致以最亲切的问候

Loïs乐GUILLOU

克里斯·P

非常感谢-到目前为止一切顺利!
克里斯

西蒙Tamaro

嗨,阿拉,

您需要将'SaveConvertedFile'设置为'true'作为第一个输入,然后将filename设置为第二个输入

亲切的问候

Aravind Venkitasubramony

我不断得到错误“'SaveConvertedFile'的值无效。||和&&操作符的操作数必须为
在使用程序时可转换为逻辑标量值”。这似乎对应于两个m文件中的“p.a parse(varargin{:})”行。知道是什么问题吗

亚历山大年代

软件运行良好。但是,对于较大的,特别是碎片化的文件,或者具有许多节的文件,脚本会占用大量的RAM或者会失败。

使用最新版本v1.99 2014-10-23。

lehuyto

Farnaz Tajdari

作品完美!这正是我要找的!非常感谢!

马可Lamperti

使用“高级TDMS打开/关闭”创建的文件像一个魅力。谢谢!

Wentao赵

奥利弗Bechmann

嘿!
非常感谢提供这个tdms转换器!
对于测试文件,一切正常,但对于我自己的文件(84个通道,不同类型的数据)出现以下错误:

索引超出矩阵维度。

simpleConvertTDMS>getData错误(第1197行)
StrLength = StrOffsetArray (dcnt);

simpleConvertTDMS错误(第339行)
ob = getData (fid, channelinfo SegInfo);%返回有数据的对象。参见postProcess函数(追加到所有
对象)

不幸的是,我无法修复它,所以我想问你是否可以提供一个解决方案?
使用MS Excel转换器将是与MATLAB结合的解决方案,但不是我最喜欢的一个。

提前感谢并致以亲切的问候。
奥利弗。

费萨尔谢赫

阿卜杜Albalawi

嗨,家伙。
我是使用MATLA的初学者,我有硕士项目需要使用MATALB将数据(tdms格式)导入MATLAB。请任何人帮助我一步一步地运行代码,并作出一些改变,如果需要的话。

马尔科·罗西

我注意到加载时间戳时偏差为-4小时(参见convertTDMS.m的第1190行)。这是一个有意的时区修正吗?

乔·里卡多。

USAGE: data = convertTDMS(0, 'myfile.tdms');or data = convertTDMS(0, 'myfile.tdms');如果您希望将数据保存为。mat文件。

该文件保存为结构数据,并提取该数据

用途:data = data.Data.MeasuredData (3) . data

KK Java

我找到了一个名为npTDMS的Python包,它也很容易使用。通过scipy包,我们可以将数据保存为MAT格式,从而可以直接在MATLAB中使用这些数据。函数是这样的
===========================
从nptdms导入TdmsFile
进口scipy。我很高兴。

myfile = TdmsFile(r'c:\xxx.tdms')
grpList = myfile.groups()
chnList = myfile.group_channels(grp[0])
sio.savemat(“c: / xx。垫”,{mydata: chnList[0]。数据,“sps”:chnList [0] . properties(“wf_samples”)})
===========================
希望对大家有所帮助。

KK Java

它的工作原理!
我尝试过不同的功能,只是这一个给了我我需要没有任何错误或警告!
data = convertTDMS(0, 'myfile.tdms');
强大而简单~~
谢谢你,布拉德!
我的tdms文件是用LabVIEW 2013生成的。

卡尔·查克

我在两个文件中使用simpleConvertTDMS(第278行)和ConvertTDMS(268)相同的语法“p.a parse(varargin{:});”得到一个错误

我不知道如何得到这个。m文件工作。我正在运行Matlab 2017b。请帮助。
谢谢你!

constdel

YONGCHUN李

嗨,Brad,很好的脚本读取tdms文件。关于convertTDMS的混淆。m和simpleConvertTDMS。M,这两个脚本有什么不同。

致以最亲切的问候

Felicien·博纳富瓦

伟大的脚本

弗雷德里克费舍尔

临淄区李

你好,皮特。谢谢你!for your script. I want to sent you a larger file, What is the mail?

安德里亚Bracciali

凯瑟琳Giefer

嗨,布拉德,谢谢你的剧本。对于“数据”tdm来说,这似乎行得通。但我也有来自相机的特殊tdm。它的结构略有不同。在数据。我有一个不同的条目。在一个直接输入3个字段,其中包含的数据(双精度向量)没有被读入。它读取4个值0 1 2 3但这不是双精度的也不是190个向量的值。
由于我无法找到在getData中更改此结构的点,如果您能帮助我,那将是非常棒的!!
非常感谢!
凯瑟琳

阿历克斯梅森

你好,我根本开不了这个。在尝试解析输入时遇到了第一个障碍。我得到错误:

使用simpleConvertTDMS出错(第278行)
'SaveConvertedFile'的值无效。它必须满足函数:@(x)islogical(x)|(ismember(x,[0,1]))。

我想我使用的是最新版本的Matlab, 2017b。也许他们改变了什么!什么好主意吗?

必须在语句中添加'-v7.3'标志
保存(MATFileNameLong‘ConvertedData’,‘ConvertVer’,‘ChanNames’,‘-v7.3’)
在simpleConvertTDMS.m。

然后,它完美地工作,惊人地快。
谢谢!

Emelie尼尔森

你好,皮特!感谢一个伟大的脚本。我用它来处理一些大数据文件(高达5gb),效果很好。然而,现在我尝试从另一个DAQ (1.5 GB)读取不同的输入文件,但我得到与川贺(2015年9月3日)相同的错误信息。

下标索引必须是实正整数或逻辑整数。

convertTDMS>getChannelInfo错误(第762行)
指数。(obname) .arrayDim (ccnt) =指数。(obname) .arrayDim (ccnt-1);

你找到解决办法了吗?谢谢你的帮助。

约翰•德雷伯

问题解决了,谢谢xD。脚本工作很棒

致以最亲切的问候

弗兰克Frohlich

你好,
对迈克尔·科尔布在2015年9月3日遇到的问题有什么新的见解吗?我有同样的问题,并使用了他的解决方案。

非常感谢你的这个脚本!

布雷特Weintz

你好Brad,谢谢你的一段很棒的代码。我想指出一个小故障。“ChanNames”单元格记录按字母顺序排列,而不是按“已转换数据。data”中的顺序排列。MeasuredData’(正确)。
问候,Brett Weintz

伊娃•彼得斯

感谢这个脚本!对于测试文件,它对我来说很好。然而,当我尝试我自己的一个文件(多个通道正好10分钟,~70.000 kb),我得到以下错误:

使用convertTDMS>getDataSize出错(第1545行)
LVData类型4没有定义

convertTDMS>getChannelInfo(810行)错误
指数。(obname) .datasize = getDataSize(指数。(obname) .dataType);

convertTDMS出错(第332行)
[channelinfo SegInfo] = getChannelInfo(支撑材,SegInfo NumOfSeg);

simpleConvertTDMS中的错误(第94行)
[convertedData, dataOb.convertVer d.chanNames、d.groupNames dataOb.ci] = convertTDMS (0, tdmsFileName);

这是什么意思/我怎么解决这个问题?似乎某个数据类型没有定义或未知?我不是Matlab的专家,更不是labview的专家。有人为我做了labview脚本,但要完全控制我的数据,我想把它变成Matlab。我已经尝试了几个星期,所以如果有人能帮助我,我会很高兴!

simpleConvertTDMS(1, 'nameOfFile.tdms')

Oxov

得到与@Francisco Pereira相同的错误。使用R2017a。我将感激任何变通办法。

弗兰

当我运行simpleConvertTDMS。我得到错误使用simpleConvertTDMS(第278行)没有足够的输入参数。

为什么?我不明白。

史蒂夫·G

彼得Orthmann

嗨,皮特,
谢谢这些精彩的脚本!
请查看您2017年6月16日更新的1.5个文件。在我现在下载的humphreysb-ConvertTDMS-2bf087e.zip中,它似乎是比以前更旧的版本(v1.98 2014-5-27 &错误代码?)(v1.991 2014-12-1 & v1.3 2014-5-27)!
谢谢

twreal

Eryk Sokolowski

你好,我有一个问题与他的脚本:
我正在加载一个相当大的文件(2h的数据记录在10kHz) ~~2GB什么是导入文件长度的最大限制??

我得到:
使用TDMS_readFileHelper_v1出错(第188行)
检测到灾难性错误,代码可能在某处有错误

TDMS_readTDMSFile错误(第252行)
数据= TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

TM_TDMS_IMPORT中的错误(第2行)
TM_tdms_struct = TDMS_getStruct(filename,3);

Lior戈尔茨坦

嗨,皮特,

谢谢你的剧本!
我有时有一个问题,在一些测量和一些通道上,转换的数据是损坏的,这意味着很多e308和e-300的无限值。

这些文件相当小。

你觉得问题出在哪里?

谢谢,

Lior

c。

嗨,皮特,
我做了一些研究。时间戳是通用时间。在你的代码中,“propsValue=tsec/86400+695422-4/24;”(第932行),我猜你的时区是UTC-4。因此,需要减去4个小时才能得到正确的约会时间。在我的情况下,需要增加8小时,因为我的时区是UTC+8。我想知道是否在TDMS属性中存在任何UTC偏移属性?

c。

嗨,皮特,
谢谢你的贡献。在使用代码时出现了一个问题。在ConvertdData.Data.MeasuredData.Property中得到的属性wf_start_time偏移12小时。例如,实际开始时间是08-Feb-2017 12:17:28,但ConvertTDMS给出的是09-Feb-2017 00:17:28。对这个问题有什么想法吗?

非常感谢。

C.S.

大师Subramani

谢谢!

你好,皮特,

感谢您发布这个脚本。我们已经非常成功地使用它来转换我们通过LabView设置获得的数据。

然而,我们希望用。net解决方案取代LabView数据采集程序。因此,将DAQmxRaw数据TDMS文件转换为常规文件的解决方法不再有效。你有什么办法可以解决这个问题吗?你知道有任何方法转换DAQmxRaw文件不使用LabView?

非常感谢,
约翰内斯

Moy安妮

我试图使用convertTDMS文件来读取我拥有的TDMS文件,但看起来它在处理时跳过了我的第二列数据。代码中是否有一节设置它读取的数据的长度?

我知道它跳过了我的第二列数据,因为当它保存数据位置时,它指向第一列数据。

我怀疑这个问题可能在这个代码中:

Ttag =从文件中读(fid, 1,“uint8”,“l”);
Dtag =从文件中读(fid, 1,“uint8”,“l”);
鹿=从文件中读(fid, 1,“uint8”,“l”);
mtag =从文件中读(fid, 1,“uint8”,“l”);

但我不明白在excel列方面的位置数字意味着什么(我可以在excel导入器中打开它)。

雅各布·亨德里克

当从NI CAS生成的cDAQ处理“原始”格式化的TDMS文件时,会出现以下错误消息。

' ' '
将“Raw000.tdms”……使用零错误
不允许使用NaN和Inf。

convertTDMS>getData错误(第1156行)
ob。(cname) . data = 0 (nsamples, 1);

convertTDMS出错(第338行)
ob = getData (fid, channelinfo SegInfo);%返回有数据的对象。参见postProcess函数(附加到所有对象)
' ' '

有关更多细节,请参阅github repo和issue #5。

我们尝试过的其他TDMS解析器(excel, python)似乎对这些文件都没有问题。

无法判断问题是否来自从各种通道读取错误的数据类型,或者是否存在将第二个' datastartindex '设置为零的错误读取TOC。

我们尝试通过删除索引零' datastartindex '来修复,它确实删除了一个段,但所有其他数据似乎都有正确的形状,虽然不是正确的值,因为数据类型是错误的。

什么好主意吗?有什么建议的调试方法吗?

拉尔夫

嗨,皮特,

谢谢你的回复。我会让这些大文件的创建者帮我把它们转换成小文件。

布拉德·汉弗莱斯

拉尔夫,

恐怕我没有一个好的答案给你。这是一个非常大的文件。我通常将TDMS写入设置为在文件达到100MB左右时启动一个新文件。这不仅仅是为了转换到MATLAB,对于这样大小的文件来说,很容易损坏(我从经验中知道)。你也许可以写一个VI来读取和分解它。

拉尔夫

我需要转换一个大的tdms文件(450 MB),我得到内存消息:

使用零错误
内存不足。为您的选项键入HELP MEMORY。

convertTDMS>getChannelInfo错误(第719行)
指数。(obname) .byteSize = 0 (NumOfSeg, 1);

convertTDMS出错(第332行)
[channelinfo SegInfo] = getChannelInfo(支撑材,SegInfo NumOfSeg);

有什么我能做的吗?
我发现我的文件至少包含255个对象(obname),每个对象有655201个NumOfSeg。

非常感谢!

Sebastien马丁

很好,但时间戳似乎早了12个小时

有人能给我发电子邮件(或下拉框)一个tdms文件,其中有以下问题?我无法复制它,我认为它来自我通常不使用的数据类型。我的邮箱在我的作者页面上。

嗨,皮特,

我在第991行遇到同样的问题,有一些,但不是所有的TDMS文件。当我添加index.(obname)行时,得到以下结果:

名称:“Object119”
long_name: '同步波形- 1'
rawdatacount: 1
Datastartindex: [4188x1 double]
arrayDim: [4188x1 double]
nValues: [4188x1 double]
byteSize: [4188x1 double]
索引:[4188x1 double]
Rawdataoffset: [4188x1 double]
乘数:[4188x1 double]
跳过:[4188x1 double]
rawdataindex: 0
Property1: [1x1 struct]
PropertyInfo: [1x1 struct]

有解决方金宝搏官方网站案了吗?

迈克尔

你好。我的LabVIEW TDMS文件有7列数据(N x 7列),当我将它们转换为Matlab时,我有7个数据变量代表原始LabVIEW数据文件的每列,我需要这7列在一个Matlab中。mat文件(N × 7列)数组,其中Matlab中的每个列与LabVIEW相同。现在,转换后,我有7个变量/结构。请帮助。

传他

你好,皮特,

我在991之前添加了代码。这是我得到的:

将“TR5277time_20150730_212206_Mod1_ai0.tdms”……
ans =

名称:“中的Object1”
Long_name: [1x46 char]
rawdatacount: 1
Datastartindex: [3x1 double]
arrayDim: [3x1 double]
nValues: [3x1 double]
byteSize: [3x1 double]
索引:[3x1 double]
Rawdataoffset: [3x1 double]
乘数:[3x1倍]
跳绳:[3x1倍]
数据类型:9
datasize: 4

ans =

名称:“中的Object1”
Long_name: [1x46 char]
rawdatacount: 2
Datastartindex: [3x1 double]
arrayDim: [3x1 double]
nValues: [3x1 double]
byteSize: [3x1 double]
索引:[3x1 double]
Rawdataoffset: [3x1 double]
乘数:[3x1倍]
跳绳:[3x1倍]
数据类型:9
datasize: 4

下标必须是实数正整数或
逻辑值。

convertTDMS>getChannelInfo错误(第782行)
指数。(obname) .datastartindex (ccnt) = 0;

迈克尔·科尔布

嗨,皮特,

谢谢你花时间。
我照你说的做了。对象数据为:
名称:“Object2”
long_name:“RPS-KBM-II”
rawdatacount: 1
Datastartindex: [45x1 double]
arrayDim: [45x1 double]
nValues: [45x1 double]
byteSize: [45x1 double]
索引:[45x1 double]
Rawdataoffset: [45x1 double]
倍率:[45x1倍]
跳跃:[45x1 double]
rawdataindex: 0
Property1: [1x1 struct]
Property2: [1x1 struct]
Property3: [1x1 struct]
Property4: [1x1 struct]
PropertyInfo: [1x4 struct]

布拉德·汉弗莱斯

为了解决这个问题,你们中有人可以删除Michael的代码(好主意)并在991之前添加一行:

指数。(obname)
如果指数。(obname) .dataType……< 991行

这将把对象输出到命令行。当你得到错误时,让我知道它说了什么。谢谢!

传他

嗨,迈克尔,

我和你犯了同样的错误。

convertTDMS>getChannelInfo错误(第991行)
如果指数。(obname)。dataType== 32%数据类型为字符串

我在986行之后加了这三行。

如果isfield(指数。(obname),“数据类型”)= = 0
指数。(obname) .dataType = 32;
结束

但我得到了其他错误
错误:
下标索引必须是实正整数或逻辑整数。

convertTDMS>getChannelInfo错误(第782行)
指数。(obname) .datastartindex (ccnt) = 0;

你有什么办法能修好它吗?

谢谢,

迈克尔·科尔布

迈克尔·科尔布

你好,

我得到了其他人之前得到的相同错误,并想分享我的肮脏修复:
错误:
convertTDMS>getChannelInfo错误(第991行)
如果指数。(obname)。dataType== 32%数据类型为字符串

代码中有一条路径对象的Datatype没有设置。当数据类型被选中时,程序崩溃。
因此,我的修复是将数据类型设置为32,如果没有设置数据类型。

为此,必须在convertTDMS中的986行之后添加这三行。1.991版本的M(它在今天(2015年9月3日)可以下载的convert v10包中):

如果isfield(指数。(obname),“数据类型”)= = 0
指数。(obname) .dataType = 32;
结束

我知道它很脏,但对我有用,希望对你们中的一些人也有用。

我要感谢这个非常有用的工具的积极开发人员的工作!

布拉德·汉弗莱斯

该代码是平台独立的(Linux或Windows)。在Linux或基于Windows的设备上生成的TDMS文件是相同的。阅读也是一样;应该在windows和Linux上运行MATLAB(我经常这样做)。MATLAB 2012和2013也都工作。这不会使用任何编译库(.dll, .so等)。它只使用m文件中的代码,因此您不必担心OS, LV或MATLAB版本(有几个小例外)。

克雷格Schiro

嗨布拉德-
我正在努力将我的Matlab升级到Matlab 8.2(R2013b),因此我可以尝试将cRIO-9036机箱Linux生成的TDMS文件转换为Matlab对象。我有Matlab (2012b)负载库问题http://www.ni.com/example/30957/en/。你知道你的公用事业是否能在2012b运行吗?
我在windows 8.1上运行,想知道我所需要的只是这个版本的Matlab和我的TDMS文件,我设置了吗?我看到你说“其他要求”是“无”——这就是它的美妙之处。
我希望情况是这样。
问候,
克雷格

Francisco -你可以把你的数据文件上传到github仓库吗(https://github.com/humphreysb/ConvertTDMS/tree/master/exampleFiles),或者把它们放到我可以下载的地方。我的电子邮件地址见我的作者页面。

旧金山

亲爱的布拉德,我在从TDMS文件加载数据时遇到了一些问题。在我的文件中,我有8个通道,每个通道有1261568个样本。当我尝试使用convertTDMS加载它们时,它会加载1277952个样本,实际上,最后的16384个样本是零。这是脚本中的错误吗?
---
谢谢

弗兰克·彭

亲爱的布莱德,
谢谢你的工作。在阅读示例*时,此函数运行良好。TDMS文件simple_test.tdms。但是当我读我自己的*时,我有一些问题。tdm文件。警告信息如下:
使用convertTDMS>getSegInfo出错(第530行)

上述文件的第1段包含DAQmxRaw NI数据类型中的数据
此函数不支持的格式。金宝app看帮助
在convertTDMS中的文档。M代表如何解决这个问题。

convertTDMS出错(第329行)
[SegInfo, NumOfSeg] = getSegInfo (fid);

simpleConvertTDMS中的错误(第94行)
[convertedData, dataOb.convertVer d.chanNames、d.groupNames dataOb.ci] = convertTDMS (0, tdmsFileName);

ReadTdmsFile错误(第3行)
matFileName = simpleConvertTDMS('Test_001[fs=48000].tdms');

你能修好它吗?

西蒙断

亲爱的布莱德,
谢谢你的这个功能。它工作得很好,但我有一个问题,我不能解决我自己。我正在使用
函数simpleConvertTDMS在测试台中,我将数据转换为2组:第一组被命名为“Messwerte FSZV”
8个矢量,每个矢量最多200.000个条目-这个组工作得很好。第二个组“Skalare”有10个字符串
“Samplerate”,“PositionTiefenanschlag”,“Backenwerkstoff”,... .这些变量中的每个都只有一个值,例如:
采样|位置:tiefenanschlag |Backenwerkstoff|…
10 b| 367 b| s600 b|…
在使用simpleConvertTDMS并加载.mat文件后,我在工作区中拥有所有这些文件。问题是,每个变量
具有第一项的值(“10”),因此在MatLab中其:
SkalareSamplerate | SkalarePositionTiefenanschlag | SkalareBackenwerkstoff |…
10 b| 10| 10|…
你能告诉我哪里做错了吗/问题的关键是什么吗?
西蒙的问候

Matlab版本:R2013a

使用代码:

simpleConvertTDMS(“FSZV.tdms”);
负载(“FSZV.mat”);

布莱恩,能得到一份文件副本就太好了。我的个人资料里有我的电子邮件地址。或者如果您使用GitHub,您可以将其添加到存储库中。

是的,抱歉,它们只是我们生成的不同的tdms文件。我们称之为“原始”的那个包含了所有的原始数据,非常大;我们称之为“摘要”的文件包含计算值的摘要,并且要小得多。但是,我们无法使用convertTDMS成功读取较小的文件,因此它似乎与Sebastian的大小无关,尽管错误消息是相同的。如果需要,我可以通过电子邮件或上传示例文件。

Brian -我不确定你所说的“原始”和“摘要”文件是什么意思。这两个都是您生成的.tdms文件吗?或者其中一个是.tdms_index文件?

我得到了和塞巴斯蒂安一样的错误,但不是特别大的文件。我的数据系统保存了一个“原始”文件和一个“摘要”文件;前者可以是500mb,可以导入,后者是3.5 MB,不能导入;

引用不存在的字段'dataType'。

convertTDMS>getChannelInfo错误(第991行)
如果指数。(obname)。dataType== 32%数据类型为字符串

convertTDMS出错(第332行)
[channelinfo SegInfo] = getChannelInfo(支撑材,SegInfo NumOfSeg);

在指出convertTDMS的内容被复制到simpleConvertTDMS文件后,我更新了这个函数。如果您是第一次使用这组文件,我建议从simpleConvertTDMS函数开始。

Sebastion -我在GitHub上添加了一个目录来上传您遇到故障排除问题的文件。我还更新了自述文件来描述大文件处理。

塞巴斯蒂安。

我对较大的文件有问题。我有一个5.000.000行文件,如果我把它切成14.7万行,我可以转换它。如果我把它切成300.000行,我会得到以下错误:

引用不存在的字段'dataType'。

simpleConvertTDMS>getChannelInfo错误(第983行)
如果指数。(obname)。dataType== 32%数据类型为字符串

simpleConvertTDMS中的错误(第324行)
[channelinfo SegInfo] = getChannelInfo(支撑材,SegInfo NumOfSeg);

杰克分配者

我需要保留LabView数据的本机类型(类)来特别支持uint64。金宝app为了实现这一点,我在convertTDMS.m中的原始行1123附近添加/更改了这些行:
elseif id.dataType = = 68
ob。(cname) . data = 0 (nsamples, 1);
其他的
ob。(cname) . data = 0 (nsamples 1 LV2MatlabDataType (id.dataType));
我还把1213线改为
(数据,问)=从文件中读(fid,造船* id.multiplier (rr),[‘*’,matType], kTocEndian);

布拉德·汉弗莱斯

艾伦,你能给我发个例子文件吗?(我的邮箱地址见我的个人资料)

艾伦

失败在

convertTDMS>getChannelInfo错误(第754行)
指数。(obname) .arrayDim (ccnt) =指数。(obname) .arrayDim (ccnt-1);

因为CCNT = 1

我已经更新了转换器(v1.99),以解决原始数据写入文件后属性更新的问题。使用上面的“从GitHub获取”按钮下载最新版本。

领带雪

我如何下载代码?

Stephen -如果你把通道写成波形,你可以在通道的属性中找到开始时间。例如,运行simpleConvertTdms后,channelName.Property。Wf_start_time将具有波形的开始时间。

Stephen Tenney

我一直在广泛使用这个文件。我无法确定如何显示文件开始时间。也许我只是看不懂结构。

格兰特Lohsen

需要更新转换器变量。

另外,需要用这个替换427行

其他的
文件关闭(fid);

无法找到TDSm标签。这可能不是一个tdms文件,或者您忘记在文件名中添加。tdms扩展名并且正在读取错误的文件');

结束

这样,如果您输入名称并为其提供一个大的非tdms文件,它就不会永远在那里搜索文件,每次4字节以查找TDSm标记

拉吉

很棒的小工具!我已经成功地在两个不同的项目中使用了它,我们使用LabView + NI A/D转换器。仅供参考,似乎现在有能力在GitHub上托管你的文件交换文件,就像你问的那样。今天当我去下载另一个名为“export_fig”的文件交换提交时,我发现了这个问题://www.tatmou.com/matlabcentral/fileexchange/23629-export-fig
我得到了一个很好的“从GitHub获取”链接,而不是通常的“下载提交”。你可以考虑更新你的提交。

Randy82

你好再次,

可能我知道问题是什么:我使用Matlab R2011b,似乎函数strsplit是未知的。
所以我使用以下命令,它似乎工作:splitName=regexp(channelNames{cnum}, '/', 'split')

Randy82

你好,皮特,

我和吉尔特有类似的问题。
但在我的tdms文件(当我在DIAdem中打开它)有以下结构:
组名由项目名称、日期和时间戳设置在一起。例如“project - 2014-02-18 05:32:22”。在我的组中有几个频道,例如称为“channel1”,“channel2”等等。
现在,当我在Matlab中使用simpleConvertTDMS时,每个通道都转换为“project20140218053222channel1”,单词之间没有任何分隔或下划线。

当我使用你建议的代码时,我得到一个错误消息:未定义的函数'strsplit'用于类型'char'的输入参数。

simpleConvertTDMS_test错误(第69行)
splitName = strsplit (channelNames {cnum}, ' / ');

谢谢你的帮助!

基尔特•

你好,皮特,

效果很好。非常感谢!!

我理解你的担忧,但我在一个数据集中没有多个渠道组的问题,所以像你提议的那样对我来说很好。

Geert -如果你想这样做:在simpleConvertTDMS中,在行后:

cnum = 1:元素个数(channelNames)

增加以下几行:

%--------------
如果~ isempty (strfind (channelNames {cnum}, ' / '));
splitName = strsplit (channelNames {cnum}, ' / ');
channelNames {cnum} = splitName{}结束;
结束
%----------------

你做这件事要小心。变量名为GroupName_ChannelNames。在您的情况下,看起来文件名被用作组名(如果没有指定组名,这可能是LV中的默认值)。可以将多个通道组写入同一个.tdms文件。如果不同的组具有相同的通道名称,则通道名称不再是唯一的,并且可以使用上面的代码重写彼此。您可能只想在LV代码中指定一个更好的组名。关于tdms文件中组和通道结构的信息:http://www.ni.com/white-paper/5696/en/

基尔特•

嗨,皮特,
我成功地使用了TDMS-convert脚本。他们几乎做到了我想要的。我有一个问题:每个数据通道都用文件名+channelname转换为工作区中的结构。我只想要原来的频道名。我试着在剧本中找到它,但老实说,他们对我来说就像中国人一样:)
我怎样才能改变这一点?
例子:
Diadem/Labview中的通道名= 'speed'
在TDMS转换为。mat后,structurename为"filename'speed'"。
我想运行一个循环,例如绘制许多文件的覆盖。因此,所有文件中相同的数据名称对我来说更好。非常感谢!

布拉德·汉弗莱斯

Joseph -我们已经使用这些功能来翻译高达3GB的文件。一般来说,写超过1GB的TDMS文件不是一个好的做法。通常在Labview中,我们为每500MB“自动启动”一个新的tdms文件编写代码。这使我在文件损坏(由于文件处理或LV本身)时节省了几次时间,并且我们没有丢失整个大数据集。所以在翻译过程中,我从来没有需要抽出一个片段。这是我想要添加的东西。

约瑟夫

Brad——谢谢你的回复。我想知道是否有一种方法来读取TDMS文件的段,即前50万pts,然后是后50万pts,等等。

布拉德·汉弗莱斯

约瑟夫-我不确定你说的是哪个部门。对于大数据文件,我的建议是:
1)使用simpleConvertTDMS将。tdms文件转换为。mat文件。
2)如果你只想处理一个特定的通道,使用load命令只从。mat文件加载通道:load('FileName.mat','NameOfYourChannel');
3)你可以使用:yourData=NameOfYourChannel.Data;

如果需要在不加载整个文件的情况下查看文件中有哪些通道,请使用"whos"函数。

这就是你想要的吗?

约瑟夫

我刚刚接触NI TDMS格式。我有相当大的文件(高数据速率)。有没有一种方法可以读取数据片段,这样我的记忆就不会被抹去?

布拉德·汉弗莱斯

你正在使用命令“a=simpleConvertTDMS();”对吗?然后打开一个打开文件对话框,选择由Labview创建的tdms文件,对吗?

振威

Brad,谢谢你的工作。我是一名大一新生,使用NI的Device,我不知道如何使用你们的功能将TDMS转换为mat文件。我会非常感激,如果你能帮助我的细节,如何与你的功能编码。
这样对吗?
“一个= simpleconvert();“
我得到了错误代码
"在==>转换dms为304时出错
[SegInfo, NumOfSeg] = getSegInfo (fid);

错误==> simpleConvertTDMS在58
[convertedData, dataOb.convertVer d.chanNames、d.groupNames dataOb.ci] = convertTDMS (0, tdmsFileName);

错误在==>转到3
一个= simpleConvertTDMS();“
非常感谢。我的英语也不是很好,希望你能理解我的想法。

Mark - re:你的问题是关于数据是如何进入内存的。不可能发生在.mat文件中的变量上(但是可以添加整个变量)。因此,这个函数首先计算存储所有数据所需的内存大小,然后预先分配变量来保存数据。然后填充变量,完成后将它们写入文件。所以有最小的内存空间调整(MATLAB“最佳实践”的大变量)。我们(经常)用它成功地转换了多gb大小的文件。

马克·沃德

谢谢你的更新。simpleConvert现在可以读取文件了。

Mark -我提交了一个修改simpleConvertTDMS的更新,以检查并查看组/通道名是否以数字字符开头(如果发现,它会在前面添加一个“d”字符)。该提交仍在等待Mathworks的批准。我也弄清楚了为什么你得到日期/时间戳....我忘记了MATLAB变量名是LV组名与通道名连接。看起来你的组名是日期/时间戳。

马克·沃德

感谢您的快速回复!
我不是故意试图有一个名为13012014140627VoltageAllData的通道…我认为它可能是由labview自动生成的,因为它是收购的日期和时间。只要在任何以数字开头的东西前面加个字母“D”就可以了。但是将起始数字交换到末尾也是可以的。

布拉德·汉弗莱斯

对不起,我的帖子被切断了。看起来您有一个以数字文本开头的通道。在简单的转换器中,LV通道名称用于Matlab变量名称。MATLAB不能有以数字文本开头的变量或字段。convertTDMS使用一种更通用但麻烦的变量格式,其中通道名不用作变量。我可以更新该函数,将通道名称的数字开头交换到结尾作为修复。

布拉德·汉弗莱斯

Mark -只是想知道,LV中是否有名为“13012014140627VoltageAllData”的通道?如果不是,这可能是另一个问题的症状。

马克·沃德

在写入数据之前,是否必须同时将所有数据放入ram中?
为了将读数收集到二维数组中,它看起来像是将
ConvertedData.Data.MeasuredData (jj) . data;
对于jj = 3: 2+日志通道数
希望能起作用。我希望当日志很长时,它仍然有效。

马克·沃德

谢谢你。我已经记录了34个通道的1千赫电压数据,我现在正试图读取它。
使用“简单转换”vi,我得到了错误
无效的字段名:' 130012014140627voltagealldata '。
simpleConvertTDMS错误(第60行)
dataOb。(safeChannelName {cnum}) . data = convertedData.Data.MeasuredData (cnum) . data;

我是否已经转换了它在labview首先。(PS我发现将输出文件名控件的“浏览选项”属性更改为“新的或现有的”允许我为输出创建一个新文件,而不是覆盖现有文件)

我没有得到一个错误使用完整的版本,虽然它似乎有点棘手的工作,其中的数据结构。是否有一个简单的方法来重建数据的渠道成一个二维数组?谢谢

Thinkpadyang杨

你好,皮特
我做了更改,程序能够转换并保存为。mat文件。然而,当我打开。mat文件作为文本时,它是无法读取的字符,我也无法在Matlab工作空间中预览数据。我会进一步调查的。不管怎样,非常感谢。

这是由于在几个旧版本的MATLAB (//www.tatmou.com/matlabcentral/newsreader/view_thread/258011).试着把第334行改成:" catch, exception=lasterror; "我猜然后你会得到一个错误消息,告诉你为什么文件不能保存(可能你没有权限在目录中创建一个文件?)。

Thinkpadyang杨

嗨,Brad,我运行了这个程序,一个错误信息说:“警告:File: convertTDMS。m行:334列:15
这种try-catch语法将在R2007a中继续工作,
但可能是非法的,或者在未来的MATLAB版本中可能意味着不同的东西。
有关详细信息,请参阅MATLAB版本7.4的发行说明,“由try-catch生成的警告”。

在==> simpleConvertTDMS为50时出错
[convertedData, dataOb.convertVer d.chanNames、d.groupNames dataOb.ci] = convertTDMS (0, tdmsFileName);“

我使用2008版的matlab,所以我不知道该怎么做。请让我知道你有什么建议。谢谢。

我下面关于使用VI进行转换的评论仅适用于获得有关DAQmxRaw Data类型的错误。否则,您应该能够直接使用此函数。

我刚刚提交了一个更新的函数,其中包含如何处理具有DAQmxRaw数据类型的数据文件的说明(下面是stephen Tenney的问题)。解决方法是创建一个LV VI,它读取tdms文件,然后将其写入另一个tdms文件(这会将数据类型转换为该函数可用的数据类型)。看到的:https://decibel.ni.com/content/docs/DOC-32817

Stephen Tenney

布拉德,这是错误,是的,它似乎是一个未定义的数据类型;

使用convertTDMSv1>getDataSize出错(第1476行)
LVData类型4294967295没有定义

这和数据采集盒有什么关系?它来自一个NI示例记录器VI。

Steve -这可能是由于您的tdms文件具有不支持的数据类型(可能是DAQmxRawData)。金宝app要排除故障,请在convertTDMS中的1468行之后添加以下两行:

否则
LVData类型%d未定义,LVType)

(在"sz=10;"行之后)

让我知道错误消息的输出。

Stephen Tenney

我得到以下错误:

将“array1.tdms”……convertTDMS>getDataSize错误(第1450行)
开关(LVType)

调用期间未分配的输出参数“sz”(可能还有其他参数)
“/数据/数字/ Matlab2010a /工作/ convertTDMS / convertTDMS.m > getDataSize”。

我在convertTDMS和simpleConvertTDMS中都看到了这一点。

我会继续寻找解决办法。

史蒂夫Tenney

MATLAB版本兼容性
用R2013b创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux
致谢

启发:ConvertTDMS (v9)

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!