Problema nella gestione uscite PWM
Home › Forum › Controllori SlimLine e Netsyst (LogicLab) › Problema nella gestione uscite PWM
Taggato: 6 PWM
- Questo topic ha 3 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 16 ore fa da
Sergio Bertana.
-
AutorePost
-
Maggio 7, 2025 alle 5:42 pm #82112
marco66
PartecipanteHo 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?
Maggio 7, 2025 alle 5:49 pm #82117Sergio Bertana
Amministratore del forumNel 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.
Maggio 8, 2025 alle 2:49 pm #82173marco66
PartecipanteFB 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.
Maggio 9, 2025 alle 8:40 am #82176Sergio Bertana
Amministratore del forumHo 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.