【问题标题】:How to run code in parallell? (Communicating with equipments through VISA and RS232如何并行运行代码? (通过VISA和RS232与设备通信
【发布时间】:2020-12-23 08:09:50
【问题描述】:

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

每个循环,它从温度计读取温度并从光谱仪收集光谱数据。然而,为了获得良好的信噪比,光谱仪需要 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)

【问题讨论】:

    标签: matlab parallel-processing serial-port spectrogram visa


    【解决方案1】:

    并行计算工具箱是要走的路。工具箱中的“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

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多