Vai al contenuto

Problema nella gestione uscite PWM

Home Forum Controllori SlimLine e Netsyst (LogicLab) Problema nella gestione uscite PWM

Taggato: 

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

    Ho ripreso in mano un progetto dell’anno scorso che utilizza 6 PWM di tipo veloce. Premetto che avevamo trasferito la licenza previo pagamento.

    Il mio collega (che ora non è più con noi) ha gestito la funzione SysSetPWMOut all’interno di 6 FB. Per stoppare la funzione ha lavorato sui parametri Frequency e Duty (Screenshot programma).

    Talvolta almeno una delle uscite PWM non si ferma anche  se Frequency  e Duty sono a zero.

    Talvolta almeno una delle uscite PWM non parte anche se Frequency  e Duty sono diversi da zero.

    Suggerimenti?

    #82117
    Sergio Bertana
    Amministratore del forum

    Nel FB SysSetPWMOut azzerando Frequency e/o azzerando Duty l’uscita PWM deve azzerarsi, così come impostando un valore nei due parametri l’uscita deve generare la frequenza impostata, trovo strano che questo non succeda.

    Nel tuo programma vedo che le variabili APPO_FREQ ed APPO_DUTY sono di tipo UINT mentre il FB vuole variabili di tipo REAL, credo che nella compilazione del programma ti vengano segnalate warnings ad indicare questa incongruità di tipo sulle variabili.

    Teoricamente LogicLab dovrebbe effettuare il cast del valore corettamente, comunque proverei ad inserire il cast sui valori.

    FB_PWM_OUT(Address:=ADDR, Channel:=CHAN, Frequency:=TO_REAL(APPO_FREQ), Duty:=TO_REAL(APPO_DUTY));
    • Il FB da te realizzato è sempre eseguito?
    • In che task lo stai eseguendo?
    • Puoi verificare con il comando SysLog se hai errori di esecuzione?
    • Eventualmente puoi inviare il programma alla nostra eMail di supporto e proviamo a dare una occhiata.
    #82173
    marco66
    Partecipante

    FB sempre eseguito all’interno di un’altra FB istanziata 6 volte

    FB_C_M1(ENAB:=FB_C_M1_EN,ADDR:=255,CHAN:=0,FREQ:=REC_ACT.FREQ,DUTY:=DUTY_C_M1);
    FB_C_M2(ENAB:=FB_C_M2_EN,ADDR:=255,CHAN:=1,FREQ:=REC_ACT.FREQ,DUTY:=DUTY_C_M2);
    FB_C_M3(ENAB:=FB_C_M3_EN,ADDR:=1,CHAN:=0,FREQ:=REC_ACT.FREQ,DUTY:=DUTY_C_M3);
    FB_C_M4(ENAB:=FB_C_M4_EN,ADDR:=1,CHAN:=1,FREQ:=REC_ACT.FREQ,DUTY:=DUTY_C_M4);
    FB_C_M5(ENAB:=FB_C_M5_EN,ADDR:=1,CHAN:=2,FREQ:=REC_ACT.FREQ,DUTY:=DUTY_C_M5);
    FB_C_M6(ENAB:=FB_C_M6_EN,ADDR:=1,CHAN:=3,FREQ:=REC_ACT.FREQ,DUTY:=DUTY_C_M6);
    
    // ABILITAZIONE PWM
    
    IF ENAB=TRUE THEN
        APPO_DUTY:=DUTY;
        APPO_FREQ:=FREQ;
    ELSE
        APPO_DUTY:=0;
        APPO_FREQ:=0;
    END_IF;
    
    FB_PWM_OUT(Address:=ADDR,Channel:=CHAN,Frequency:=APPO_FREQ,Duty:=APPO_DUTY);

    Invio copia programma alla Vs eMail di supporto per una analisi.

    #82176
    Sergio Bertana
    Amministratore del forum

    Ho analizzato il programma che hai mandato è molto complesso quindi mi è difficile capire cosa succede ma ho notato alcune cose:

    Hai eseguito in task Fast il programma CYCLE che gestisce l’abilitazione delle tue FB di gestione PWM le quali però sono eseguite in task Slow.  Questa soluzione non dà vantaggi perchè i tempi di gestione del PWM sono comunque quelli della task Slow. Inoltre gestire variabili cross task con la task Fast può nascondere delle insidie la task Fast non gestisce l’immagine di processo sulle variabili. Quindi il primo consiglio è di spostare il programma CYCLE in task Slow.

    Puoi dirmi la versione del firmware del modulo CPU e la versione del firmware del modulo di I/O che gestisce il PWM. Per visualizzare la versione devi connetterti in telnet ed utilizzare il comando SLineInfos.

    Quando dici “Talvolta almeno una delle uscite PWM non si ferma anche se Frequency e Duty sono a zero” intendi che non si ferma immediatamente oppure che continua a generare l’uscita.

    Quando dici “Talvolta almeno una delle uscite PWM non parte anche se Frequency e Duty sono diversi da zero” in questo caso il valore di Frequency è comunque maggiore del valore minimo gestito da quel canale PWM. I valori li trovi qui nel capitolo “Moduli supportati”.

    Per completezza e rifacendomi al cast delle variabili ho visto che la compilazione del tuo programma genera 260 warnings. Certo le warnings solitamente non generano problemi ma attenzione warning come questa

    P_OB1(58) - warning G0082:  DUTY_C_M3 => Writing a signed value into an unsigned variable

    Satnno ad indicare che stai copiando il valore di una variabile con segno nel tuo caso di tipo INT in una variabile senza segno nel tuo caso UINT. Ora se il valore della variabile INT diventa negativo (Ad esempio -1) il valore della variabile UINT divente 65535. Quindi in questi casi bisogna essere certi che la variabile con segno non diventi mai negativa.

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