Vai al contenuto
PLC Forum


Funzione MOVE in step 7v5.5 e 13


panx1974

Messaggi consigliati

Ciao a tutti.

Premetto che sto imparando ad usare Step7 per conto mio ed ho iniziato da pochissimo.

Ho fatto automazione per anni ma con controllori completamente diversi da quelli elencati da questo forum e quindi certi blocchi logici per me sono nuovi.

Sono del parere che per imparare a programmare bisogna esercitarsi su problemi di automazione reali e come primo "esercizio" ho scelto di fare blocco logico che potesse gestire l'alternanza di tre pompe. Due pompe lavorano in contemporanea ed una rimane ferma, al successivo riavvio ripartono le due pompe con minor ore di lavoro.

Vi suona famigliare? infatti c'è un altro post in questo forum del 2015 e che ho già letto. :)

Come aveva scritto un altro utente conto i secondi per memorizzare le ore di funzionamento delle singole pompe per poi all'accensione trovare la pompa con il maggior numero di ore e far partire le altre due.

 

Inizialmente il progetto lo avevo fatto per un s7-300 con step 7v5.5 con questa logica (linguaggio FUP).

Un clock generato dal merker di clock con periodo di 1 secondo (0,5s ON/0,5s OFF) in AND con un ingresso di start pompa. 

L'uscita dell'AND abilita unblocco MOVE che copia un merker a 16bit (DINT) della memoria a ritenzione in un merker d'appoggio.

Quando il clock si trova nella semionda a 0 il blocco MOVE viene disabilitato e la sua uscita ENO, tramite una porta NOT, abilita un blocco ADD che fa la somma tra il

merker d'appoggio ed un valore d'incremento (1) il risultato viene posto nel merker a ritenzione del conteggio ore della pompa.

 

Nel frattempo passo al TIA portal 13 e decido di rifare lo stesso esercizio per un S7-1500.

Riscrivo lo stesso programma con la stessa logica e....pufff! il blocco MOVE non si comporta nella stessa maniera!

Possibile?

in pratica:

nella versione 5 il blocco MOVE per un s7-300 quando è abilitato copia nell'uscita il suo ingresso e quando è disabilitato mantiene in uscita l'ultimo valore.

Nella versione s7-1500 il blocco MOVE quando abilitato copia il suo ingresso sull'uscita ma quando è disabilitato pone l'uscita a 0.

 

Ho sbagliato io qualche cosa o esistono anche altri blocchi che hanno comportamenti diversi a seconda dell'hardware o programma di sviluppo?

 

Seconda cosa: il blocco -|P|- che dovrebbe rivelare il fronte di salita di un bit come funziona?

Il libro che sto usando dice che l'uscita viene posta ad 1 quando viene rivelato un cambio di stato da 0 a 1 e che questa uscita rimane ad 1 per solo 1 ciclo di di esecuzione del programma, invece (almeno in simulazione), mi rimane ad 1 finchè il suo ingresso rimane alto.

 

comunque per risolvere il problema del blocco MOVE e di questa rilevazione del cambio di fronte mi è toccato scrivere una piccola funzione in SCL (altro linguaggio che non conosco ma più consono visto il mio background).

 

Grazie in anticipo per le risposte e chiedo venia agli amministratori se ho sbagliato posto dove scrivere.

 

 

Link al commento
Condividi su altri siti


Ciao,

comincio con una piccola correzione: byte=8 bit, Int=16 bit e Dint=32 bit.

L'istruzione MOVE esegue esattamente quello che hai scritto: copia il valore della variabile in ingresso su quella in uscita e, almeno che io sappia, è rimasta esattamente la stessa, con qualche miglioria (se clicchi sull'asterisco, puoi aggiungere altre variabili di uscita). Se la variabile mantiene lo stesso valore con l'istruzione MOVE non abilitata, vuol dire semplicemente che in nessun altro ramo del programma quella variabile è stata modificata; se, invece, te la ritrovi a zero, sempre con l'istruzione MOVE non abilitata, da qualche altra parte esiste un'altra MOVE che la imposta a zero. Non c'è scampo: se l'istruzione non è abilitata, semplicemente non viene eseguita.

Infine, l'istruzione P necessita di una variabile Bool ausiliaria (è quella che si mette sotto l'istruzione) per salvare lo stato di quella principale (quella che si mette sopra l'istruzione), in modo da attivare il suo RLO in uscita solo per una scansione del PLC: se guardi quella, risulterà una copia della variabile principale, se, invece, guardi la sua uscita, vedrai che è attiva solo per una scansione.

Link al commento
Condividi su altri siti

Ciao Drugo66.

Ho sbagliato a scrivere. Intendevo 32bit per un DINT.

Ho riguardato il codice ed ho visto che il registro d'appoggio era salvato in una locazione di memoria temporanea (TEMP) del blocco. Quindi ogni volta che veniva completato il ciclo macchina e si rientrava nel blocco la locazione veniva posta a zero. Mettendo il registro d'appoggio in una allocazione di memoria STATIC del blocco il tutto funziona come di dovere.

 

Distrazione da pivello!

 

Grazie anche x il resto.

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