pask1983 Inserito: 13 aprile 2011 Segnala Inserito: 13 aprile 2011 sono sempre io sto scrivendo un programma in AWL a titolo esercitativo (sono uno studente di ing. meccanica... )ho la necessità nel OB di resettare "n" uscite, lo posso fare nello stesso segmento?cioè una compilazione del tipo:segmento 3: R "A"R "B"R "C"R "D" R "E"oppure posso mettere un solo output ad ogni segmento?o come devo fare per evitare la "ripetitività" nel programma?mi viene il dubbio perchè cerco di immaginare il linguaggio ladder, dovrei interrompere la corrente in "n" bobbine... e come?
dcomerlati Inserita: 15 aprile 2011 Segnala Inserita: 15 aprile 2011 Per cominciare l'operazione R(reset) deve avveninire dopo un RLC(risultato logico combinatorio).Per cui :U M.xx(merker o ingresso etc..)R A.xxR A.yySe devi resettare una serie di uscite (es: da A0.0 a A.0.7) con un unica istruzione puoi scrivere:U M.xxSPBN M001L 0T ABOM001: NOP 0Dove SPBN (salto condizionato se RLC=0) e M001(etichetta di salto)Ciao
pask1983 Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 grazie tante dcomerlati! da questa affermazione <l'operazione R deve avvenire dopo un RLC>mi sorge una domanda:il programma è strutturato in tante funzioni FC ..l'OB1 in base a delle RLC mi richiama delle FC (col comando CALL)se nelle FC ho delle operazioni da svolgere quando queste vengono chiamate, tipo, per es.:se chiamo la fc pippo <CALL PIPPO>ed alla fc voglio far accendere un motore + un led, come devo fare?cioè io ho scritto nella fc = E 0.1 //accendi il motore= E 0.2 //accendi il led "motore" però da quello che dici, non posso cominciare il segmento con delle operazioni se prima non vi è una RLCquindi cosa posso inserire prima delle 2 operazioni?spero di essere stato chiaro :-\
Lucky67 Inserita: 15 aprile 2011 Segnala Inserita: 15 aprile 2011 cioè io ho scritto nella fc = E 0.1 //accendi il motore= E 0.2 //accendi il led "motore" però da quello che dici, non posso cominciare il segmento con delle operazioni se prima non vi è una RLCquindi cosa posso inserire prima delle 2 operazioni?devi mettere qualcosa che relazioni quegli "= E=0.1"...ad esempio LD m0.0 che se vera pone RLC ad 1 e attiva le uscite che ti servono.
pask1983 Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 "sfogliando" il manuale...potrei usare anche l'operatore SET quindi?tipo:SET= E 0.1 //accendi motoreR E 0.2 //spegni ledgiusto?
Lucky67 Inserita: 15 aprile 2011 Segnala Inserita: 15 aprile 2011 "sfogliando" il manuale...potrei usare anche l'operatore SET quindi?tipo:SET= E 0.1 //accendi motoreR E 0.2 //spegni ledgiusto?NO. detta terra terra non puoi iniziare una riga di segmento con un'uscita sia essa un SET RESET o altro. Devi mettere sempre prima una operazione che, se risulta verificata (e quindi RLC=1) ti permette di proseguire sulla riga.Se ad esempio poni un pulsante come E 0.0 e l'uscita di un motore come O 0.0 avrai LD E0.0= O 0.0se E 0.0 si verifica ad "1" (pulsante premuto) RLC va ad 1 e anche O 0.0 va ad 1 accendendo la tua utenza (qualunque essa sia).Stesso discorso con SET RESET
pask1983 Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 allora non so come fare vi spiego:nel programma ho tante valvole idrauliche elettroattuate con sensori di finecorsa per segnalare il corretto "posizionamento" della valvola, quindi per non ripetere la procedura di comando e verifica(con timer annesso) per tutte le valvole in tutte le eventuali situazioni, ho creato 2 FC (apri_valvola e chiudi_valvola)e gli passo gli input e gli autput a seconda della valvola da comandareIN: finecorsa // ingresso del segnale del finecorsa (quindi 1 se la valvola ha raggiunto il finecorsa)OUT: ERR_valvola // led di guasto valvola dedicato (c'è un led per ogni valvola)Valvola // "nome"valvola da comandarenell FC quindi vi è questa successione di comandi: segmento 1:R #valvola // manda a 0 il bit (chiude la valvola)FR T 1 // abilita il temp.L s5t#10s // carica i 10s (tempo necessario per far arrivare la valvola in "posizione")UN #finecorsa // se non è "chiuso" (contatto normalmente aperto) il sensore di finecorsa SA T 1 // avvia il timer che ritarda l'azione= #err_valvola //accendi il led = "se" // invia segnale di errore al OB1R "T" // reset timerquindi c'è l'errore di fondo perchè non c'è una condizione prima dell'operazione Rquindi come devo fare? :-\
pask1983 Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 (modificato) aiutatemi Modificato: 15 aprile 2011 da pask1983
Lucky67 Inserita: 16 aprile 2011 Segnala Inserita: 16 aprile 2011 Si ma l'azione di chi chiude la valvola dov'è? Un ingresso che fa capo ad un selettore, un pulsante, una condizione precedente dettata da un merker o similari...
Luca Bettinelli Inserita: 16 aprile 2011 Segnala Inserita: 16 aprile 2011 pask1983+-->CITAZIONE(pask1983)Mi sembra che ti stiano aiutando ! non credi, e comunque:
batta Inserita: 16 aprile 2011 Segnala Inserita: 16 aprile 2011 NO. detta terra terra non puoi iniziare una riga di segmento con un'uscita sia essa un SET RESET o altro.Come no.Le istruzioni SET e CLR impostano rispettivamente l'RLC a 1 oppure a 0, e non vanno confuse con le istruzioni S e R.Quindi istruzioni come:SET= M0.0R M0.1oppure:CLR= M0.2sono regolarissime.La cosa sbagliata dell'esempio di "pask1983" riguarda casomai il fatto che scrive lo stato di due ingressi, e non di due uscite o di due merker.SET= E 0.1 //accendi motoreR E 0.2 //spegni ledNon credo si riesca a comandare il motore o a spegnere il led modificando lo stato degli ingressi E0.1 ed E0.2.Scrivere lo stato di un ingresso è una pratica che personalmente adotto quando sono in simulazione e devo, per esempio, simulare il feedback di un comando.Quindi, tornando al primo post di "pask1983", basta aggiungere l'istruzione SET all'inizio del segmento:segmento 3:SET // Imposta RLC = 1R "A"R "B"R "C"R "D"R "E"Che poi sarebbe l'equivalente di scrivere:CLR // Imposta RLC = 0= "A"= "B"= "C"= "D"= "E"
batta Inserita: 16 aprile 2011 Segnala Inserita: 16 aprile 2011 R #valvola // manda a 0 il bit (chiude la valvola)FR T 1 // abilita il temp.L s5t#10s // carica i 10s (tempo necessario per far arrivare la valvola in "posizione")UN #finecorsa // se non è "chiuso" (contatto normalmente aperto) il sensore di finecorsaSA T 1 // avvia il timer che ritarda l'azione= #err_valvola //accendi il led= "se" // invia segnale di errore al OB1R "T" // reset timerQui mi pare invece ci sia un bel po' di confusione.Questa sembrerebbe l'FC "Chiudi Valvola".Per quanto detto prima, all'inizio manca l'istruzione SET per impostare l'RLC=1.L'RLC potrebbe essere già =1 (per esempio se la chiamata all'FC avviene dopo una istruzione SPB), ma io consiglierei vivamente di non omettere l'istruzione SET.Comunque, andando avanti con l'analisi del codice, ci sono vari errori:- quando perdi il finecorsa attivi un timer ritardato alla diseccitazione, ma non interroghi mai lo stato del timer.- le istruzioni = "se" e R "T" non credo tu sia riuscito a farle digerire al compilatore.Per ultimo, se pensi che con le due FC tu possa cavartela utilizzando solo due timer per tutte le valvole, sei in errore.Se richiami più volte l'FC che utilizza il timer T1, è come se utilizzassi più volte il timer T1 nel programma.Situazione questa di chiaro conflitto.Per utilizzare un timer diverso ad ogni richiamo della FC, il timer deve essere passato come parametro, e dovrai comunque utilizzare un timer (due per apertura e chiusura separate) per ogni valvola.Complicato poi gestire apertura e chiusura di una valvola richiamando due diverse funzioni. Molto meglio creare un'unica funzione alla quale, oltre ai segnali di feedback dai finecorsa, passi anche il comando (o i comandi in caso di controllo bistabile) di apertura/chiusura.Se vuoi qualcosa di già fatto, puoi vedere se l'FB81 "DCAT" (la trovi in "Standard Library" --> "TI-S7 Converting Blocks" --> "Blocks") fa al caso tuo.Non utilizza timer, ma tieni presente che si tratta di una FB, ed avrai quindi bisogno di un DB di istanza per ogni valvola.Personalmente la utilizzavo nei vecchi PLC serie TI (dalla quale proviene), ma non l'ho mai usata nei PLC S7, perché la trovo piuttosto pesante.
batta Inserita: 19 aprile 2011 Segnala Inserita: 19 aprile 2011 Ma dov'è finita tutta la fretta di pask1983?
pask1983 Inserita: 5 maggio 2011 Autore Segnala Inserita: 5 maggio 2011 mi scuso per il ritardo nella risposta... ho avuto un bel po' di problemi... ora sono ritornato allo studio di questa materia e quindi al linguaggio di programmazionevi ringrazio per tutte le informazioni, ho dato una lettura veloce, C.V.D. commettevo anche degli altri errori, ora mi leggo tutto con calma,di nuovo grazie
pask1983 Inserita: 6 maggio 2011 Autore Segnala Inserita: 6 maggio 2011 cerco di tirare le somme ... da quello che avete scritto noto che:1 commettevo un grande errore nella dichiarazione dei simboli, E sta per ingresso ed A per uscita, io ho dichiarato tutte le variabili al contrario! 2 posso, in un unico segmento, o funzione, dare tanti comandi di uscita basta che prima sia stato impostato l'RLC a 1 o dal comando SET o da istruzioni varie3 non ho ben capito l'utilizzo del timer, o meglio non so la sintassi correttaquindi il quesito finale resta solo sul punto 3 mi potete aiutare? poi avete parlato di un'unica funzione per aprire e chiudere la valvola, come devo fare?
batta Inserita: 6 maggio 2011 Segnala Inserita: 6 maggio 2011 3 non ho ben capito l'utilizzo del timer, o meglio non so la sintassi correttaIn Step7 ci sono vari tipi di timer:SI - Avvia temporizzatore come impulsoSV - Avvia temporizzatore come impulso prolungatoSE - Avvia temporizzatore come ritardo all'inserzioneSS - Avvia temporizzatore come ritardo all'inserzione con memoriaSA - Avvia temporizzatore come ritardo alla disinserzioneIl funzionamento dei timer è descritto nella guida in linea, con tanto di esempi, sia per la programmazione in AWL, sia per quella in KOP.Ci sono poi funzioni che trovi nella libreria standar (SFB "TON" e SFB5 "TOFF", per esempio), anche queste documentate.Se hai letto i manuali è c'è qualcosa che non capisci, allora puoi fare una domanda specifica.Ma non è certo possibile tenere un corso completo sull'utilizzo dei timer.
batta Inserita: 6 maggio 2011 Segnala Inserita: 6 maggio 2011 poi avete parlato di un'unica funzione per aprire e chiudere la valvola, come devo fare?Da come avevi sviluppato il codice di esempio, sembrava che tu avessi fatto una funzione per l'apertura della valvola, e una per la chiusura.Quando ci sono compiti ripetitivi (es. un certo numero di valvole da comandare e da controllare il segnale di feedback), piuttosto che scrivere N. volte lo stesso codice, conviene creare una funzione alla quale potrebbero (è solo un esempio) venire passati in ingresso parametri come il comando di apertura, lo stato del finecorsa, il tempo limite di attesa del segnale di feedback, mentre in uscita la funzione potrebbe pilotare la valvola e dare informazioni sullo stato della valvola stessa.Per il controllo di ogni valvola richiami poi sempre la stessa funzione, con parametri diversi.Ma se sei ancora in difficoltà sull'utilizzo di un timer, parlare di FC e FB con parametri forse è prematuro.
pask1983 Inserita: 6 maggio 2011 Autore Segnala Inserita: 6 maggio 2011 il mio intento era quello di creare 2 funzioni FC, una per l'apertura e una per la chiusura delle valvoleovviamente indicando i parametri differenti per ogni valvolaall'interno della FC volevo inserire anche il controllo col timer,ti spiego, quando viene chiamata la funzione apri_valvolaquesta mi mette a 1 l'uscita destinata all'apertura/chiusura valvola (1 apertura e 0 chiusura nel mio caso)e avvia il timer, alla fine del timer, se il finecorsa non segnala "contatto chiuso" mi avvia la procedura di "errore"ho letto il manuale AWLe se non ho capito male, dovrei usare il timer come "SE" (ritardo di inserzione)ora le domande sono:come faccio a fare una unica funzione per apertura e chiusura? (in pratica, io devo comandare un relè a 2 posizionie e 2 scambi in modo da invertire il moto di un motore, quindi devo mettere a 0 l'uscita del plc per mantenere il relè nella posizione "di riposo", viceversa...)ora come dovrei indicare nei parametri se mi deve dare 0 o 1 in base all'operazione che mi serve? per quanto riguarda il timer:posso usarlo come è nel mio intento o c'è qualche errore di fondo/concettuale?
pask1983 Inserita: 7 maggio 2011 Autore Segnala Inserita: 7 maggio 2011 In Step7 ci sono vari tipi di timer:SI - Avvia temporizzatore come impulsoSV - Avvia temporizzatore come impulso prolungatoSE - Avvia temporizzatore come ritardo all'inserzioneSS - Avvia temporizzatore come ritardo all'inserzione con memoriaSA - Avvia temporizzatore come ritardo alla disinserzioneIl funzionamento dei timer è descritto nella guida in linea, con tanto di esempi, sia per la programmazione in AWL, sia per quella in KOP.Ci sono poi funzioni che trovi nella libreria standar (SFB "TON" e SFB5 "TOFF", per esempio), anche queste documentate.Se hai letto i manuali è c'è qualcosa che non capisci, allora puoi fare una domanda specifica.Ma non è certo possibile tenere un corso completo sull'utilizzo dei timer.non capisco l'utilità dei comandi per l'utilizzo del timer, cioè per utilizzare un timer ci voglio 7-8 righe, non capisco la funzione di questi comandi riga per riga, ad es. leggo dal manuale che per utilizzare il timer come ritardo di inserzione devo "scrivere":U E 2.0FR T1 //Abilita il temporizzatore T1.U E 2.1L S5T#10s //Predispone una preimpostazione di 10 secondi nell'accumulatore 1.SE T1 //Avvia il temporizzatore T1 come ritardo all'inserzione.U E 2.2R T1 //Resetta il temporizzatore T1.U T1 //Interroga il segnale di stato del temporizzatore T1.= A 4.0L T1 //Carica il valore di tempo attuale del temporizzatore T1 in formatobinario.T MW10LC T1 //Carica il valore di tempo attuale del temporizzatore T1 in formato BCD.T MW12
pask1983 Inserita: 7 maggio 2011 Autore Segnala Inserita: 7 maggio 2011 poi ho pensato, potrei creare un'altra funzione che deve svolgere solo la funzione di "controllore", mi spiego,nella FC apri_valvola invece di comandare la valvola e "chiedere" se ha raggiunto il finecorsa, comanderei la valvola e chiamerei una funzione "controllo" dove in esse ci andrei ad inserire il timer con la condizione da verificare, secondo voi è meglio?così avrei 2 funzioni per aprire e chiudere + una funzione per controllare sia in apertura che in chiusuraperò non mi è chiaro come poter passare, come parametro, alla funzione "controllo" il valore del tempo da conteggiare che potrebbe cambiare da valvola a valvolase scrivo <L S5T#TEMPOs> e negli ingressi della funzione associo alla variabile TEMPO un valore mi sa che scrivo una gran cacchiata vero?
batta Inserita: 7 maggio 2011 Segnala Inserita: 7 maggio 2011 Per i timer, l'istruzion e FR è utilizzata molto raramente.Anche il reset del timer non si usa molto.L'utilizzo più classico di un timer ritardato all'eccitazione è:U M100.0L S5T#5sSE T10U T10= M100.1Importante ricordare che il timer parte, nel caso dell'esempio, quando M100.0 passa da 0 a 1.Esempio:M100.0 passa da 0 a 1Il timer parteQuando arriva a fine conteggio M100.1 viene impostato a 1Se, supponiamo, utilizzi l'istruzione di reset del timer, M100.1 viene impostato a 0 ma, anche togliendo l'istruzione di reset, se M100.0 rimane sempre a 1 il timer non riparte.Per farlo ripartire, o si deve portare a 0 e poi nuovamente a 1 M100.0, oppure si utilizza l'istruzione FR.Nell'uso più comune, si utilizza solo il cambiamento di stato di M100.0 per attivare il timer.
batta Inserita: 7 maggio 2011 Segnala Inserita: 7 maggio 2011 Per la funzione che gestisce comando apertura, chiusura e controllo finecorsa, ecco un semplice esempio:FUNCTION FC100 : VOID TITLE = VERSION : 0.1 VAR_INPUT Cmd_IN : BOOL; FC_Aperta : BOOL; FC_Chiusa : BOOL; Tmr : TIMER; TMax : S5TIME; END_VAR VAR_OUTPUT Apre : BOOL; Chiude : BOOL; Err : BOOL; END_VAR BEGIN NETWORK TITLE =Controllo tempo massimo apertura/chiusura valvola U #Cmd_IN; UN #FC_Aperta; O ; UN #Cmd_IN; UN #FC_Chiusa; L #TMax; SE #Tmr; U #Tmr; = #Err; NETWORK TITLE =Comando apre U #Cmd_IN; UN #FC_Aperta; UN #Err; = #Apre; NETWORK TITLE =Comando chiude UN #Cmd_IN; UN #FC_Chiusa; UN #Err; = #Chiude; END_FUNCTIONCrea una nuova "Sorgente AWL" nella cartella "Sorgenti" del tuo progetto Step7.Copia il codice e compila.Viene generata una FC100. ATTENZIONE!!! Se nel tuo progetto c'è già una FC100, questa verrà sovrascritta. Per cambiare il numero della FC generata, ti basta modificare la prima riga del codice.Con questa funzione potresti comandare apertura e chiusura di una valvola bistabile semplicemente impostando ON (apre) oppure OFF (chiude) l'ingresso "Cmd_IN".Viene poi attivata l'uscita per apertura o chiusura fino a quando arriva il segnale dal finecorsa.Viene inoltre generato un allarme se non arriva il segnale dal finecorsa entro il tempo limite impostato.N.B.: questa funzione presenta parecchi difetti (che non sto ad elencare) per un utilizzo reale. E' da considerare solo come un puro e semplice esempio.
pask1983 Inserita: 9 maggio 2011 Autore Segnala Inserita: 9 maggio 2011 Per i timer, l'istruzion e FR è utilizzata molto raramente.Anche il reset del timer non si usa molto.L'utilizzo più classico di un timer ritardato all'eccitazione è:U M100.0L S5T#5sSE T10U T10= M100.1Importante ricordare che il timer parte, nel caso dell'esempio, quando M100.0 passa da 0 a 1.Esempio:M100.0 passa da 0 a 1Il timer parteQuando arriva a fine conteggio M100.1 viene impostato a 1Se, supponiamo, utilizzi l'istruzione di reset del timer, M100.1 viene impostato a 0 ma, anche togliendo l'istruzione di reset, se M100.0 rimane sempre a 1 il timer non riparte.Per farlo ripartire, o si deve portare a 0 e poi nuovamente a 1 M100.0, oppure si utilizza l'istruzione FR.Nell'uso più comune, si utilizza solo il cambiamento di stato di M100.0 per attivare il timer. non mi è ben chiaro, sono due giorni che leggo e rileggo ma non riesco a farmene un'idea riportando quello che hai scritto tu:L'utilizzo più classico di un timer ritardato all'eccitazione è:U M100.0 // se M100.0 è "vero", l'RLC = 1 L S5T#5s // carica 5 secondi nell'accumulatoreSE T10 // avvia tempor. come ritardi di inserz. U T10 // questo cosa fa? ... non dovrebbe essere "scontata" come condizione dato che il tempor. è arrivato a 0?= M100.1 //attiva l'uscita provo ora io a scrivere la funzione, vediamo se ho quasi capito (attivo la valvola in una altro segmento con il comando < = A1.5>)nel segmento di "controllo" scrivo:U A1.5 // domanda: posso interrogare l'uscita A1.5 per portare l'RLC a 1?L S5T10s // carica 10 secondiSE T1 // avvia tempor.U T1 // stessa domanda del "quote"UN E 1.3 //se il finecorsa non è "chiuso"= A 1.4 //accendi la lampada di errore= E 0.1 // imposta ad 1 il segnale di errore (che viene letto dall'OB) -> è corretto o devo usare un merker?N.B. ovviamente, i ringraziamenti sono "scontati"
pask1983 Inserita: 9 maggio 2011 Autore Segnala Inserita: 9 maggio 2011 altra domandina , il prof. ci ha detto che nel pacchetto è compreso un simulatore e possiamo usarlo per vedere se abbiamo compilato bene...qual'è questo simulatore? non lo trovo nel menù avvio
batta Inserita: 9 maggio 2011 Segnala Inserita: 9 maggio 2011 Tutto bene, o quasi, fino all'istruzione= A1.4Il quasi è riferito al fatto che se l'uscita A1.4 deve segnalare l'errore di una sola valvola, allora va bene.Se invece utilizzi l'uscita A1.4 per segnalare l'errore di più valvole, allora non va più bene, perché l'uscita A1.4 assumerebbe lo stato assegnato nell'ultimo richiamo.E questo vale anche per il timer T10. Nel caso di più valvole, dovrai utilizzare un timer diverso per ogni valvola.Per usare A1.4 per segnalare l'errore di più valvole, o utilizzi dei merker che poi metterai tutti in OR per comandare l'uscita A1.4, oppure (ma sarebbe piuttosto brutto) attivi l'uscita A1.4 con l'istruzione S (set) al posto di =Dovresti però poi prevedere un reset manuale da parte dell'operatore.Per quanto riguarda l'istruzione= E0.1valgono tutte le considerazioni fatte per A1.4, e in più c'è da dire che non capisco perché tu voglia comandare lo stato di un ingresso.Gli ingressi sono fatti per leggere lo stato dei segnali elettrici esterni. Barare scrivendo lo stato di un ingresso direi che è assolutamente da evitare.Alcune marche di PLC non ti consentono nemmeno di farlo.Unico caso in cui ritengo utile e accettabile scrivere lo stato di un ingresso, è durante il debug, per simulare segnali che nell'uso normale dovrebbero provenire dal campo.Per quanto riguarda il simulatore, se è vero che è presente nel software che hai a disposizione, si attiva da "Strumenti" --> "Simula unità", oppure cliccando sull'icona con il PLC all'interno della nuvoletta (o almeno così io interpreto quel disegno, non troppo chiaro). Se ci passi sopra col mouse, il tool tip indica "Simulazione on/off"
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora