Vai al contenuto
PLC Forum


Trasferire A Operandi Tra Fb


Messaggi consigliati

Inserito:

Salve a tutti.

Sono nuovo al mondo SIEMENS e avrei una domanda da porre a chi è più agile nella programmazione di questi PLC.

Ipotesi: dovrei progettare un'impianto con 5 stazioni differenti per funzionamento tra loro.

Programmare in modo lineare in OB1 non mi sembra comodo , di conseguenza creo 5 FB con DB di istanza (uno per ciascuna macchina).

Ora mi chiedo, posso scambiare operandi IN e OUT fuori dai diversi FB senza fare pasticci? Per esempio consensi, allarmi o altro?

O sbaglio sistema-ragionamento? :blink:


Inserita:

Ciao, e ben venuto, io sinceramente non ho capito la tua domanda, ma vediamo se con delle semplici informazioni ti possono bastare:

  1. 1 - Se non vai a scrivere sullo stesso dato è OK
  2. 2 - Puoi leggere una variabile n volte +1
  3. 3 - l'ultima operazione di scrittura comanda

Per il resto tramite IN e OUT delle FC oppure FB fai tutto quello che vuoi posso aggiungere che se usi FB con DB di istanza dove per esempio hai DBxx.DBX10.0 come OUT e questa viene trasferita alla M100.0 in uscita dalla tua FB il scrivere

A DBxx.DBX10.0 oppure A M100.0 ha la stessa valenza dopo il richiamo del tuo FB

Se non dovesse bastarti posta un esempio o specifica meglio quello che vuoi fare. <_<

Ciao

Inserita:
Ora mi chiedo, posso scambiare operandi IN e OUT fuori dai diversi FB senza fare pasticci?

Certo che puoi!

Inserita: (modificato)

Grazie per le risposte, siete stati molto disponibili.

Ora mi spiego meglio.

Il mio FB1 con DB di Istanza comanda, una stazione che lava e tratta delle piastre di metallo. Di conseguenza ha variabili in ingresso (ingressi digitali, MW, MD ecc) ed uscite (Q0.0, Merker, MW ecc ).

Se da FB1 devo mandare un consenso alla macchina comandata da FB2 stazione asciugatrice (es ho finito di lavare, avanti inverter, asciuga il pezzo), uso un merker in uscita da FB1 e lo porto ad un'ingresso di FB2.

Mi sono accorto che con FB abbastanza grossi, qualcosa non va... La CPU inizia ad impazzire.

Es in FB1 il merker bit in uscita M1.0 è 1, mentre in ingresso su FB2 è a stato 0.

Rami di KOP che si accendono da soli senza settare variabili e altri errori vari

Oppure, il mio OP (TP277), inizia a scrivere cazzate in modalità random nei DB dei FB.

Modificato: da lappone2
Inserita:

Ciao

Certo che puoi, un FB si appoggia sempre ad un DB di istanza, il riferimento ad un byte oppure ad una parola

la puoi sempre ripendere in tutto il resto del tuo programma.

Esempio: STAT ( nome ) pippo ( tipo dati ) Word ( indirizzo ) 0.0

è la DB ( istanza ) DBW0

il valore lo puoi gestire in tutto il tuo programma.

Inserita: (modificato)

Ciao, ho capito il funzionamento.

Non sono in grado di spiegarmi il perchè dell'anomalia che mi è capitata alcuni giorni fa...

Forse ho sbagliato a scrivere una variabile...

Cioè, se MW1 è in lettura su parametro IN di FB1 non può essere in scrittura all'interno del FB stesso. Giusto? è una cosa sbagliata ma potrebbe essere a causa di un mio errore di programmazione.

E se si, può compromettere la scansione di OB1 e causare l'intera avaria della CPU?

Modificato: da lappone2
Inserita: (modificato)
Cioè, se MW1 è in lettura su parametro IN di FB1 non può essere in scrittura all'interno del FB stesso

Meglio se la scrivi in uscita al blocco e non durante l'esecuzione del tuo FB

Es in FB1 il merker bit in uscita M1.0 è 1, mentre in ingresso su FB2 è a stato 0.

Questo accade se vai a scrivere su M1.0 tra la fine di FB1 ed l'inizio di FB2.

In oltre ti consiglio, se non l'hai ancora fatto di scomporre la tua FB1, un po come hai fatto con OB1.

Premetto che non conosco il tuo impianto e forse ciò che sto per suggerirti non vale, ma io farei una cosa del genere:

1 - OB1 -> FC1 (prima macchina) > uscita di FC1 stato della macchina (es: allarmi, segnali di fine ciclo ecc)

2 - OB1 -> FC2 (seconda macchina) > uscita di FC2 stato della macchina (es: allarmi, segnali di fine ciclo ecc)

In FC1 -> vari FC ed FB che gestiscono la macchina

Parte OP:

OP scrive è legge in una sua DB, alla fine di OB1 una funzione tipo FC che prende i dati dalle varie macchine e copia i dati nella DB dell'OP, oppure alla fine di ogni FC macchina copio i dati nella DB del OP.

Spero di esserti stato utile

Modificato: da TravelMen
Inserita:
Questo accade se vai a scrivere su M1.0 tra la fine di FB1 ed l'inizio di FB2.

Mi puoi spiegare meglio per favore...

In oltre ti consiglio, se non l'hai ancora fatto di scomporre la tua FB1, un po come hai fatto con OB1.

Premetto che non conosco il tuo impianto e forse ciò che sto per suggerirti non vale, ma io farei una cosa del genere:

1 - OB1 -> FC1 (prima macchina) > uscita di FC1 stato della macchina (es: allarmi, segnali di fine ciclo ecc)

2 - OB1 -> FC2 (seconda macchina) > uscita di FC2 stato della macchina (es: allarmi, segnali di fine ciclo ecc)

In FC1 -> vari FC ed FB che gestiscono la macchina

Già fatto. ;)

Inserita: (modificato)
Questo accade se vai a scrivere su M1.0 tra la fine di FB1 ed l'inizio di FB2.

Mi puoi spiegare meglio per favore...

Ci provo, allora,

CALL FB1
  IN1    := M100.0
  OUT1  := M1.0

L 0
T MW0

CALL FB2
  IN1    := M1.0
  OUT1  := M2.0

è vero che M1.0 vale 1 all'uscita del FB1 ma è anche vero vale 0 all'ingresso del FB2 perchè sovrascrivo ma MW0 con una serie di zeri, e nella MW0 si trova anche il bit 1.0 dato che la MW0 è composta dal Byte 0 e dal Byte 1

Modificato: da TravelMen
Inserita: (modificato)

Ma allora non posso passare valori.

Vediamo:

M1.0 all'uscita di FB1 è 1 ma all'ingresso di FB2 è 0 perchè lo sovrascrivo. :huh:

Non è che se M1.0 all'uscita di FB1 è 1 all'uscita di FB2 sarebbe 0 perchè lo sovrascivo?

Modificato: da lappone2
Inserita:

Una variabile in lettura ( parametro IN ) esempio MW10 può essere tranquillamente elaborata

all'interno della tua FB, questo senza problemi. Naturalmente il paramotro deve essere

Tipo dati impostato come word. Se questo non fosse corretto quando richiami l'FB non riusciresti

a compilarla e rimarrebbe rossa.

Per quanto rigurda l'eventuale stop della CPU ti consiglio di caricare nella CPU i blocchi

OB120 e OB121 che non ti mandano in stop la CPU a fronte di un errore, mantenedo comunque

la diagnostica attiva. In OB120 e OB121 non far ciclare nulla. per ora.

Ciao

Inserita:
Non è che se M1.0 all'uscita di FB1 è 1 all'uscita di FB2 sarebbe 0 perchè lo sovrascivo?

esatto equivale all'esempio di prima ma cosi fatto:

FB1
   VAR...

L 0 
T MW1

A SENSORE
= M1.0

END_FB1

FB2
  VAR....


A SENSORE PISTONE
= M1.0

END_FB2

Nel piccolo esempio il valore della M1.0 in FB1 può valere 1 ma nel FB2 può valere anche 0

Prendi come regola, di non assegnare più di una volta, in tutto il programma una memoria o un uscita PLC.

Inserita:
Nel piccolo esempio il valore della M1.0 in FB1 può valere 1 ma nel FB2 può valere anche 0

Prendi come regola, di non assegnare più di una volta, in tutto il programma una memoria o un uscita PLC.

Ok è chiaro, se m1.0 md1 mw1 in scittura (OUT) su più FB non vabene.

Ma in ingresso (IN) m1.0 è settato a 1 deve esserlo per tutti i FB. Giusto?

Inserita:

Se non ho capito male, tu stai cercando di trasferire tutte le informazioni da una FC/FB all'altra utilizzando i parametri.

L'uso dei parametri è comodo e sensato, ma non deve essere spinto all'esasperazione.

Voglio dire, non ha senso costruire una FC/FB, per la gestione completa di una stazione, dove ogni singola informazione viene scambiata come parametro.

Così facendo, si rischia di ottenere una FC/FB con un numero elevato di parametri, che rende la gestione estremamente scomoda.

Del resto se, per esempio, in FC10 imposti il merker M10.0 = 1, in FC11 ti basta leggere lo stato dello stesso M10.0.

M10.0 è sempre lui, in tutto il programma. Sono solo le variabili locali che hanno vita solo all'interno della funzione alla quale appartengono.

Ed è proprio questo che, forse, ti crea problemi.

Ma in ingresso (IN) m1.0 è settato a 1 deve esserlo per tutti i FB. Giusto?

Come già detto, un merker è comune a tutto il programma.

Se tu, come parametro OUT di una funzione imposti M1.0 = 1, e poi in altre parti dl programma a questo povero M1.0 cambi di stato (magari perché lo utilizzi all'interno di un'altra funzione, o come parametro in uscita in altre parti del programma), come puoi pretendere che tutti gli altri FB, se M1.0 è collegato ad un parametro in ingresso, lo leggano sempre = 1?

Una domanda: è possibile vedere un esempio di come si presenta una delle tue funzioni o, almeno, sapere quanti parametri IN/OUT passi?

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