MATLAB タイマー オブジェクトが役立ちます。たとえば、このリンクUsing MATLAB to process files in real-time after every instance a file is created by a separate program を参照してください。
単一のファイルへの書き込み (他のプロセス) と読み取り (MATLAB) の同時実行に関して、いくつかの懸念があるかもしれません。あなたの状況は、ファイルよりもパイプに適している可能性があります:パイプと一時ファイルですが、時間指定されたファイルの読み取りとプロットの更新のための MATLAB ベースのソリューションに進みます。
私はあなたの状況をエミュレートし、いくつかのことを学びました:
- MATLAB ファイル ハンドルは現在の位置を格納します。ただし、file-id に end of file フラグが設定されている場合、MATLAB は後続の への呼び出し
fread
が行われたときに新しいデータを検索しません。fseek
以下の関数で使用する回避策を参照してくださいreadFile
。
- 10 ミリ秒は楽観的です。MATLAB は点を見逃すことはありませんが、通常、更新ごとに 1 つではなく 4 つ以上のデータ点が追加されます。
- データのソースがバッファー ファイル書き込みを使用している場合、バッファーがディスクにフラッシュされるまで、MATLAB は新しいデータを認識しません。以下の Python コードは、データのソースをエミュレートするために使用されました。ファイルは、バッファリングなしで書き込むために開かれました:
fobj = open('test.dat', 'wb', 0)
。
以下の MATLAB コード:
function [t] = livePlot(period, filename)
//% inputs : period : update rate in seconds
//% filename : name of the file to get data from
//%
//% outputs: t : the timer object
//% >> stop(t)
//% ends streaming
//%%
close all;
t = timer('StartDelay', 1, 'Period', period, ...
'ExecutionMode', 'fixedRate');
//%% timer object callback functions
t.StopFcn = {@stopFigure};
t.TimerFcn = {@updateFigure};
//%% initialize timer object user data
d = get(t, 'UserData');
d.data = []; % array for the data to plot
axes('Position', [0 0 1 1], 'Visible', 'off');
d.axes_handle = axes('Position', [.2 .1 .7 .8]);
d.line_handle = plot(NaN,NaN);
d.fid = fopen(filename, 'r');
set(t, 'UserData', d);
start(t);
end
function stopFigure(obj, event)
//% close function handle
d = get(obj, 'UserData');
fclose(d.fid);
end
function updateFigure(obj, event)
d = get(obj, 'UserData');
//% read new data from file
tmp = readFile(obj);
//% append to array in user data
d.data = [d.data transpose(tmp)];
//% update the plot
set(gcf, 'CurrentAxes', d.axes_handle);
set(d.line_handle, 'XData', 1:length(d.data), 'YData', d.data);
//% store the timer object user-data
set(obj, 'UserData', d);
end
function [tmp] = readFile(obj)
//% read binary data. file-ID is in the timer user-data
d = get(obj, 'UserData');
tmp = fread(d.fid);
fprintf('Current file location : %d \n', ftell(d.fid));
//% fprintf('End of file indicator : %d \n', feof(d.fid));
//% reset the end-of-file indicator
fseek(d.fid, -1, 0);
fseek(d.fid, 1, 0);
//% fprintf('End of file indicator : %d \n', feof(d.fid));
set(obj, 'UserData', d);
end
~ 10 ミリ秒ごとにファイルにデータを書き込む Python コード:
#!/anaconda/bin/python
import numpy as np
from time import sleep
sleep_time = 0.01
sigma = 5
fobj = open('test.dat', 'wb', 0)
for i in range(5000):
sleep(sleep_time)
x = int(np.random.normal(sigma))
fobj.write('%c' % x)
fobj.close()