Conteggio veloce su ingresso digitale
Home › Forum › Programmazione IEC 61131 (LogicLab) › Conteggio veloce su ingresso digitale
- Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 5 giorni, 19 ore fa da
Sergio Bertana.
-
AutorePost
-
Gennaio 16, 2024 alle 1:48 pm #75439
Anonimo
InattivoDevo fare un conteggio veloce e ho messo il programma con il FB in esecuzione nela task Fast. L’ingresso che controllo è quello a bordo modulo CPU 255.0.
L’aggioramento di questo ingresso va bene o meglio usare un ingresso dell’espansione ?
Chiedo perchè faccio fatica a misurare bene.
Gennaio 16, 2024 alle 1:58 pm #75442Sergio Bertana
Amministratore del forumCominciamo con il dire che per il conteggio consiglio di utilizzare l’operando somma al posto del FB CTU. Questo ti permette di utilizzare per il conteggio una variabile della dimensione che desideri 8/16/32/64 bits, inoltre puoi definirla come RETAIN o allocarla nella DB100 ad indirizzo da 2048 per avere il valore mantenuto allo spegnimento. E con semplici operazioni di MOVE puoi variarne il valore per il reset od il preset.
Come ingresso digitale è consigliato utilizzare quelli del modulo CPU come correttamente hai fatto, ma non devi utilizzare l’immagine di processo bensì devi acquisirne lo stato con il FB SysGetPhrDI. Ecco un programma di esempio.
// ***************************************************************************** // PROGRAM "CounterOnDI" // ***************************************************************************** // Manage counter on CPU module Di00. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // INITIALIZATION // ------------------------------------------------------------------------- // Initialize variables. IF (SysFirstLoop) THEN i:=SysSetTaskLpTime(ID_TASK_FAST, 500); //Task Fast is executed every 500uS // Set digital input module. DInp.Address:=255; //Module address DInp.Mode:=DI_MODE#DI_8_LL; //Acquisition mode END_IF; // ------------------------------------------------------------------------- // COUNTER MANAGEMENT // ------------------------------------------------------------------------- // Check digital input rising pulse. DInp(); //Digital input acquisition IF (DInp.Value.0 = Pulse) THEN RETURN; END_IF; Pulse:=DInp.Value.0; //Digital input pulse // Increase the counter. IF (DInp.Value.0) THEN Counter:=Counter+1; END_IF; // [End of file]
Il programma và eseguito in task Fast di cui puoi cambiare il tempo di esecuzione, lo standard è 1mS ma puoi scendere fino a 100uS. Se vuoi modificare l’ingresso digitale cambia DInp.Value.x dove x è l’ingresso da utilizzare.
Settembre 27, 2025 alle 12:23 am #84117AndreaT.
PartecipanteBuonasera vorrei utilizzare il FB SysGetPhrDI sul modulo esstensione 16+16 PCB124B100 per tutti gli ingressi ma non riesco leggerli.
Forse sbaglio ad impostare il Mode, esiste un programma di esempio per questo modulo.
Settembre 29, 2025 alle 10:24 am #84133Sergio Bertana
Amministratore del forumPuoi utilizzare l’esempio ST_SysGetPhrDI, se il modulo PCB124 ha indirizzo 0 dovrai modificarlo così:
DInp.Address:=0; //Module address DInp.Mode:=DI_MODE#DI_I_16_L; //Acquisition mode DInp(); //Digital input acquisition IF (DInp.Done) THEN InpValue:=DInp.Value; END_IF;
Nel post si parla di conteggio veloce su ingressi digitali quindi ho definito Mode con DI_MODE#DI_I_16_L in modo da escludere il debouncing hardware sul modulo che filtra l’ingresso a circa 5mS.
Se la tua necessità è di gestire 16 contatori uno per ogni ingresso del modulo dovrai come nell’esempio sopra eseguire il programma in task Fast, ma attenzione rispetto alla acquisizione dal modulo CPU in cui la SysGetPhrDI viene acquisita in 10uS una acquisizione da modulo di estensione necessita di circa 300uS quindi se imposti il tempo di esecuzione a 500mS come nel primo esempio del post dovrai verificare di avere tempo sufficente ad eseguire tutte le operazioni.
Ti ricordo che in debug puoi visualizzare le variabili di sistema SysTFastExTm e SysTFastExTmMax per controllare l’effettivo tempo di esecuzione.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.