Vai al contenuto
PLC Forum


S7 222 E Em 235 - trasferire il Valore 0-10v in AQW0


roberto8303

Messaggi consigliati

Ragazzi ho un problemino con la s7 222 e il modulo em 235 praticamente collego all ingresso del modulo una tensione 0-10v e la leggo nella word AIW0 ora vorrei avere in uscita del modulo cioe in AQW0 il valore di ingresso diviso 1,5! ho trasferito il valore di AWI0 come numero reale e faccio la divisione il cui risultato è in una doppia word VD100

fin qui tutto bene ma ora non riesco a riportare questo valore in vd100 in AQW0!!!ho provato tutte le conversioni anche da DI_R oppure DI_I ma niente il blocco diventa rosso oppure mi dice NAN all ingresso del box! quale operazione devo usare??

Link al commento
Condividi su altri siti


Ciao, Roberto8303

Il valore da trasferire sull'uscita analogica AQW0 deve essere una word.

Il risultato della divisione è una doppia word. Prova a guardare il valore della VW100 e VW102 vedrai che la prima word è il risultato della divisione e la seconda word il resto della divisione. Hai cosi sulla word VW100 il valore da trasferire sulla analogica AQW0.

(vado a memoria) vedi l'esempio sul manuale PLC S7 200 a pag. 154

Modificato: da pbono
Link al commento
Condividi su altri siti

Se vuoi effettuare il calcolo in virgola mobile, i passaggi da fare sono i seguenti:

1) conversione di AIW0 da INT a DINT (box I_DI) e risultato in VDxx (oppure potresti usare AC0 o AC1)

2) conversione di VDxx da DINT a REAL (box DI_R) e risultato ancora in VDxx

3) divisione di VDxx per 1.5 (box DIV_R) e risultato ancora in VDxx

4) conversione di VDxx da REAL a DINT (box ROUND) e risultato ancora in VDxx

5) conversione di VDxx da DINT a INT (box DI_I) e risultato in VWxx (il box in uscita non accetta AQWxx)

6) trasferimento di VWxx (box MOW_W) in AQW0

In lista istruzioni (convertibile poi in ladder, se lo preferisci) risulta come segue:

LD     SM0.0
ITD    AIW0, VD100
DTR    VD100, VD100
/R     1.5, VD100
ROUND  VD100, VD100
DTI    VD100, VW100
MOVW   VW100, AQW0
Oppure, utilizando l'accumulatore al posto di VD100:
LD     SM0.0
ITD    AIW0, AC1
DTR    AC1, AC1
/R     1.5, AC1
ROUND  AC1, AC1
DTI    AC1, AC1
MOVW   AC1, AQW0

Insomma, è più lunga la descrizione del codice

Si nota anche come per l'esecuzione di calcoli sia più chiara la lista istruzioni rispetto al ladder ;)

Si potrebbe completare il codice aggiungendo controlli per l'esecuzione delle operazioni solo se l'operazione precedente è stata eseguita correttamente.

Questo lo ottieni in ladder mettendo i box in fila sulla stessa riga (risulta però una visualizzazione scomoda), ed in awl con l'istruzione AENO oppure con SM1.1

Nel tuo caso (valore di partenza sicuramente compreso tra -32768 e 32767) questi controlli non sono, a mio avviso, necessari.

N.B.: le conversioni da INT a DINT e viceversa non servono se i valori rimangono sempre compresi tra 0 e 32767. Sono invece indispensabili se si esce da questi limiti (es. valore negativo).

Se vuoi fare le cose in modo corretto (anche da un punto di vista puramente concettuale e non solo pratico), non omettere queste conversioni.

Link al commento
Condividi su altri siti

Grazie ragazzi! Scusa Batta le conversione da int a dint non sono necessarie se il campo è da 0 a 32767 ma come ho capito sono necessarie per la virgola! perche all inizio del programma hai messo SM0.0 se non lo metto cosa succede?

Link al commento
Condividi su altri siti

Ah per pbono ho provato come mi hai detto tu a usare le word dispari per leggere il valore meno significativo della doppia word ma mi è uscito un numero strano descrivo:

In AIw0 c era 20000 mi sembrano 6 volt ora non ricordo bene.. Aiw0 l ho portato in una VD100 e leggendo il valore nella VW101 mi usciva circa 18500!!ho provato anche a mettere il valore AIW0 nella vd101 e controllare sempre le word pari e dispari ma niente il valore diviso 1,5 non era quello! ora ho capito che devo usare il box round lo provero oggi stesso!

Link al commento
Condividi su altri siti

Scusa Batta le conversione da int a dint non sono necessarie se il campo è da 0 a 32767 ma come ho capito sono necessarie per la virgola! perche all inizio del programma hai messo SM0.0 se non lo metto cosa succede?

La conversione in virgola mobile avviene sempre da DINT. Se come origine hai una variabile di tipo INT la devi prima trasformare in DINT.

Se il valore è sempre compreso tra 0 e 32767 potresti, al posto della conversione, trasferire semplicemente il valore di AIW0 in VW100 (l'indirizzo è, ovviamente, solo di esempio), assicurati che VW102 sia ZERO, e convertire da DINT a REAL la variabile VD100.

Insomma, più complicato che usare la conversione, oltre che concettualmente errato.

Lo stesso vale per la conversione da DINT a INT. Con l'istruzione ROUND trasformi una variabile da REAL a DINT (arrotondando al valore intero più vicino). Se il valore è compreso tra 0 e 32767, potresti caricare il valore convertito da REAL a DINT in VD100, e poi trasferire all'uscita solo VW100.

In questo caso risparmieresti un'istruzione, ma il procedimento sarebbe concettualmente, se non errato, almeno discutibile.

SM0.0 è un merker sempre ON. Le istruzioni verrebbero quindi eseguite ad ogni scansione. Se invece devi effettuare i calcoli solo in determinate situazioni, devi usare un merker adatto allo scopo.

Link al commento
Condividi su altri siti

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