如何并行运行代码?(通过VISA和RS232与设备通信



我写了一个代码来同时控制3个不同的设备。(函数发生器、温度计和光谱仪(

在每个回路中,它从温度计中读取温度,并从光谱仪中收集光谱数据。然而,为了获得良好的S/N比,光谱仪需要500ms曝光+2次平均。(总共约1秒(这是运行代码的瓶颈,它使我无法从温度计中收集更频繁的温度数据。(它可以每200毫秒接收一次温度数据。(正因为如此,我可以每1.2秒获得一次数据点。我希望通过并行运行这两个循环来更频繁地从温度计中收集数据。(while循环中的这两个部分,我用粗体标记。那个部分是我想要并行运行的。(此外,这两个测量应该沿着实时进行

你能教我如何做到这一点吗?下面是我写的代码。提前感谢您的帮助!

i = 1;
tstart=tic;
k=0;
tnow = 0;
tic
while(tnow<TimeTotal)
% time(i) = DataAcqTime*(i-1); do not work due to latency in RC232
if ((tnow > BeforeField) && (tnow < BeforeField + AfterField)) && k==0
fprintf(fgen, ':OUTPUT:STATe 1'); %Field is on
k=1;
end

if (tnow > BeforeField + Fieldtime) && k==1  
fprintf(fgen, ':OUTPUT:STATe 0'); %Field is off
k=2;
end

temp = fscanf(sObject);
%fscanf(sObject)
t{i} = temp(7:12);
data(i) = str2double(t{i});
tnow = tnow + toc
time(i)=tnow;
tic
NrMeas=0;
while (stoploop==false) & (NrMeas<Measnum)
S.StartPixel=0;
S.StopPixel=nPix-1;
S.IntegrationDelay=0;
S.CorDynDark=0;
S.Smoothing=0;
S.TriggerMode=0;
S.TriggerSource=0;
S.TriggerSourceType=0;
S.SaturationDetection=1;
myLambda=spectrometer('getlambda');
spectrometer('measconfig',S);
spectrometer('measure',1);
myData=spectrometer('getdata');
mySat=spectrometer('getsaturated');
NrMeas=NrMeas+1;
xlabel('Wavelength [nm]');          
ylabel('Counts');
%    pause(0.001)  %seconds !!
end
%plot(myLambda,myData,myLambda,mySat);
specdata{i}=myData;
%pause(DataAcqTime); %no small value than 0.1 it fails
i=i+1;
tnow = tnow + toc
time2(i)=tnow; %spectrum time is different from T probe time

tic
end
tEnd = toc(tstart)

并行计算工具箱是最好的选择工具箱中的parfor函数可以帮助您并行运行多个for循环。

另一种选择是使用Simulink。对于您的应用程序类型(3个输入数据流(,可以使用"合并"块。

以下是有关parfor的更多信息-https://www.mathworks.com/help/parallel-computing/convert-for-loops-into-parfor-loops.html,这里有更多关于"合并"块的信息-https://www.mathworks.com/help/simulink/slref/merge.html

相关内容

  • 没有找到相关文章