Vai al contenuto

Blocco PLC su lettura encoder in task Fast

Home Forum Programmazione IEC 61131 (LogicLab) Blocco PLC su lettura encoder in task Fast

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #54045
    Guido
    Partecipante

    Ho la necessità di utilizzare SysGetEncoder nel task Fast (1mSec) ma al run va in errore e si blocca mostrando l’errore:

    Cannot transfer the START command to PLC run-time

    Se eseguo il programma nel task Back o Slow (10mSec) invece funziona regolarmente. Prova effettuata con un PLC SlimLine Mps054 Xtarget 12.00 e modulo IO digital PCB124B010. Avete suggerimenti, ecco il programma utilizzato:

    VAR_GLOBAL RETAIN
        RO_POSITION : REAL; (* Posizione Riga Ottica (mm) *)
        RO_RESOLUTION : REAL; (* Risoluzione Riga Ottica (mm) *)
    END_VAR
    
    VAR
        RO_Offset : REAL;
        RigaOttica : SysGetEncoder; (* Encoder Riga Ottica *)
    END_VAR
    
        IF SysFirstLoop THEN
            RigaOttica.Address := 0; (* Module address *)
            RigaOttica.Channel := 0; (* Module channel *)
            RigaOttica.ZeroEn := TRUE; (* Zero pulse enable *)
    
            IF (RO_RESOLUTION = 0.0) THEN RO_RESOLUTION:=0.005; END_IF;
            RO_Offset := RO_POSITION;
        END_IF; // SysFirstLoop
    
        RigaOttica(); (* Encode quote acquisition *)
    
        RO_POSITION := RO_RESOLUTION * TO_REAL(TO_INT(RigaOttica.EQuote));
    
        // Riga Ottica non azzerata, utilizzo la posizione salvata prima
        // dello spegnimento (valore approssimato)
    
        IF NOT (RigaOttica.ZeroD) THEN
            RO_POSITION:=RO_POSITION+RO_Offset;
        END_IF;
    #54047
    Guido
    Partecipante

    Risolto…

    Era solo un problema nel superamento del tempo di esecuzione del task Fast.

    #54049
    Sergio Bertana
    Amministratore del forum

    Per curiosità ho analizzato il problema ed ho eseguito il calcolo del tempo di esecuzione del tuo programma, ho inserito in testa al tuo programma il salvataggio del tempo di sistema, ed in coda il calcolo del tempo di esecuzione.

    VAR
        TimeBf : UDINT; (* Time buffer (uS) *)
        ExTime : UDINT; (* Tempo di esecuzione (uS) *)
        MaxTime : UDINT; (* Massimo tempo di esecuzione (uS) *)
    END_VAR
    
        TimeBf:=SysGetSysTime(TRUE);
        ...
        Programma cliente di cui calcolare tempo esecuzione.
        ...
        ExTime:=SysGetSysTime(TRUE)-TimeBf;
        IF (ExTime > MaxTime) THEN MaxTime:=ExTime; END_IF;

    Il tempo di esecuzione è di 315uS con un massimo di 320uS quindi occupa un terzo del tempo di task (1mS), infatti gira senza problemi. Ora visto che tu lamentavi il problema immagino avessi ridotto il tempo di esecuzione della task Fast, o che avessi altro codice da eseguire.

    Nota: Tutto il tempo è necessario per accedere alla scheda periferica di lettura encoder, se commento la riga di codice che esegue la lettura il tempo necessario per eseguire il programma passa a 7uS.

    #54050
    Guido
    Partecipante

    Nel caso venga sforato il tempo di esecuzione del task purtroppo nella finestra “PLC run-time status” non viene visualizzato nulla che faccia capire la natura dell’errore.

    Soltando innalzando il tempo di loop con SysSetTaskLpTime(TaskID:=ID_TASK_FAST, Time:=1500); ho poi potuto constatare che il tempo necessario all’esecuzione dei miei task, consultando la variabil di sistema SysTFastExTmMax era pari a 1115 microsecondi > 1mSec.

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