Uso del subplot per grafico Real Time

di il
2 risposte

Uso del subplot per grafico Real Time

Buongiorno a tutti, sono nuovo ed è la prima domanda che faccio.
Ho realizzato un codice Matlab per leggere dati in ingresso dalla porta seriale e realizza un grafico real time.
In realtà ho utilizzato la funzione subplot per avere 2 grafici real time, il problema è che solo il sottografo su cui faccio clic con il mouse scorre in avanti con lo scorrere del tempo.
C'è un modo per far scorrere contemporaneamento i sottografi?
Grazie.

2 Risposte

  • Re: Uso del subplot per grafico Real Time

    Se non pubblichi il codice che hai scritto e che, a quanto pare, non funziona come ti aspetti, è difficile, se non impossibile, aiutarti.
  • Re: Uso del subplot per grafico Real Time

    Clear all
    clc

    %User Defined Properties
    serialPort = 'COM11'; % definizione della porta COM #
    plotTitle = 'Riferimento'; % titolo del primo grafico
    xLabel = 'Time (s)'; % etichetta per l'asse x
    yLabel = 'Posizione angolare motore voluta'; % etichetta per l'asse y
    plotTitle2 = 'Uscita Inner Loop'; % titolo del secondo grafico
    xLabel2 = 'Time (s)'; % etichetta per l'asse x
    yLabel2 = 'Posizione angolare motore'; % etichetta per l'asse y
    plotGrid = 'on'; % 'off' per eliminare la griglia
    min = -500; % estremo inferiore dell'asse y
    max = 500; % estremo superiore dell'asse y
    scrollWidth = 100; % il periodo mostrato nel grafico (ampiezza dell'asse x)
    delay = .01; % ritardo necessario per l'aggiornamento del grafico

    %Definizione variabili
    time = 0;
    data = 0;
    count = 0;

    time1 = 0;
    data1 = 0;
    count1 = 0;

    subplot(1,2,1),x = plot(time,data,'LineWidth', 2, 'Color', 'r');

    title(plotTitle,'FontSize',25);
    xlabel(xLabel,'FontSize',15);
    ylabel(yLabel,'FontSize',15);
    axis([0 1 min max]);
    grid(plotGrid);

    subplot(1,2,2),y = plot(time,data,'LineWidth', 2, 'Color', 'b');

    title(plotTitle2,'FontSize',25);
    xlabel(xLabel2,'FontSize',15);
    ylabel(yLabel2,'FontSize',15);
    axis([0 1 min max]);
    grid(plotGrid);

    %Aprtura porta seriale COM
    s = serial(serialPort);
    set(s,'BaudRate',9600);
    disp('CHIUDERE IL GRAFICO PER TERMINARE LA SESSIONE');
    fopen(s);

    %dat = fscanf(s,'%f'); %Lettura dati float dalla porta seriale
    %fprintf('prima del while: %f \n ', dat);

    tic

    while ishandle(x) %Il loop è attivo fino alla chiusura del grafico

    dat = fscanf(s,'%f'); %Lettura dell'angolazione di riferimento dalla porta seriale
    fprintf('Primo dato letto %f \n ', dat);

    if(~isempty(dat) && isfloat(dat)) %Controllo sulla correttezza del dato
    count = count + 1;
    time(count) = toc; %Tempo passato dal tic
    data(count) = dat(1); %Salvataggio del primo elemento letto nel vettore data

    fprintf('data(count): %f \n ', data(count));
    fprintf('dat(1): %f \n ', dat(1));

    %Impostazione dei valori sugli assi in base allo scorrere del tempo
    if(scrollWidth > 0)
    set(x,'XData',time(time > time(count)-scrollWidth),'YData',data(time > time(count)-scrollWidth));
    axis([time(count)-scrollWidth time(count) min max]);
    else
    set(x,'XData',time,'YData',data);
    axis([0 time(count) min max]);
    end

    %Permettere a MATLAB di aggiornare il grafico
    pause(delay);
    end

    dat1 = fscanf(s,'%f'); %Lettura dell'angolazione raggiunta dallo sterzo

    fprintf('Secondo dato letto %f \n ', dat1);

    if(~isempty(dat1) && isfloat(dat1))
    count1 = count1 + 1;
    time1(count1) = toc;
    data1(count1) = dat1(1);

    fprintf('data1(count1): %f \n ', data1(count1));
    fprintf('dat1(1): %f \n ', dat1(1));

    if(scrollWidth > 0)
    set(y,'XData',time1(time1 > time1(count1)-scrollWidth),'YData',data1(time1 > time1(count1)-scrollWidth));
    axis([time1(count1)-scrollWidth time1(count1) min max]);
    else
    set(y,'XData',time1,'YData',data1);
    axis([0 time1(count1) min max]);
    end

    pause(delay);
    end

    end

    %Close Serial COM Port and Delete useless Variables
    fclose(s);
    clear all;

    disp('SESSIONE TERMINATA');
Devi accedere o registrarti per scrivere nel forum
2 risposte