Vai al contenuto
PLC Forum


Numero Di Istruzioni Per Segmento - AWL


Messaggi consigliati

Inserito:

sono sempre io :senzasperanza:

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? :unsure:


Inserita:

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

R A.yy

Se devi resettare una serie di uscite (es: da A0.0 a A.0.7) con un unica istruzione puoi scrivere:

U M.xx

SPBN M001

L 0

T ABO

M001: NOP 0

Dove SPBN (salto condizionato se RLC=0) e M001(etichetta di salto)

Ciao

Inserita:

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 RLC

quindi cosa posso inserire prima delle 2 operazioni?

spero di essere stato chiaro :-\

Inserita:
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 RLC

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

Inserita:

"sfogliando" il manuale...

potrei usare anche l'operatore SET quindi?

tipo:

SET

= E 0.1 //accendi motore

R E 0.2 //spegni led

giusto?

Inserita:
"sfogliando" il manuale...

potrei usare anche l'operatore SET quindi?

tipo:

SET

= E 0.1 //accendi motore

R E 0.2 //spegni led

giusto?

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

se 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

Inserita:

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 comandare

IN:

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 comandare

nell 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 OB1

R "T" // reset timer

quindi c'è l'errore di fondo perchè non c'è una condizione prima dell'operazione R

quindi come devo fare? :-\

Inserita: (modificato)
:worthy: aiutatemi Modificato: da pask1983
Inserita:

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:
pask1983+-->
CITAZIONE(pask1983)

Mi sembra che ti stiano aiutando ! non credi, e comunque:

Inserita:
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.0

R M0.1

oppure:

CLR

= M0.2

sono 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 motore

R E 0.2 //spegni led

Non 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 = 1

R "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"

Inserita:
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 OB1

R "T" // reset timer

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

Inserita:

Ma dov'è finita tutta la fretta di pask1983?

  • 3 weeks later...
Inserita:

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 programmazione

vi 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 :thumb_yello:

Inserita:

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! :huh:

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 varie

3 non ho ben capito l'utilizzo del timer, o meglio non so la sintassi corretta

quindi 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?

Inserita:
3 non ho ben capito l'utilizzo del timer, o meglio non so la sintassi corretta

In Step7 ci sono vari tipi di timer:

SI - Avvia temporizzatore come impulso

SV - Avvia temporizzatore come impulso prolungato

SE - Avvia temporizzatore come ritardo all'inserzione

SS - Avvia temporizzatore come ritardo all'inserzione con memoria

SA - Avvia temporizzatore come ritardo alla disinserzione

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

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

Inserita:

il mio intento era quello di creare 2 funzioni FC, una per l'apertura e una per la chiusura delle valvole

ovviamente indicando i parametri differenti per ogni valvola

all'interno della FC volevo inserire anche il controllo col timer,

ti spiego,

quando viene chiamata la funzione apri_valvola

questa 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 AWL

e 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? :huh:

per quanto riguarda il timer:

posso usarlo come è nel mio intento o c'è qualche errore di fondo/concettuale?

Inserita:
In Step7 ci sono vari tipi di timer:

SI - Avvia temporizzatore come impulso

SV - Avvia temporizzatore come impulso prolungato

SE - Avvia temporizzatore come ritardo all'inserzione

SS - Avvia temporizzatore come ritardo all'inserzione con memoria

SA - Avvia temporizzatore come ritardo alla disinserzione

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

FR T1 //Abilita il temporizzatore T1.

U E 2.1

L S5T#10s //Predispone una preimpostazione di 10 secondi nell'accumulatore 1.

SE T1 //Avvia il temporizzatore T1 come ritardo all'inserzione.

U E 2.2

R T1 //Resetta il temporizzatore T1.

U T1 //Interroga il segnale di stato del temporizzatore T1.

= A 4.0

L T1 //Carica il valore di tempo attuale del temporizzatore T1 in formato

binario.

T MW10

LC T1 //Carica il valore di tempo attuale del temporizzatore T1 in formato BCD.

T MW12

:huh:

Inserita:

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 chiusura

però non mi è chiaro come poter passare, come parametro, alla funzione "controllo" il valore del tempo da conteggiare che potrebbe cambiare da valvola a valvola

se scrivo

<L S5T#TEMPOs>

e negli ingressi della funzione associo alla variabile TEMPO un valore

mi sa che scrivo una gran cacchiata :huh:

vero?

Inserita:

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

L S5T#5s

SE T10

U T10

= M100.1

Importante ricordare che il timer parte, nel caso dell'esempio, quando M100.0 passa da 0 a 1.

Esempio:

M100.0 passa da 0 a 1

Il timer parte

Quando arriva a fine conteggio M100.1 viene impostato a 1

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

Inserita:

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_FUNCTION

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

Inserita:
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.0

L S5T#5s

SE T10

U T10

= M100.1

Importante ricordare che il timer parte, nel caso dell'esempio, quando M100.0 passa da 0 a 1.

Esempio:

M100.0 passa da 0 a 1

Il timer parte

Quando arriva a fine conteggio M100.1 viene impostato a 1

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

:senzasperanza:

non mi è ben chiaro, sono due giorni che leggo e rileggo ma non riesco a farmene un'idea :unsure:

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'accumulatore

SE 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 :rolleyes:

(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 secondi

SE 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" ;)

Inserita:

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

Inserita:

Tutto bene, o quasi, fino all'istruzione

= A1.4

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

valgono 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"

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