我正在构建一个MATLAB GUI,用于从Tektronix DPO4104示波器(MATLAB驱动程序here)进行数据采集。
我正在使用tmtool
并使用我的GUI代码,并且发现驱动程序只能收集10,000个数据点,无论示波器是否设置为显示超过10k点。我找到了this post on in CCSM,但它并没有非常有用。 (如果您愿意阅读它,我是那里的最后一篇文章。)我正在使用DPO4104驱动程序,而本文则讨论了DPO4100驱动程序的使用,我相信。
据我所知,步骤如下:
readwaveform
函数以说明当前的recordLength
- 在我的情况下,可以说是100,000点。 MaxNumberPoint
手动编辑为10,000到100,000。 (在我的情况下,默认数字是0 ..我将其更改为100,000)。 EndingPoint
。我也将它设置为100,000。set(interfaceObj, 'InputBufferLength', 2.5*recordLength)
,即确保输入缓冲区可以容纳超过100,000个点。建议至少使用预期缓冲区的两倍。我之所以使用2.5只是因为。connect()
和readwaveform
。利润。我仍无法通过tmtool
或通过我的GUI收集超过10,000点积分。任何帮助将不胜感激。
答案 0 :(得分:2)
我找到了泰克工程师;他基本上告诉我只是直接使用SCPI命令并跳过驱动程序。虽然很烦人,但这可能是最简单的解决方案。
答案 1 :(得分:1)
您是否有可能一次收集10,000个数据点,然后将它们保存在某处,收集下一个10,000,将它们附加到保存的点,重复?
这是一种解决方法,当然。
答案 2 :(得分:1)
我明白了!我认为。花几周的时间退后一步,刷新真的很有帮助。这是我做的:
1)编辑驱动程序的init
函数以配置更大的缓冲区大小。完成init
代码:
function init(obj)
% This method is called after the object is created.
% OBJ is the device object.
% End of function definition - DO NOT EDIT
% Extract the interface object.
interface = get(obj, 'Interface');
fclose(interface);
% Configure the buffer size to allow for waveform transfer.
set(interface, 'InputBufferSize', 12e6);
set(interface, 'OutputBufferSize', 12e6); % Originally is set to 50,000
我最初尝试将缓冲区大小设置为22e6(我想得到1000万点),但我得到了内存不足的错误。据推测,缓冲区应该比预期的高出一倍,加上标题空间。我可能不需要200万点的“标题”,但是呃。
2)编辑驱动程序的readwaveform()
以首先查询用户可设置的点数应该是什么。然后,将SCPI命令写入范围,以确保要传输的数据点数等于用户所需的点数。以下代码段将在readwaveform
中执行此操作:
try
% Specify source
fprintf(interface,['DATA:SOURCE ' trueSource]);
%----------BEGIN CODE TO HANDLE MORE THAN 10k POINTS----------
recordLength = query(interface, 'HORizontal:RECordlength?');
fprintf(interface, 'DATA:START 1');
fprintf(interface, 'DATA:STOP %d', str2num(recordLength));
%----------END CODE TO HANDLE MORE THAN 10k POINTS----------
% Issue the curve transfer command.
fprintf(interface, 'CURVE?');
raw = binblockread(interface, 'int16');
% Tektronix scopes send and extra terminator after the binblock.
fread(interface, 1);
3)在用户代码中,设置SCPI命令以将记录大小更改为基础接口对象:
% interfaceObj is a VISA object.
fprintf(interfaceObj, 'HORizontal:RECordlength 5000000');
你有它。希望这可以帮助那些试图解决这个问题的人。
答案 3 :(得分:0)
这是个坏主意。开始收集10,000点。当你达到5000点时,再次开始收集数据(你可能需要在一个新线程中运行它)。继续前进,直到您需要的所有数据都存储在20个数据结构中。然后,通过排列数据点将结构组合成一个结构。这可能比直接调用SCPI命令更有用,并且可能有一些我没有想到的令人讨厌的警告。但正如我所说,这是一个坏主意......