Improper use of putdata
2 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Hello,
I try to control an industrial process through Matlab, NI DAQ-6052E and NI BNC-2110. That's why I need to output a continuous voltage, which is varying in time.
My problem is that using the putdata function, I get only a single value as output result (as you can see it bellow in the answer I get).
Any idea ?
Thank you in advance, Csaba
Here is the code :
%%Start NI DAQ-6052E
disp(' ');
disp('START');
disp(' ');
clear all;
close all;
%%Define ai
disp('Init ai: 100Hz, 10s');
ai = analoginput('nidaq', 'Dev1');
addchannel(ai, 0);
ai.SampleRate = 100;
t_in = 10;
ai.SamplesPerTrigger = t_in*ai.SampleRate;
ai.TriggerType = 'Immediate';
ai.Timeout = t_in+10 ;
%%Define AO
disp('Init AO: as ai');
AO = analogoutput('nidaq','Dev1');
addchannel(AO, 0);
set(AO,'SampleRate',ai.SampleRate);
set(AO,'TriggerType','Immediate');
t_out = t_in;
f_out = get(AO,'SampleRate');
n_out = f_out*t_out;
%%Reading input values
disp('Start acq');
start(ai);
wait(ai,t_in+1);
[value_in,t] = getdata(ai);
%%Generating output data
disp('Calc data out');
n_out = size(value_in,1);
data_out = zeros(n_out,1);
for i=1:1:(t_out*f_out)
t(i,1)=i/(f_out);
data_out(i,1) = 5-value_in(i,1);
end
*%%Outputting data
disp('Putdata');
putdata(AO,data_out);
s_out=get(AO,'SamplesOutput');
wait(AO,t_out+1);
start(AO);
s_out=get(AO,'SamplesOutput');
%%Verifying output
disp('# value read : '); disp(n_out);
disp('# data out : '); disp(s_out);
delta = n_out - s_out;
disp('DELTA : '); disp(delta);*
%%Display graph
disp('Graph');
fig = figure('Name', 'Test AI & AO on NI DAQ-6052E ND Matlab', 'NumberTitle','off');
subplot(2,1,1);
graph_in = plot(t,value_in);
set(graph_in,'Color','red','LineWidth',2)
title('Values read on ai')
axis([0 10 0 10])
set(gca,'XTick',0:1:10)
set(gca,'XTickLabel','0|1|2|3|4|5|6|7|8|9|10')
set(gca,'YTick',[0 1 2 3 4 5 6 7 8 9 10])
set(gca,'YTickLabel','0|1|2|3|4|5|6|7|8|9|10')
xlabel('Time [s]')
ylabel('Voltage [V]')
subplot(2,1,2);
graph_out = plot(t,data_out);
set(graph_out,'Color','black','LineWidth',2)
title('Data sent on AO')
axis([0 10 0 10])
set(gca,'XTick',0:1:10)
set(gca,'XTickLabel','0|1|2|3|4|5|6|7|8|9|10')
set(gca,'YTick',[0 1 2 3 4 5 6 7 8 9 10])
set(gca,'YTickLabel','0|1|2|3|4|5|6|7|8|9|10')
xlabel('Time [s]')
ylabel('Voltage [V]')
%%Stop NI DAQ-6052E
disp('Clear AO');
delete(AO);
clear AO;
disp('END.');
disp('*********');
disp(' ');
And here is the answer :
START
Init ai: 100Hz, 10s
Init AO: as ai
Start acq
Calc data out
Putdata
*# value read :
1000
# data out :
1*
DELTA :
999
Graph
Clear AO
END.
*********
0 Commenti
Risposta accettata
Chirag Gupta
il 13 Lug 2011
Put the wait command after start(AO) in your code.
putdata queues the data in the engine and start(AO) would start the output.
putdata(....)
start(AO);
wait(AO,....)
...
1 Commento
Chirag Gupta
il 13 Lug 2011
Also you should use SamplesAvailable property to check for the number of samples available for output.
So:
putdata(...)
samp_out_avail = get(AO,'SamplesAvailable');
start(AO);
while (AO.Running)
s_out = get(AO,'SamplesOutput')
pause(0.5)
end
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Get Started with MATLAB in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!