Vai al contenuto
PLC Forum


Istruzione Ctrl-Hsc


roberto8303

Messaggi consigliati

ok ho capito l errore che commetto quando richiamo l interrupt e dentro lo stesso ho lo stesso input i0.4, infatti non puo funzionare e ne deve funzionare cosi. Però per esempio pratico,anche se non ha senso ma solo per capire bene il concetto mettiamo che devo far partire una ventola di raffreddamento ogni volta che chiudo un contatto.Metto il temporizzatore e la bobina che mi attiva il ventilatore in un interrupt, nel main ho il contatto che mi attiva e fa la chiamata all interrupt. Quindi appena chiudo il contatto il programma si interrompe in quel punto e mi va a svolgere l interrupt, ma se io stacco il contatto nel main mentre il temporizzatore sta contando l interrupt continua ad essere eseguito, e fin qui va bene. Poi però se ricollego il contatto nel main e richiamo l interrupt esso deve ripetere la funzione oppure visto che l ha eseguita gia una volta poi non posso piu richiamarla?

Punto due, per quanto riguarda il contatore veloce:

ho letto velocemente il messaggio tuo Batta e quindi mi è sembrato di capire che sto sbagliando a sincronizzare mo.o con 1 e -1 tanto da creare confusione nel box, ma c è una cosa che non riesco a capire:

per prova ho messo il box hsc nel main, ma quando ho configurato l hsc gli ho assegnato contatore monofase con direzione di conteggio in avanti. Poi nel box ho questo pulsante i0.4 che chiudendolo mi fa la richiesta su dir della nuova direzione di conteggio, ed il riferimento in new dir è -1 direzione contraria. Facendo questo il contatore funziona bene ed inverte il senso di conteggio, ma quello che non sono riuscito a capire è:

perche quando poi riapro i0.4 e quindi annullo la richiesta di una nuova direzione di conteggio -1 il contatore continua a decrementare e non torna a contare come l ho creato all inizio cioe direzione di conteggio avanti??

Da questo è nato poi il fatto di mettere 1 ed -1 in un byte di appoggio cosi da passare sempre un numero preciso al box di hsc e comunque devo riprovare appena posso tenendo in considerazioni gli errori che tu Batta mi hai fatto notare.

Link al commento
Condividi su altri siti


Metto il temporizzatore e la bobina che mi attiva il ventilatore in un interrupt, nel main ho il contatto che mi attiva e fa la chiamata all interrupt. Quindi appena chiudo il contatto il programma si interrompe in quel punto e mi va a svolgere l interrupt, ma se io stacco il contatto nel main mentre il temporizzatore sta contando l interrupt continua ad essere eseguito, e fin qui va bene

No, non ci siamo proprio.

Tanto per cominciare, è proprio sbagliato, come concetto, come esempio di utilizzo di un interrupt, quello del ventilatore da avviare con ritardo.

L'interrupt ha proprio lo scopo di compiere un'azione immediatamente, senza aspettare nemmeno il tempo di una scansione perché già quello è considerato un ritardo non accettabile.

Poi tu non devi scrivere assolutamente nulla nel main per richiamare la routine di interrupt. L'evento che scatena l'interrupt viene deciso nella configurazione hardware. Nel main fai le normali chiamate ad altri blocchi di programma quali FB e FC, non agli interrupt. E questi blocchi di programma FB e FC fanno sempre parte del programma principale.

A me pare che tu stia confondendo un interrupt con un blocco FC o FB. Sono due cose completamente diverse.

Poi un interrupt scatenato, supponiamo, dal fronte di salita di un ingresso, viene eseguito UNA SOLA VOLTA quando viene rilevato il fronte di salita (e ripeto, senza scrivere assolutamente nulla nel main).

Per avere un'altra esecuzione si deve rilevare un altro fronte di salita.

Se l'interrupt venisse eseguito continuamente con l'ingresso alto, sarebbe una catastrofe. Significherebbe, infatti, che non verrebbero più elaborate tutte le istruzione scritte nel programma principale.

perche quando poi riapro i0.4 e quindi annullo la richiesta di una nuova direzione di conteggio -1 il contatore continua a decrementare e non torna a contare come l ho creato all inizio cioe direzione di conteggio avanti??

Quando tu scrivi -1 in NEW_DIR e dai ordine di eseguire il comando impostando DIR = TRUE, il comando viene eseguito. Questo comando NON deve essere mantenuto, ma DEVE essere dato UNA SOLA VOLTA.

A questo punto il contatore conta indietro e continuerà a contare indietro fino a quando non riceverà un nuovo ordine che gli dirà di contare avanti.

Non basta togliere il comando di contare indietro perché torni a contare avanti.

E meno male che è così.

Il box CTRL_HSC permette di dare diversi comandi al contatore veloce.

Tu dai un comando, e viene eseguito.

Poi dai un altro comando, e viene eseguito

Dai un comando ancora diverso, e viene eseguito.

Il contatore veloce non è come i figli, che devi continuare a ripetere sempre le stesse cose e non ti ascoltano mai.

Al contatore veloce basta dare un comando una sola volta e lui lo esegue immediatamente.

Link al commento
Condividi su altri siti

buongiorno, grazie per la pazienza che mi stai dedicando,ora mi è molto piu chiaro, nel frattempo che tu scrivevi però ho fatto questa prova per il contatore e funziona, ti allego la foto non si vede tanto bene quindi spiego cosa ho fatto:

http://imageshack.us/content_round.php?page=done&l=img803/6053/funziona.jpg

su dir ho messo un merker m0.0 , su new dir ho messo mw1, poi nel segmento n°due alla chiusura di i0.4:p carico -1 in mw1 e dopo 10ms setto il merker m0.0 a 1. nel segmento 3 che non si vede in foto ho messo il contatto negato di i0.4:p e carico 1 in new dir, dopo 10 ms resetto m0.0. Dimmi se puo funzionare cosi,o ci sono controindicazioni.

l' ho fatto per capire come funziona il box, e ho capito "provando" cio che tu mi stai cercando di far capire con piu di un messaggio!! e cioè che la lettura degli ingressi fisici non avviene nello stesso modo come la lettura del programma, questo a dir la verità lo sapevo :smile: , ma volevo capire nel caso del box ctrl-hsc perche non funzionava semplicemente chiudendo e aprendo un contatto, visto che in molte applicazioni capita di azzerare o invertire il conteggio con un semplice micro.

Link al commento
Condividi su altri siti

Questo comando NON deve essere mantenuto, ma DEVE essere dato UNA SOLA VOLTA

io invece sto tenendo il merker sempre chiuso quando devo andare indietro e lo riapro quando conta avanti e funziona... :whistling:

Link al commento
Condividi su altri siti

Giuseppe Signorella

L' immagine che hai inserita è davvero pessima, da li si capisce poco, la prossima volta usa il tasto della tastiera print, che ti stampa la finestra del desktop, oppure usa uno dei tanti programmi free che trovi in rete per catturare le schermate del desktop.

Dall'immagine che hai postato, una cosa che mi sembra di percepire, che tu l'istruzione di cambio direzione la esegui dopo aver eseguito il blocco CTRL_HSC. l'istruzione con cui setti la nuova direzione, la devi eseguire prima del blocco CTRL_HSC.

ma volevo capire nel caso del box ctrl-hsc perche non funzionava semplicemente chiudendo e aprendo un contatto, visto che in molte applicazioni capita di azzerare o invertire il conteggio con un semplice micro.

Normalmente dovrebbe bastare un semplice impulso per cambiare la direzione e fargliela mantenere fino al successivo impulso.

Batta ti ha chiaramente spiegato come fare il cambio direzione.

Comunque sia, sempre guardando il codice da te scritto, otterrai l'inversione del conteggio quando M0.0 = TRUE; poi non cambierai mai più nulla.

Quando infatti scrivi 1 in NEW_DIR per far riprendere il conteggio in avanti, M0.0 (collegato a DIR) è FALSE, ovvero non stai dando nessun comando di direzione e, quindi, il contatore continuerà imperterrito a contare indietro (ultimo comando ricevuto).

Se tu ti costruisci un'istruzione flip flop (meglio conosciuta in gergo come relè passo passo) o usi un set reset e ne discrimini il fronte di salita, e/o discesa, ed in funzione dello stato di questa istruzione muovi i tuoi valori in DIR e NEW_DIR , otterrai che ad ogni pressione del tuo ingresso verrà invertita la rotazione del conteggio.

Tali istruzioni devono essere però eseguite prima del blocco CTRL_HSC..

CIao

Link al commento
Condividi su altri siti

no Giuseppe ho provato anche a mettere l istruzione prima ma niente non va nemmeno cosi!!!

Allora riassumendo in poche parole, quello che ho visto io è che: Il contatore ha bisogno di un ingresso i0.4 per la chiamata della nuova direzione. Il riferimento della nuova direzione lo trova su new dir. Ora quello che succede è.

Se al box passo il segnale i0.4 true e nello stesso tempo il riferimento -1 per la direzione esso non funziona. Se invece faccio in modo che nel box ci sia prima il riferimento di direzione -1 e dopo (nel mio caso 10ms) chiudo i0.4 esso funziona.

Potrei provare ad abbassare anche il tempo a 5ms ma non l ho fatta questa prova. Anche io sono daccordo con te e Batta sul fatto che semplicemente leggendo il fronte di salita di un merker o io.4:p dovrebbe cambiare il senso e questo lo fa, ma poi per farlo ricontare come prima propio non se ne parla!! :angry:

Link al commento
Condividi su altri siti

Giuseppe Signorella

Il concetto deve essere:

Prima decido la direzione da eseguire, poi trasferisco i parametri nelle variabili che il blocco leggerà e poi lo eseguo.

Se eseguo prima il blocco e poi trasferisco i parametri della nuova direzione è una logica contorta. Non credi?

Il PLC esegue le istruzioni con la sequenza in cui tu gli dici di eseguile.

Tu prima trasferisci la nuova direzione (-1 oppure 1) nel blocco al parametro DIR. Dopo che hai trasferito la direzione la esegui attivando per un istante NEW_DIR.

Da questo momento in poi puoi attivare NEW_DIR tutte le volte che vuoi, ma la direzione non cambierà mai più finchè non trasferisci prima una nuova direzione in DIR.

(nel mio caso 10ms).............Potrei provare ad abbassare anche il tempo a 5ms

Questa non l'ho compresa.

Non hai bisogno di ritardi per far eseguire l'istruzione, tutt'altro.

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

Se al box passo il segnale i0.4 true e nello stesso tempo il riferimento -1 per la direzione esso non funziona. Se invece faccio in modo che nel box ci sia prima il riferimento di direzione -1 e dopo (nel mio caso 10ms) chiudo i0.4 esso funziona.

Come hai fatto tu funzionicchia, ma è sbagliato.

Quando alzi I0.4 per far contare indietro, il comando viene preso solo dopo 10 ms.

Quando abbassi I0.4 per far contare avanti, il conteggio viene invertito solo perché togli il comando con 10 ms di ritardo e, quindi, per 10 ms rimane attivo.

Il fatto poi di leggere lo stato dell'ingresso con la sintassi I0.4:P per interrogare il valore reale e non l'immagine degli ingressi, serve solo se tale istruzione la programmi in un interrupt.

Se usi CTRL_HSC nel programma normale, è meglio che interroghi I0.4 nel modo tradizionale.

Comunque, tu stai sempre usando CTRL_HSC in modo improprio.

L'uso normale prevede che ogni comando rimanga attivo solo per il tempo strettamente necessario (nel nostro caso, una sola volta).

Come hai fatto tu, che manteni il comando sempre attivo, nelò caso specifico non comporta problemi gravi, ma solo perché il solo comando che stai utilizzando è l'inversione del conteggio.

Se tu avessi bisogno di usare CTRL_HSC per impartire anche altri comandi, capiresti perché tenere un comando sempre attivo non è la strategia giusta.

Eppure, non mi sembra tanto difficile.

Supponiamo di voler invertire il conteggio sul fronte di salita di I0.4, e di voler far tornate il conteggio in avanti sul fronte di discesa.

Basta caricare -1 in una variabile sul fronte di salita di I0.4 e caricare +1 nella stessa variabile sul fronte di discesa di I0.4. Questa variabile è da collegare all'ingresso NEW_DIR del box CTRL_HSC.

Con l'OR di fronte salita e fronte di discesa attivi una variabile booleana da usare per il comando. Questa variabile la puoi usare per attivare il box CTRL_HSC (ingresso EN) eventualmente in OR con eventuali altri comandi, e la colleghi all'ingresso DIR.

Normalmente non fornisco soluzioni complete, perché penso sia meglio dare solo le indicazioni necessarie per poter arrivare alla soluzione.

Ma, oramai, mi hai preso per sfinimento e allego un semplice esempio.

N.B.: questo esempio NON va bene se le istruzioni sono inserite in un OB di interrupt.

esempioctrlhsc.jpg

Uploaded with ImageShack.us

Link al commento
Condividi su altri siti

Ma, oramai, mi hai preso per sfinimento e allego un semplice esempio

ahahaha hai ragione ma non è che io ce l abbia con te e l ho fatto per avere la pappa bella pronta, sono molto analitico e volevo solo capire il comportamento del processo come l avevo creato...comunque il tuo esempio è molto semplice e funzionale, e a volte un esempio è molto piu importante di lunghi messaggi!!! ma questo evidentemente qualcuno dovrebbe dirlo a chi scrive il manuale della siemens....

Modificato: da roberto8303
Link al commento
Condividi su altri siti

ahahaha hai ragione ma non è che io ce l abbia con te e l ho fatto per avere la pappa bella pronta

Tranquillo, la mia era solo una battuta :smile:

ma questo evidentemente qualcuno dovrebbe dirlo a chi scrive il manuale della siemens....

Sul manuale Siemens ci sono tutte le informazioni necessarie.

Link al commento
Condividi su altri siti

ci sono le informazioni necessarie per chi è esperto come te, ma per un autodidatta come me è non è che siano tanto sufficienti, sempre confrontanto con la serie 200, li infatti di esempi ci sono per ogni funzione...comunque avere un forum di questo tipo e persone come te preparate e disponibili è una fortuna :smile:

Link al commento
Condividi su altri siti

ragazzi ho bisogno ancora di voi... :smile: ho collegato il pannello ktp 400 al plc, e ho creato un campo di uscita per il valore di id1000 per visualizzare sul pannello il valore del conteggio veloce hsc, volevo sapere, c è un modo per velocizzare la visualizzazione di id1000 sul pannello?? mi spiego meglio, quando ruoto l encoder in maniera piu veloce vedo sul pannello che il valore è un po lento ad aggiornarsi...invece on line dal pc è velocissimo!!

posso aumentare la velocita di comunicazione tra il plc e l hmi?? li ho collegati con il cavo ethernet e indirizzi 192-168-0-1 ed xxxxx 0-2.

Sul hmi ho visto che si puo impostare il baudrate ma sul plc??

Altra domanda, il cavo in dotazione ethernet è un cavo dritto o incrociato? ne vorrei comprare un altro per caricare i programmi, mi è scomodo con un cavo solo, collegare al plc poi staccarlo e collegarlo all hmi e poi ristaccarlo e collegare i dispositivi insieme, almeno per adesso che sto facendo delle esercitazioni...

Modificato: da roberto8303
Link al commento
Condividi su altri siti

vedo sul pannello che il valore è un po lento ad aggiornarsi...invece on line dal pc è velocissimo

Semplicissimo: nelle proprietà della variabile, scegli "Impostazioni" e imposti il ciclo di acquisizione. Di default è 1". Puoi scendere finio a 100 ms. Più veloce non avrebbe senso.

posso aumentare la velocita di comunicazione tra il plc e l hmi?? li ho collegati con il cavo ethernet e indirizzi 192-168-0-1 ed xxxxx 0-2.

Sul hmi ho visto che si puo impostare il baudrate ma sul plc??

Cosa vorresti di più veloce di una comunicazione in Ethernet?

La lentezza di cui parlavi non è un limite della comunicazione, ma solo una impostazione del pannello operatore, come spiegato sopra.

Non so poi dove si possa impostare, sull'HMI, il baudrate per una comunicazione TCP/IP.

Altra domanda, il cavo in dotazione ethernet è un cavo dritto o incrociato? ne vorrei comprare un altro per caricare i programmi, mi è scomodo con un cavo solo, collegare al plc poi staccarlo e collegarlo all hmi e poi ristaccarlo e collegare i dispositivi insieme, almeno per adesso che sto facendo delle esercitazioni...

La porta del PLC (e credo anche quella dell'HMI) ha la selezione automatica. Puoi quindi usare sia un cavo diretto, sia uno incrociato.

L'unico modo però per permettere contemporaneamente le connessioni PC-PLC, PC-HMI, PLC-HMI, è usare uno switch.

Uno switch 10-100Mbit con 4-5 porte e un po' di cavi Ethernet costano 20-30 euro.

Link al commento
Condividi su altri siti

Semplicissimo: nelle proprietà della variabile, scegli "Impostazioni" e imposti il ciclo di acquisizione. Di default è 1". Puoi scendere finio a 100 ms

bUON ANNO a tutti!! grazie :thumb_yello: ho un altro problema, perche sul pannello hmi dove visualizzo il numero real della variabile md12 , mi esce un quadrato al posto della virgola??? :blink: ho messo nella configurazione del campoI/O visualizza la variabile con 99,999 modo uscita. I numeri li vedo ma i decimali sono separati graficamente da un quadrato invece che dalla virgola!! perche succede questo??

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