Vai al contenuto
PLC Forum


Struttura


Nesus

Messaggi consigliati

Salve a tutti!!

Stavo pensando a come strutturare tutto il programma solo che incontro dei problemi dai quali sorgono dubbi abissali che mi bloccano ;_;

Da quanto ho letto sulle guide e dal vostro forum mi è uscita una bozza del genere:

Farò un FC dedicato solo all' apertura e chiusura di interruttori con i relativi settaggi dei merker ( per controllare passo passo i movimenti ) ho scelto questa opzione perchè:

tutto il PLC verrà poi gestito ( se impostato su REMOTO ) da un programma esterno al plc(chiamato da noi “prometeo”) con un interfaccia a mimici dove verranno richiamate le varie funzioni ( Questo programma utilizza degli indirizzi specifici già predisposti "Holding Register" --> "Bit position" * in pratica lui ha gia un procedimento per comandare da solo gli interruttori e ricevere i consensi). Se invece messo in LOCALE si potrà controllare il tutto sul banco manovra.

Qui in basso vi incollo ciò che ho scritto nel programma con accanto i vari commenti:

Esempio 1

{

FC1

segmento 1: Chiusura I1

U "serv_aux_ok" //Consenso servizi ausiliari attivi

U "T1A_aperto" //Consenso T1A aperto

U "T1F_aperto" //Consenso T1F aperto

= "chiusura_I1" //In uscita mando il comando di chiusura I1

segmento 2: Chiusura T1A

U "I1_chiuso" //Consenso I1 chiuso

= "chiusura_T1A" //In uscita mando il comando di chiusura T1A

OB1

segmento 1:

CALL FC1 ( mi richiama tutto l'FC1 )

// qui mi intoppo perché; come fa OB a capire la sequenza da eseguire se e' tutto rinchiuso in FC1? manda in ciclo anche FC1?

// se cosi fosse, come posso strutturare la faccenda dei merker avendo sempre un facile utilizzo sul singolo interruttore?( visto che poi da prometeo verranno richiamati i singoli procedimenti?).

}

Esempio 2:

{

FC1

segmento 1: Chiusura I1

U "serv_aux_ok" //Consenso servizi ausiliari attivi

U "T1A_aperto" //Consenso T1A aperto

U "T1F_aperto" //Consenso T1F aperto

= "chiusura_I1" //In uscita mando il comando di chiusura I1

FC2

segmento 2: Chiusura T1A

U "I1_chiuso" //Consenso I1 chiuso

= "chiusura_T1A" //In uscita mando il comando di chiusura T1A

OB1

segmento 1:

CALL FC1

//qui se possibile aggiungerei la funzione del merker per passare al passo successivo "CALL FC2"

CALL FC2

//qui farei la funzione del temporizzatore con ritardo di .....(devo capire quale temporizzatore si addice al mio caso… Disinserzione o inserzione? Nel caso in cui, passati 2 minuti non raggiunge i 200 giri, va in allarme.

// sempre per il temporizzatore mi conviene fare un FC a parte, metterlo come procedimento dentro ob1 oppure infilarlo dentro FC2?**

}

* Come faccio ad associare ingressi ed uscite a specifici HR e Bit position? qui su s7 si chiamano Data word?

** In questo ultimo caso sono andato a vedere sul manuale AWL questa funzione:

U E 2.0 (abilitazione)

FR T1

U E 2.1 (avvio)

L s5t#10s

SA T1

U E 2.2 (reset)

R T1

U T1

= A 4.0 (uscita)

L T1

T MW10

LC T1

T MW12

Per esempio nel mio caso il temporizzatore deve partire con l'avvenuta chiusura di T1A(consenso in ingresso E 4.1) attendere 2 minuti controllare se ha raggiunto 200 giri ( ingresso MW 4 ), quindi abilitazione e avvio a cosa si riferisce? ed il reset?

Grazie in anticipo per la pazienza nel leggere il papiro :o

Link al commento
Condividi su altri siti


CALL FC1 ( mi richiama tutto l'FC1 )

// qui mi intoppo perché; come fa OB a capire la sequenza da eseguire se e' tutto rinchiuso in FC1? manda in ciclo anche FC1?

// se cosi fosse, come posso strutturare la faccenda dei merker avendo sempre un facile utilizzo sul singolo interruttore?( visto che poi da prometeo verranno richiamati i singoli procedimenti?).

Normalmente il procedimento adottato dalla CPU dopo il primo avviamento a seguire ciclicamente , e quello di eseguire il programma partendo dalla prima istruzione che incontra in OB1, "blocco organizzativo principale" nel momento che incontra l'istruzione CALL , "chiamata incondizionata ad un blocco o sottoprogramma" abbandona OB1 per elaborare FC1 , eseguendone le sue istruzioni contenute, alla fine di FC1 , l'istruzione BE "fine blocco incondizionato" ritorna nell'OB1 appena sotto l'ultima istruzione CALL eseguita.

Seconda cosa, se il tuo programma si limita solo ad eseguire operazioni logiche combinatorie tramite ingressi e uscite con AND , NOT... perche scomodare un blocco FC? Basterebbe anche usare un FB o addirittura un PB.

* Come faccio ad associare ingressi ed uscite a specifici HR e Bit position? qui su s7 si chiamano Data word?

In realta'si chiamano Data Block DB, l'associazione la devi cercare nel tipo di interfaciamento verso il dispositivo che tu chiami "prometeo".

Normalmente esistono vari modi di interagire tra PLC e dispositivi esterni , i pui' comuni sono con scambio di informazioni tramite DB , o "I/Operiferia" nel tuo caso specifico, tramite DB , ma devi sapere il"prometeo" dove va a scrivere/leggere le informazioni nel DB.

Ad esempio prometeo usa scambiare la prima word di BD1 , per ,modificare lo stato di quello che tu intendi nel programma come ingressi , e la seconda word di DB1 per leggere lo stato di quelle che tu chiami uscite , quindi il tuo blocco potrebbe diventare:

U DB1.dbx0.1 //Consenso servizi ausiliari attivi, pimo bit della prima word di DB1

U DB1.dbx0.2 //Consenso T1A aperto,secondo bit della prima word di DB1

U DB1.dbx0.3 //Consenso T1F aperto,terzo bit della prima word di DB1

= DB1.dbx1.0 //In uscita mando il comando di chiusura I1,pimo bit della seconda word di DB1

CALL FC2

//qui farei la funzione del temporizzatore con ritardo di .....(devo capire quale temporizzatore si addice al mio caso… Disinserzione o inserzione? Nel caso in cui, passati 2 minuti non raggiunge i 200 giri, va in allarme.

// sempre per il temporizzatore mi conviene fare un FC a parte, metterlo come procedimento dentro ob1 oppure infilarlo dentro FC2?**

Per un controllo di Timeout usa pure un timer con ritardo all'ecitazione SE , dove l'istruzione FR di abilitazione puoi anche non considerarla, cosi' come il reset a meno che tu non ne abbia veramente bisogno, perche' considera che se vengono a mancare le condizioni che avviano il timer, il suo valore di tempo trascorso viene automaticamante resettato e ricaricato per intero al successivo riavvio ,quindi potrebbe essere:

U E 2.0 (abilitazione)

U E 2.1 (avvio)

L MW4 // carico il valore di MW4

L 200 // carico il valore di velocita'

<=I // confronto se il valore 'e minore o uguale ( confronto tra numeri interi senza segno)

L s5t#10s /carica valore S5 time di 10 secondi

SE T1 /carica ritardo all'eccitazione T1

U T1

= A 4.0 (uscita)

Ciao

Ivan

Link al commento
Condividi su altri siti

x kamikaze

Seconda cosa, se il tuo programma si limita solo ad eseguire operazioni logiche combinatorie tramite ingressi e uscite con AND , NOT... perche scomodare un blocco FC? Basterebbe anche usare un FB o addirittura un PB.

perchè dici questo? il blocco FC è quello giusto: l'FB è solo una complicazione in quanto devi assegnargli anche un DB di istanza e i PB esistono solo in S5 (che io sappia) :blink:

x nesus

da OB1 puoi anche richiamare i singoli FC in modo condizionato con l'istruzione CC

U Condizione1

CC FC1

U Condizione2

CC FC2

ecc....

per il temporizzatore:

U E4.1

L S5T#2M

SE T1

L MW4

L 200

<I

U T1

= #ALLARME

così allo scadere dei 2 minuti si accende il contatto T1 e se MW4 è minore di 200 ... fai quello che devi (non so cosa intendi tu per "andare in allarme")

ciao

Link al commento
Condividi su altri siti

perchè dici questo? il blocco FC è quello giusto: l'FB è solo una complicazione in quanto devi assegnargli anche un DB di istanza e i PB esistono solo in S5 (che io sappia) blink.gif

Cisio......Touche' :lol: , dovrei smettere di postare messaggi prima di collegare il cervello.....

:P

Ciao

Ivan

Link al commento
Condividi su altri siti

Grazie ad entrambe per la risposta celere!

Piano piano mi sto avvicinando alla soluzione :)

Quindi procederò nel creare FC con i vari comandi e li richiamerò nell'OB1 man mano seguendo il giusto procedimento.

Nell' andare in allarme intendo che, se non raggiunge i 200 giri nel tempo stabilito, mette la macchina in frenatura, quindi farà partire la fase di frenatura e mi segnalerà l'allarme.

Grazie ancora =) mi metto all'opera ^_^ in caso riscontrassi altri problemini vi disturberò ancora :o

Link al commento
Condividi su altri siti

Nesus ho tentato di rispondere al tuo MP ma pare che hai la cartella inbox piena e la devi svuotare, per cui ti rispondo qui

U E4.1 ( consenso T1A_chiuso )

L S5T#2M ( qui setti i 2 minuti )

SE T1 ( qui invece SE= ritardo eccitazione & T1 e' il nome del temporizzatore oppure di T1Acioè l'interruttore che va chiuso?)

NO!

SE T1 -- significa che utilizzi il timer T1 con ritardo all'eccitazione: nella cpu hai a disposizione un numero ben preciso di timer (da 0 a 255) e stai attento a non usare lo stesso timer 2 volte!

U T1 -- il bit T1 diventa ON dopo 2 minuti che E4.1 è ON, lo puoi usare come un qualsiasi altro bit (ingresso, uscita, merker) senza alcuna limitazione

e quante volte vuoi

L MW4

L 200

<I ( la variabile I sarebbe una variabile temporanea che prende il valore di 200? )

U T1 ( qui sarebbe E4.1 ? )

= #ALLARME

NO: <I è un operatore di confronto tra i 2 accumulatori

ad esempio in questo caso:

L MW4 -- carica MW4 nell'accumulatore 1

L 200 -- sposta accumulatore 1 in accumulatore 2 e carica la costante 200 nell'accumulatore 1

<I -- confronta accumulatore 1 in accumulatore 2: se il primo è minore del secondo setta RLC=1

U T1 -- operazione logica AND di RLC e T1

= #ALLARME

in parole povere significa:

IF (MW4<200 and T1) THEN

ALLARME=1

ELSE

ALLARME=0

ENDIF

se vuoi capire le singole istruzioni prova a usare l'#### in linea di step7

ciao

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