Vai al contenuto

Conteggio veloce su ingresso digitale

Home Forum Programmazione IEC 61131 (LogicLab) Conteggio veloce su ingresso digitale

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

    Devo 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.

    #75442
    Sergio Bertana
    Amministratore del forum

    Cominciamo 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.

    #84117
    AndreaT.
    Partecipante

    Buonasera 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.

    #84133
    Sergio Bertana
    Amministratore del forum

    Puoi 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.

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