Vai al contenuto

Tempi di gestione rampa su array di variabili

Home Forum Controllori SlimLine e Netsyst (LogicLab) Tempi di gestione rampa su array di variabili

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #34952
    Anonimo
    Inattivo

    Devo eseguire una rampa su 500 variabili UINT. In pratica ho 500 valori di set point e desidero gestire un incremento o decremento di 500 valori reali ogni 5 mSec per eguagliare il valore di set definito.

    Pensavo di eseguire tutto il ciclo nella task fast per avere una risoluzione fine dell’incremento del valore di set. Che tempi di esecuzione posso aspettarmi per la completa gestione dei 500 valori di rampa ?

    #36627
    Sergio Bertana
    Amministratore del forum

    Allego un esempio di programma in ST che effettua la gestione che necessiti, ho realizzato due diverse versioni, una che gestisce la rampa con un array ad indice ed un’altra che gestisce la rampa con i puntatori.

    Ecco la soluzione ad indice (Tempo di esecuzione 507 uSec).

    FOR IDx:=0 TO 500 BY 1 DO

        (* Se valore minore del preset incremento valore. *)
        (* Se valore maggiore del preset decremento valore. *)
      
        IF (Value[IDx] <> Preset[IDx]) THEN
            IF Value[IDx] < Preset[IDx] THEN
                Value[IDx]:=Value[IDx]+1;
            ELSE
                Value[IDx]:=Value[IDx]-1;
            END_IF;
        END_IF;
    END_FOR;

    Ecco la soluzione a pointer (Tempo di esecuzione 681 uSec).

    ValuePtr:=ADR(Value); (* Value pointer *)
    PresetPtr:=ADR(Preset); (* Preset pointer *)
    FOR IDx:=0 TO 500 BY 1 DO

        (* Se valore minore del preset incremento valore. *)
        (* Se valore maggiore del preset decremento valore. *)
      
        IF (@ValuePtr <> @PresetPtr) THEN
            IF (@ValuePtr < @PresetPtr) THEN
                @ValuePtr:=@ValuePtr+1;
            ELSE
                @ValuePtr:=@ValuePtr-1;
            END_IF;
        END_IF;

        ValuePtr:=ValuePtr+2; (* Value pointer *)
        PresetPtr:=PresetPtr+2; (* Preset pointer *)
     END_FOR;

    Per avere l’incremento ogni 5 mSec occorre settare il tempo di esecuzione della task fast a 5 mSec usando la funzione SysSetTaskLpTime. Per verificare il tempo di esecuzione occorre mettere nella finestra di watch la variabile SysTFastExTmMax.
     
    Attenzione! Se il tempo di esecuzione della task fast supera il tempo definito il programma và in errore e l’esecuzione si arresta. Allego programma per download.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.