Vai al contenuto
PLC Forum


Istruzione Ctrl-Hsc


roberto8303

Messaggi consigliati

ragazzi qualcuno oltre il manuale siemens... :thumbdown: mi può spiegare come funziona il box dei contatori veloci?? Ho provato a configurare hsc1 come contatore monofase, inizio conteggio all indietro, poi il cambio direzione da programma utente.

Il box ctrl hsc l ho messo in un un nuovo blocco organizzativo, interrupt hardware, voglio attivare il cambio direzione semplicemente chiudendo un ingresso i0.4 e appunto ho scritto sul blocco dir=i0.4 e in NEWdir=1 ma non funziona...id1000 mi segna sempre indietro!

Non è che per caso devo richiamare il box con una funziona specifica dal main ob1??

Link al commento
Condividi su altri siti


Il box ctrl hsc l ho messo in un un nuovo blocco organizzativo, interrupt hardware

Ma qual'è l'evento che scatena l'interrupt?

Cosa leggi in STATUS?

Link al commento
Condividi su altri siti

mmm aspetta non ti seguo, ora ho provato a caricare il box ctrl-hsc direttamente sul main ob1, sullo status ho scritto l indirizzo id10, ho settato un contatore hsc1 modo monofase e ingressi io.0 e io.1.

Sulla tabella on line leggo il valore di ID1000 che incrementa ruotando a dx e viceversa, interrogo la variabiel id10 assegnata a status e mi esce il cerchio di divieto e dice impossibile visualizzare id10.

Comunque non voglio farti perdere tempo a capire cosa ho fatto perche quasi sicuramente è sbagliato :( ,ti ringrazio per la disponibilità,e cerco di capire quello che vuoi dirmi, mettendo il box crl-hsc in un blocco organizzativo hardware interrupt,come dice il manuale, devo poi richiamarlo dal main ob1? e come fare per far funzionare i vari parametri del blocco ctrl-hsc, cioe dir,cv,rv ecc ecc, ho provato a settare dei merker a 1 ma non succede nulla :wacko:

Link al commento
Condividi su altri siti

Un OB di interrupt viene eseguito solo quando si verifica un evento di interrupt.

Se non si verifica nessun di evento di interrupt che mandi in esecuzione l'OB con la funzione CTRL_HSC, questa non verrà mai elaborata.

Il motivo per cui si usano gli interrupt è per non avere ritardi sull'esecuzione di istruzioni che devono essere veloci.

Programmando la funzione CTRL_HSC in OB1 (o in altro blocco richiamato ciclicamente in OB1), l'istruzione viene elaborata con il ritardo dovuto al tempo di scansione del PLC.

Se vuoi usare l'ingresso I0.4 per invertire il conteggio, potresti confugurare I0.4 come ingresso di interrupt (su fronte di salita e/o discesa).

A questo punto, un cambio di stato di I0.4 scatenerebbe un interrupt che manderebbe immediatamente in esecuzione il relativo OB.

In questo OB dovresti inserire alcune istruzioni per essere sicuro che l'interrupt sia realmente quello relativo al cambio di stato di I0.4 e, in caso positivo, elaborare l'istruzione CTRL_HSC.

Se il tempo di scansione non rappresenta per te un problema, allora puoi richiamare CTRL_HSC direttamente in OB1.

interrogo la variabiel id10 assegnata a status

Qui commetti due errori:

1) a STATUS devi collegare una variabile a 16 bit, e non a 32 bit (es. MWxxx)

2) non ha senso collegare a STATUS degli ingressi. Usa una MW o una word di un DB.

Link al commento
Condividi su altri siti

non riesco a capire, mi è perfettamente chiaro il fatto di richiamare tramite un evento di interrupt l' ob dove sta ctrl-hsc, però sto provando adesso a fare andare ctrl-hsc dal main OB1, e quando vado in play online vedo il ramo che si colora di verde e alimenta sempre il box ctrlhsc, quindi perche se ho messo i0.4 su dir e -1 su new dir chiudendo i0.4 non cambia il senso di direzione? ho anche configurato sul hc1 cambio direzione da segnale interno cioe da programma...non capisco cosa sto sbagliando...

Link al commento
Condividi su altri siti

Giuseppe Signorella

Non ho fatto la prova in quanto ho sempre utilizzato gli ingressi veloci con encoder a due canali, quindi il cambio di direzione l'ho sempre fatto con l'encoder, ma se ricordo bene, nella configurazione HW degli ingressi veloci, c'è la possibilità di settare il cambio di direzione del contatore monofase "con controllo esterno o interno della direzione".

Fai una prova in tutti e due i modi.

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

Ho provato a configurare hsc1 come contatore monofase, inizio conteggio all indietro, poi il cambio direzione da programma utente

Sulla tabella on line leggo il valore di ID1000 che incrementa ruotando a dx e viceversa

Prova a ripartire dall'inizio, spiegando nei dettagli cosa accade.

Te lo chiedo perché le tue affermazioni (sopraccitate) sono incoerenti.

Nella prima, dici di aver configurato il contatore veloce come monofase e direzione da programma utente (e sarebbe corretto), ma poi dici (o almeno io capisco così) che il valore di conteggio incrementa ruotando a destra e decrementa ruotando a sinistra.

Se è così, significa che hai configurato e collegato un encoder a due canali. In questo caso, il comando DIR (come specificato nel manuale) non ha alcun effetto.

Link al commento
Condividi su altri siti

Giuseppe Signorella
Citazione

Sulla tabella on line leggo il valore di ID1000 che incrementa ruotando a dx e viceversa

Perdonami Batta, ma a me sembra chiaro. Da ciò che è scritto io comprendo che il conteggio incrementa sempre indifferentemente dal senso di rotazione.

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

scusate se ho creato confusione il contatore incrementa sempre in positivo sia se giro a dx che a sx,ieri non ho fatto in tempo ho visto sul manuale la funzione attach e volevo studiarmela non e' che serve proprio a far partire il contatore veloce? poi nelle prove ho notato che quando seleziono il tipo di contatore nella tabella vengono definiti gli ingressi sia di conteggio che di reset, e in quel caso funziona ogni giro encoder si azzera il conteggio se stacco il filo del canale z e lo chiudo con un ponticello si azzera il conteggio quindi questo mi fa pensare che sicuramente sbaglio nel programma.Oggi rifaccio tutto daccapo e vi riporto precisamente tutto cio che succede spero di venirne a capo ci sto perdendo troppo tempo:(

Link al commento
Condividi su altri siti

Cosa leggi in STATUS?

Tiro ad indovinare: 8A01 Hex, che significa: "L'identificatore dell'HSC non indirizza un HSC".

Se ho indovinato, devi collegare al parametro HSC della funzione CTRL_HSC l'identificatore hardware dell'HSC.

Per fare questo, puoi procedere in due modi:

1) nella configurazione hardware dell'HSC, in fondo, trovi il valore "Hardware Identifier" assegnato a questo contatore. Ti basta riportare questo numero tenendo solo presente che nella configurazione hardware viene indicato in formato decimale, mentre alla funzione CTRL_HSC devi mettere il valore in esadecimale. Di default, dovresti trovere un Hardware Identifier = 258 (0102 Hex).

2) scrivi direttamente il nome assegnato al contatore veloce (HSC_1 se non l'ai modificato in configurazione hardware)

Tutto questo, come ho detto, tirando ad indovinare.

Sapere cosa ti dava in STATUS sarebbe stato molto utile.

Quando qualcosa non funziona, il primo passo per capire cosa non va è sempre controllare le variabili di stato e cercare sul manuale il significato del codice dell'eventuale errore.

Io ho provato ed ha funzionato tutto al primo colpo.

Link al commento
Condividi su altri siti

batta mi esce l errore 80A1 che identifica un errore di comunicazione, il collegamento specificato non è ancora stabilito, il collegamento specificato viene concluso e non puo essere utilizzato per eseguire un ordine di ricezione, l interfaccia sta ricevendo nuovi parametri.

questo dopo che come mi hai consigliato tu ho visto il mio Hardware Identifier che è uguale a 263 l ho trasformato in esadecimale=107 e ho scritto 107 direttamente sul blocco hsc quindi ora sul main ho il blocco ctrl-hsc con su scritto %DB1 "107" esso è collegato direttamente sul ramo principale senza nessun contatto. Su dir ho scritto i0.4 in modo che se diventa true imposta new dir a -1 quindi decrementa. tutto cio però non mi funziona ancora :toobad:

Link al commento
Condividi su altri siti

Giuseppe Signorella
Tiro ad indovinare: 8A01 Hex, che significa: "L'identificatore dell'HSC non indirizza un HSC".

batta mi esce l errore 80A1

Di un pò,Batta dove hai acquistato la sfera di cristallo? Ne vorrei comperare una anche io. :roflmao: :roflmao: :roflmao:

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

Giuseppe Signorella
in esadecimale=107 e ho scritto 107 direttamente sul blocco hs

Per far comprendere al PLC (TIA) che il valore da te espresso è in formato esadecimale, devi anteporre prima "16#" e poi il valore.

Se vuoi semplificare la procedura, fai doppio clic sulla voce HSC del blocco CTRL_HSC ti si apre un menù a tendina e da li selezioni l' hardware HSC utilizzato.

ciao

Link al commento
Condividi su altri siti

Ok meno male che qualche sfera di cristallo si trova ancora!!! :P aggiorno la situazione, ho messo su hsc cioe il primo parametro del blocco il valore esadecimale del contatore configurato all inizio. Ho fatto questo in due modi, configurando ctrl-hsc in un hardware interrupt come dice il manuale,nel main non ho messo nulla, avvio in play e non vedo nessun flusso di corrente verso il box attivo, e su status nulla.

Allora inserisco il box ctrl-hsc nel main ,do il riferimento in esadecimale ad hsc, metto l ingresso i0.4 per cambiare direzione scrivo in status iW10 e play: questa volta mi esce l errore 80D0 che corrisponde: è stata ricevuta una nuova richiesta mentre il trasmettitore era attivo. Quando chiudo i0.4 il valore nel box diventa true ma il contatore non decrementa!!!

Link al commento
Condividi su altri siti

Correggo alcune mie imprecisioni del precedente post.

Il codice di errore che volevo indicare effettivamente non era 8A01 ma 80A1.

Per indovinare non serviva la sfera di cristallo, ma bastava immaginare che non fosse stato impostato correttamente il parametro HSC.

Del resto, la funzione è così semplice che, per esclusione, non rimaneva nient'altro.

Riguardo poi l'indirizzo da inserire, ho sbagliato a dire che si deve impostare in esadecimale. In effetti, si può impostare sia in formato decimale che esadecimale.

Per scrivere in esadecimale però, come ha già detto Giuseppe, la sintassi da usare è W#16#107. Oppure scrivi 263. O, ancora, scrivi il nome assegnato al contatore.

Link al commento
Condividi su altri siti

risoltooo avevo preso il numero del contatore hsc2!!! ero sceso troppo con il mouse certo che avere mille finestre aperte con il tia si crea confusione!! comunque batta avevi ragione era proprio l indirizzo del hsc che deve essere riportato!!

Adesso fatto questo quando chiudo i0.4 il contatore decrementa, quando riapro i0.4 incrementa, ma quando richiudo i0.4 continua ad incrementare perche??!! quindi ho pensato di appoggiare in un byte ib10 il valore di new dir cioe i0.4 chiuso = -1 e i0.4 aperto = 1, provo vedo i valori in new dir cambiare cioe valori in esadecimale 01 ed fffff...ma il contatore comunque in un solo senso che succede ora?? un altro mistero... :lol:

Modificato: da roberto8303
Link al commento
Condividi su altri siti

configurando ctrl-hsc in un hardware interrupt come dice il manuale,nel main non ho messo nulla, avvio in play e non vedo nessun flusso di corrente verso il box attivo, e su status nulla.

Ci sarebbe da meravigliarsi del contrario.

Il blocco OBxx di interrupt nel quale hai richiamato la funzione CTRL_HSC viene elaborato SOLO quando un evento scatena l'interrupt.

Quindi, normalmente non viene elaborato. Ed è proprio questo uno dei vantaggi di programmare CTRL_HSC in un blocco di interrupt: elaboro l'istruzione solo quando ne ho bisogno.

Il richiamo di CTRL_HSC in un OB di interrupt quindi è corretto, ma devi configurare l'evento che lancia questo OB.

Per esempio, se vuoi fare l'inversione di conteggio quando l'ingresso I0.4 passa da 0 a 1, ti basta aprire la configurazione hardware, selezionare "Ingressi digitali --> Canale 4", mettere il segno di spunta su "Attiva rilevazione del fronte di salita", selezionare l'OB di interrupt (o crearne uno nuovo).

Per quanto il TIA Portal sia strapieno di difetti, questa parte mi pare molto semplice ed intuitiva.

Allora inserisco il box ctrl-hsc nel main ,do il riferimento in esadecimale ad hsc, metto l ingresso i0.4 per cambiare direzione scrivo in status iW10 e play: questa volta mi esce l errore 80D0 che corrisponde: è stata ricevuta una nuova richiesta mentre il trasmettitore era attivo.

Qui commetti una serie di errori:

1) Inserire il richiamo di CTRL_HSC nel main va bene per fare prove, ma non è la soluzione migliore per un utilizzo reale. O, almeno, si dovrebbe avere l'accortezza di attivare il comando una sola volta quando serve, e non ciclicamente, ad ogni scansione.

2) E' sbagliato, come ti ho già detto, scrivere STATUS in una IW. STATUS è un parametro in uscita dalla funzione, e tu scrivi questo parametro in una variabile di ingressi. Cerco di spiegarmi ancora meglio: non è, come dici tu, che "scrivi in STATUS IW10" ma è proprio il contrario, ovvero scrivi il valore di STATUS in IW10. Ma gli ingressi (e IW10 comprende gli ingressi da I10.0 a I11.7) nel programma dovrebbero essere solo interrogati, non scritti. Al parametro STATUS devi collegare una MW o una variabile di un DB.

3) Il codice di errore 80D0 non è relativo alla funzione CTRL_HXC, ma alle funzioni SEND_PTP e PARM_MOD. Probabilmente leggi un valore errato proprio perché lo scrivi in una variabile di ingressi. I codici di errore relativi alla funzione CTRL_HSC sono: 80A1, 80B1, 80B2, 80B3, 80B4, 80C0 (vedi pag. 333 del manuale "SIMATIC - S7 Sistema di automazione S7-1200" o, ancora più semplice, seleziona il box CTRL_HSC e premi F1).

Link al commento
Condividi su altri siti

Adesso fatto questo quando chiudo i0.4 il contatore decrementa, quando riapro i0.4 incrementa, ma quando richiudo i0.4 continua ad incrementare perche??!! quindi ho pensato di appoggiare in un byte ib10 il valore di new dir cioe i0.4 chiuso = -1 e i0.4 aperto = 1, provo vedo i valori in new dir cambiare cioe valori in esadecimale 01 ed fffff...ma il contatore comunque in un solo senso che succede ora?? un altro mistero...

Senza vedere il codice, penso sia dura capire cosa non va. Qui sì che ci vorrebbe la sfera di cristallo.

Prova ad allegare un'immagine del codice.

E smettila di usare gli ingressi come fossero memorie interne.

IB10 è un byte di ingressi!!!!!!!!!!! Devi usare i merker (es. MB10) o variabili di un DB.

Link al commento
Condividi su altri siti

E smettila di usare gli ingressi come fossero memorie interne.

IB10 è un byte di ingressi!!!!!!!!!!! Devi usare i merker (es. MB10) o variabili di un DB

ahh ho capito!!! hai ragione scusa non faccio caso a queste cose che sono le basi!!!

comunque ora ho aggioranto le cose ma nemmeno funziona!! eppure è strano perche ora il box va tutto bene, true ha il valore -1 e false =1 ma il contatore avanza solo di un senso inesorabilmente!!! :wacko:

ecco le foto del box prima e dopo apertura e chiusura i0.4

http://imageshack.us/photo/my-images/850/88388727.jpg/

http://imageshack.us/photo/my-images/801/82633862.jpg/

Link al commento
Condividi su altri siti

Giuseppe Signorella
Correggo alcune mie imprecisioni del precedente post.

Il codice di errore che volevo indicare effettivamente non era 8A01 ma 80A1.

Si era compreso benissimo che era stato un semplice errore di (battitura)

certo che avere mille finestre aperte con il tia si crea confusione!!

Non mi provocare Batta................... :worthy:

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

Buongiorno e buon Natale,rispondo velocemente perche prima di andare avanti devo capire bene le cose principali in base a questo:

Il richiamo di CTRL_HSC in un OB di interrupt quindi è corretto, ma devi configurare l'evento che lancia questo OB.

Per esempio, se vuoi fare l'inversione di conteggio quando l'ingresso I0.4 passa da 0 a 1, ti basta aprire la configurazione hardware, selezionare "Ingressi digitali --> Canale 4", m...

allora, lasciando perdere un attimo il contatore veloce, sono andato a configurare, il canale i0.4 con il fronte di salita per richiamare l hardware interrupt ob40, nel main ho i0.4 che mi attiva anche un merker m0.0. Poi nel ob40 ho messo al primo segmento una sola bobina q0.5 che dovrebbe attivarsi quando richiamo l interrupt, perche non si attiva??

seconda domanda: perche sul rilevamento del fronte di salita di uno degli ingressi/canali, posso legare solo un hardware interrupt e non anche un ciclyc interrupt dove ho configurato l hsc?

Forse dovrei lasciare perdere un po e mettermi vicino con un po di piu calma dopo le feste cosi da capire bene, ma la curiosita e la voglia di risolvere è piu forte!!! comunque ancora grazie Batta e Giuseppe per i consigli!!!

Link al commento
Condividi su altri siti

Giuseppe Signorella

Auguroni anche a te.

seconda domanda: perche sul rilevamento del fronte di salita di uno degli ingressi/canali, posso legare solo un hardware interrupt e non anche un ciclyc interrupt dove ho configurato l hsc?

Molto velocemente, per via della festività:

Secondo me o ti sei espresso male, oppure fai un pò di confusione.

Gli interrupt ciclici vengono attivati a tempo, cioè ogni tot tempo (da te impostato) viene scatenato l'evento interrupt ed esegue le istruzioni ad esso connesse. Gli interrupt ad evento invece vengono scatenati da un evento, che possono essere sia software (anche se questa espressione andrebbe definita meglio) che hardware, ad esempio se si verifica un evento tipo il passaggio dallo stato basso ad alto di un ingresso o viceversa. (CIò che ti ha cercato di far fare Batta).

Ciao

Link al commento
Condividi su altri siti

ok fin qui ci siamo, ma se io richiamo un interrupt chiudendo semplicemente un contatto collegato al box di richiamo di quel fc, il programma esegue l fc, ma io come faccio a riprendermi il controllo? cioe se riapro il contatto non succede nulla, se lo richiudo nemmeno, voglio dire è proprio cio che succede al contatore hsc quando inverto il conteggio, esso inizia a decrementare ma poi qualsiasi cosa faccio con I0.4 hsc continua a decrementare, come se riconosce i04 solo la prima volta sul fronte di salita.

Link al commento
Condividi su altri siti

Giuseppe Signorella

Se il tuo interrupt è ad evento, una volta verificatosi l'evento che lo scatena, il programma viene interrotto e viene eseguito il codice connesso all'interrupt, una volta terminato, il programma viene ripreso esattamente dal punto in cui è stato interrotto.

Se non si verifica un nuovo evento che lo scatena nuovamente, quella porzione di codice ad esso collegato non viene più eseguito.

ma io come faccio a riprendermi il controllo?

La domanda è un pò generica, perchè non comprendo esattamente cosa tu voglia dire.

Come ti ho detto sopra, se tu hai impostato un interrupt ad evento vuol dire che hai la necessità che venga eseguito con urgenza e/o priorità un'altra porzione di programma rispetto al resto del programma, quindi attendi che venga eseguito il codice connesso all'interrupt e poi il sistema esce e ritorna a fare quello che stava facendo prima (Hai ripreso il controllo del PLC) se è questo che volevi dire. La routine e/o codice dell'interrupt non viene eseguita ciclicamente all'infinito se non ci sono altri elementi che la richiamano.

Se durante l'esecuzione dell'interrupt hai necessità di uscire per fare una cosa più importante puoi farlo ad esempio attivando un altro interrupt con priorità più alta, ma dopo il sistema ritorna a d eseguire l'interrupt con priorità più bassa che ha lasciato a metà.

Se nella routine dell'interrupt hai inserito una condizione di salto che ti porta alla fine, della stessa routine dell'interrupt salti parte del codice ed esci immediatamente dalla routine. Ma tutto dipende esattamente da cosa e come la vuoi fare.

Non saprei dirti ora senza vedere il software cosa non funziona nel tuo codice, perchè non riesco ad immaginarlo.

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

eppure è strano perche ora il box va tutto bene, true ha il valore -1 e false =1 ma il contatore avanza solo di un senso inesorabilmente!!!

Non capisco cosa tu voglia dire con "true h avalore -1 e false = 1.

Guardando le due immagini con il codice, verrebbe da pensare che vuoi dire che quando M0.0 è TRUE, NEW_DIR è -1, mentre quando M0.0 è FALSE, NEW_DIR è 1.

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

allora, lasciando perdere un attimo il contatore veloce, sono andato a configurare, il canale i0.4 con il fronte di salita per richiamare l hardware interrupt ob40, nel main ho i0.4 che mi attiva anche un merker m0.0.

Sbagliatissimo.

Quando arriva un fronte di salita su I0.4 viene immediatamente mandato in esecuzione OB40.

Con questo "immediatamente" intendo, come ha giustamente spiegato Giuseppe, che viene interrotta la normale esecuzione del programma principale, viene eseguito OB40 (una sola volta), quindi viene ripresa l'elaborazione del codice principale dal punto in cui era stata interrotta.

Quindi, se tu usi I0.4 per impostare M0.0 nel programma principale, visto che il fronte di salita di I0.4 manda in esecuzione subito OB40, ti troverai ad elaborare OB40 prima di aver aggiornato lo stato di M0.0.

In OB40 quindi vedrai ancora M0.0 = FALSE. Lo stato di M0.0 verrà aggiornato in seguito, quando tu avrai già abbandonato OB40.

E non è finita. Quando interroghi lo stato di I0.4 leggi lo stato dell'immagine degli ingressi acquisita ad inizio scansione.

Quindi, anche leggendo lo stato di I0.4 al posto di M0.0 in OB40, leggeresti comunque uno stato non aggiornato.

Se in OB40 devi fare operazioni condizionate dallo stato di I0.4, dovrai interrogare I0.4 direttamente in OB40 ma, per leggere lo stato reale e non l'immagine acquisita ad inizio scansione, devi usare la sintassi I0.4:P.

In questo modo leggi lo stato reale dell'ingresso nel preciso istante in cui lo interroghi.

Se poi volessi usare I0.4 per invertire il conteggio quando passa da 0 a 1 e far ritornare il conteggio in avanti col passaggio da 1 a 0, potresti configurare I0.4 per avviare OB40 anche sul fronte di discesa.

Poi, in OB40, leggi lo stato di I0.4:P. Se lo stato è alto, imposti -1 in NEW_DIR; se lo stato è basso imposti 1 in NEW_DIR. All'ingresso DIR (esecuzione del comando) puoi anche scrivere direttamente TRUE.

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