Home › Forum › Programmazione IEC 61131 (LogicLab) › Blocco PLC su lettura encoder in task Fast
- Questo topic ha 3 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 4 anni, 1 mese fa da Guido.
-
AutorePost
-
Marzo 17, 2020 alle 10:36 am #54045GuidoPartecipante
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;
Marzo 17, 2020 alle 10:39 am #54047GuidoPartecipanteRisolto…
Era solo un problema nel superamento del tempo di esecuzione del task Fast.
Marzo 17, 2020 alle 10:52 am #54049Sergio BertanaAmministratore del forumPer 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.
Marzo 17, 2020 alle 12:35 pm #54050GuidoPartecipanteNel 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.