Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Regolazione Uscita Analogica


Messaggi consigliati

luiginodorigo
Inserito:

Buongiorno, avrei un problema da sottoporvi :unsure:

per la regolazione di un impianto di un mio cliente, avrei la necessità di regolare un uscita analogica in tensione (0 – 10V), in maniera crescente e decrescente, a secondo della presenza o meno di due ingressi digitali, in maniera lineare nel tempo.

Esempio incremento: Ingresso presente E0.0, la PAW256 aumenta il suo valore, da quello esistente in precedenza, fino al valore massimo di 10V.

Esempio decremento: Ingresso presente E0.1, la PAW256 diminuisce il suo valore, da quello esistente in precedenza, fino al valore minimo di 0V.

Ovviamente alla mancanza degli ingressi E0.0 in fase di incremento ed E0.1 in fase di decremento, il valore analogico della PAW256 deve rimanere sul valore fino a lì raggiunto.

Ringraziando anticipatamente chiunque mi possa dare dei consigli a riguardo.


Inserita:

Suppongo che stai parlando di s7-300

0V = 0

10V = 27648

come gestire la cosa dipende dalla precisione richiesta in termini di tempo e dalla velocità di inc/dec

puoi usare un semplice timer e ogni volta che va on incrementi di tot il valore analogico

oppure, meglio ancora, usi l'OB 35 che è un interrupt a tempo preciso la cui scansione è parametrizzabile dalla config hardware

e ogni volta che viene eseguito incrementa o decrementa o non fa nulla se gli ingressi sono a zero

ciao

Inserita:

Più semplicemente poi usare FC105 o FC106 non ricordo quale dei due per scalare l'uscita per esempio 0-100 e incrementarla o decremantarla con l'ingresso e il fronte di salita di un clock della cpu (sotto hardware, cpu, merker di clock).

Ciao

luiginodorigo
Inserita:

Grazie, cisio e RickyM, farò delle prove in merito.

Obbligato

Luigino

Inserita:

prova ad usare l'fc 105 scale e l'fc106 unscale, sono degli fc di sistema che ti fatto fare un pò di giochi con le analogiche!!

  • 2 weeks later...
Inserita:

Tirare in ballo scalature e virgola mobile per il semplice incremento/decremento del valore di una uscita analogica mi pare un pò eccessivo.

Se non hai bisogno di lavorare con valori ingegneristici abbandonerei quindi le scalature e farei semplici operazioni con interi.

Un primo esempio di come potresti fare l'incremento/decremento di un valore intero compreso tra 0 e 27648 è il seguente:

      L     MW   100
      U     E      0.0
      SPB   INC
      U     E      0.1
      SPB   DEC
      SPA   VAL
INC:  L     5
      +I    
      SPA   VAL
DEC:  L     5
      -I    
VAL:  T     #AuxVal
      L     0
      >=I   
      SPB   OK_1
      T     #AuxVal
OK_1: L     #AuxVal
      L     27648
      <=I   
      SPB   OK_2
      T     #AuxVal
OK_2: L     #AuxVal
      T     MW   100
      T     PAW  256
Un altro metodo è invece questo:
      L     5
      U     E      0.0
      SPB   STEP
      U     E      0.1
      L     -5
      SPB   STEP
      L     0
STEP: L     MW   100
      +I    
      T     #AuxVal
      L     0
      >=I   
      SPB   ok_1
      T     #AuxVal
ok_1: L     #AuxVal
      L     27648
      <=I   
      SPB   ok_2
      T     #AuxVal
ok_2: L     #AuxVal
      T     MW   100
      T     PAW  256

In entrambi gli esempi si controlla anche che il valore non esca dai limiti imposti.

La variabile #AuxVal è una variabile locale di tipo INT.

MW100 è, ovviamente, usata come esempio. Se preferisci (io di solito preferisco) puoi usare la variabile di un DB. Una variabile di appoggio è comunque indispensabile, perché non è possibile leggere il valore attuale di una uscita analogica, ma solo scriverlo. Una istruzione tipo "L PAW256" non è valida.

Anche gli incrementi a step di +/- 5 sono ovviamente solo di esempio.

Richiamando queste istruzioni in OB35 ottieni incrementi/decrementi ad intervalli di tempo molto precisi.

Inserita:

ciao a tutto il Forum

scopo: variare l'uscita analogica da 0 a 100% e viceversa in un tempo definito (es. 30s) a fronte di n° due ingressi destinati rispettivamente all'incremento e al decremento dell'uscita

suggerirei di utilizzare un generatore di impulsi e un contatore avanti-indietro

Il conteggio esteso tra 0-100 identifica lo 0-100% dell'uscita analogica

- Con il generatore si realizza il trigger per il counter (la lunghezza del l'impulso e quindi il tempo di trigger saranno regolabili in virtù del parametro passato in ingresso al generatore stesso)

- il counter dovrà contare tra 0-100 e viceversa

- un confronto in Integer per limitare il conteggio tra lo 0-100 del counter assicura il corretto comportamento dello stesso inibendo i segnali di incrementa/decrementa.

- una scalatura per passare da 0-100 (%) a 0-27648

- gli ingressi digitali passati al counter faranno incrementare o decremantare il counter come da richiesta dell'operatore

Ciao e buon lavoro: :unsure:

Inserita:
suggerirei di utilizzare un generatore di impulsi e un contatore avanti-indietro

Il conteggio esteso tra 0-100 identifica lo 0-100% dell'uscita analogica

Sicuramente funziona anche così, ma perché ci si deve per forza complicare la vita?

Perché dovrei tirare in ballo un generetore di impulsi quando ho a disposizione l'OB35?

Perché devo fare gradini dell'1% quando è invece possibile ottenere una variazione più regolare?

Perché devo scrivere più righe di codice e far quindi fare più lavoro alla cpu, utilizzando generatori di impulsi, contatori UP/DOWN e scalature per ottenere, oltretutto, un risultato inferiore?

Certo, le soluzioni da me proposte vanno bene solo per chi mastica almeno un pò di AWL, mentre se si è abituati a lavorare solo in KOP sono difficilmente comprensibili.

Credo però di non venire smentito se affermo che fare quanto richiesto in maniere ancora più sintetica sia difficile.

Siamo abituati ormai a cpu con memoria e prestazioni notevoli, e ci curiamo molto poco di quanto diventa grande un programma. Questo porta spesso a programmi inutilmente mastodontici.

Solo per curiosità ho creato una FC con le istruzioni del mio secondo esempio, ed una con conteggio /UP/DOWN e scalatura, trascurando la generazione dell'impulso (che sicuramente serve anche per altre cose e quindi non la considero), e senza effettuare controlli sul superamento dei limiti (cosa questa che andrebbe sicuramente fatta).

La prima FC occupa 112 byte, la seconda 144. La differenza non è molta, ma la seconda contiene anche la funzione UNSCALE da 324 byte, che esegue calcoli in virgola mobile.

Non esagero se affermo che con il metodo del contatore e della scalatura l'impegno della cpu per eseguire la stessa funzione è almeno triplo.

Inserita:

ciao Batta,

ho provato a eliminare qualche istruzione e qualche salto e sembra funzionare tuttavia il metodo con il generatore di impulsi da me sostenuto mi lascia maggiore elesticità di utilizzo. in genere lo impiego per posizionare degli attuatori governati da regolatore PID in manuale definendo tempo e percentuale di apertura impostabili da HMI.

saluti :huh:

L #APP_PAW

U #UP

SPB INC

UN #DOWN

BEB

SPA DEC

INC: L 27648

>=I

BEB

TAK

L 3

+I

T #APP_PAW

BE

DEC: L 0

<=I

BEB

TAK

L 3

-I

T #APP_PAW

BEA

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...