Vai al contenuto
PLC Forum


Creazione Di Funzioni Fc E Loro Successivo Richiamo "multiplo"


Scrim76

Messaggi consigliati

Buongiorno, sto cercando di imparare qualcosina sulla programmazione di PLC Siemens ed ho iniziato guardando i vostri video ( http://www.plcforum.it/portale/video?ids=85). Ho visto che è possibile creare delle Funzioni FC ( Video 7-8-9 ) e richiamarle successivamente all'interno di altre Funzioni etc etc.

Ho pensato che potrebbe essere utile ad un programmino che sto tentando di mettere in piedi, cioè il comando/controllo di una serie di saracinesche tutte uguali ed è per questo che stavo pensando di costruire una singola Funzione alla quale poi "collegherò" differenti ingressi/uscite a seconda di quale saracinesca voglio comandare, attraverso appunto dei richiami "multipli", non so se sono riuscito a spiegarmi chiaramente.. allego comunque una stampa di quanto ho fatto. Il problema è che non mi funziona, o meglio, funziona ma non correttamente.

Praticamente ho creato un Funzione FC1 chiamata Apertura e Chiusura ed all'interno di questa ho creato, attraverso la relativa interfaccia, le variabili Booleane per il suo funzionamento e programmata poi nel modo di funzionamento che mi interessava (pulsanti di apertura/chiusura, pulsante di Stop, autoritenute, finecorsa etc etc), poi ho creato un'altra Funzione FC2 chiamata Manovre Saracinesche ed al suo interno non ho fatto altro che inserire tante FC1 come quante saracinesche devo comandare, logicamente cambiando i vari riferimenti fisici a cui collegare le variabili di aperture, chiusura, stop, finecorsa etc etc inserite all'interno del FC1. Poi ho creato il Blocco Principale OB1 al cui interno non ho fatto altro che richiamare direttamente la Funzione Principale FC2. Per comprendere meglio fate riferimento all'allegato PDF.

Come dicevo però non mi funziona correttamente, infatti se io schiaccio fisicamente il Pulsante collegato all'ingresso I0.0 (Puls1_AP) , oltre a pilotarmi l'uscita Q0.0 (APRI 1), mi pilota anche le altre uscite in Apertura (APRI2 e APRI3), stessa cosa se manovro gli altri pulsanti apertura (Puls2_AP e Puls3_AP), stesso discorso per quanto riguarda la chiusura...

Prima di fare questa prova avevo "provato" a creare una funzione più semplice, cioè un'ingresso che mi pilota direttamente un'uscita ( sempre appoggiandomi alle vari Interfacce della Funzione), poi ho richiamato più volte la stesa funzione all'interno del programma principale e li funzionava.. non capisco perché aggiungendo altre istruzioni (autoritenute etc etc) non funziona allo stesso modo..

Può darsi che dipenda dalla CPU e dal relativo Firmware?

Grazie, saluti e Buona Pasqua a tutto il Forum.

Blocchi di programma.pdf

Modificato: da Scrim76
Link al commento
Condividi su altri siti


Ciao

Dalle immagini sembra ok faccio delle prove poi ti dico ,altrimenti vale la pena di creare un FB in modo che ad ogni richiamo tu abbia un db di istanz adiverso , dove vengono memorizzati i dati della funzione.

ho provato anche con FB stesso problema , faccio esperimenti e vi dico

Fatte varie prove ma in effetti le uscite vengono pilotate assieme , provati anche set e rest per le uscita ma non risolto.

qualcuno ha idea perchè ?

Modificato: da Frank681
Link al commento
Condividi su altri siti

Mattia Spoldi

il problema è che stai usando delle variabili temporanee in lettura senza scriverle prima, se dichiari le variabili app_apertura e app_chiusura come in_out e le appoggi a delle merker o converti l'fc in un fb e le fai diventare statiche dovrebbe funzionare

Link al commento
Condividi su altri siti

Ciao, grazie per l'interessamento.

Cioè il problema dovrebbe essere che ( per esempio facendo riferimento al primo segmento delFC1) io vado a leggere lo stato di #app_chiusura (negato) prima di avergli dato un valore?

Ho capito giusto?

Grazie

Link al commento
Condividi su altri siti

Giuseppe Signorella

Le variabili locali sono variabili "temporanee". Nel senso che sono valide solo ed esclusivamente durante l'esecuzione del blocco in cui sono state dichiarate. Si può dire che nascono all''apertura del blocco e muoiono alla chiusura.

L'area di memoria nel quale vengono allocate è comune per tutti i blocchi. Per tale motivo queste variabili devono essere scritte prima di essere lette, altrimenti possono assumere valori casuali, (che poi proprio casuali non sono) perchè potrebbero contenere valori di precedenti allocazioni.

Ciao e buona pasqua.

Link al commento
Condividi su altri siti

Grazie mille a tutti, quindi penso che per evitarmi qualsiasi problema riscrivo il lo stesso identico codice come FB anziché FC e le uso come variabile Statiche invece che Temp e poi vi faccio sapere (ora purtroppo non ho per il PLC sottomano).

Ciao, grazie

Link al commento
Condividi su altri siti

Ciao, grazie ancora per i consigli.

Alla fine ho riscritto lo stesso identico codice in un blocco FB (..identico per modo di dire perché avevo trovato un errorino di battitura che comunque, anche dopo averlo corretto, non funzionava ugualmente il codice scritto all'interno di un FC), le variabili di "appoggio" (app_apertura e app_chiusura) le ho messe come static (perché?) invece che temp ( che differenza c'è? ), ad ogni FB richiamato ho creato il relativo DB di istanza e pare funzionare...A questo punto inizio a "perder credibilità" negli FC .. ah ah ah ah ..

Ma forse meglio così perché uno dei prossimi passi sarà portare tutto su Scada/Pannello Operatore/WebServer... quindi magari alla fine i DB mi mi servivano lo stesso, anche perché poi all'interno dei blocchi FB ( in futuro) implementerei segnali analogici con le posizioni percentuali delle saracinesche sempre poi da visualizzare su Scada/Pannello Operatore/WebServer

Grazie ancora a tutti

Link al commento
Condividi su altri siti

francesco-ottosei

Per risolvere il problema,visto che ci stai prendendo mano adesso sul funzionamento degli fc, prova ad azzerare il valore dei dati temporanei all'inizio del tuo fc..

comunque ok la trasformazione in fb...ma senza buttare quanto fatto con l fc(e per eventualmente per le prox volte)prova a fare con ti ho suggerito...

Link al commento
Condividi su altri siti

Mattia Spoldi

se dovessi azzerare i dati all'inizio dell'fc poi non ti funziona l'autoritenuta, servono per forza memorie non volatili come statiche, in_out o merker

Link al commento
Condividi su altri siti

francesco-ottosei

Hops...non mi ero accorto...comunque sostituire app_apertura e chiusura con direttamente le uscite...??cosi non usi temporanei...(se proprio si vuol usare l'autoritenuta)..

Link al commento
Condividi su altri siti

Ciao Francesco, avevo provato anche così ma mi pare non mi funzionava.

Grazie comunque, in effetti preferirei imparare anche solo coni FC anziché usare FB, nel caso non mi servisse creare dei DB.

Ciao

Link al commento
Condividi su altri siti

le variabili di "appoggio" (app_apertura e app_chiusura) le ho messe come static (perché?) invece che temp ( che differenza c'è? )

La differenza te l'ha già spiegata Giuseppe nel post #5.

Una variabile locale (TEMP) utilizza un'area di memoria che, una volta usciti dalla funzione, viene considerata libera dal sistema. Questo significa che un'altra funzione può (e stai certo che lo farà) utilizzare la stessa area di memoria.

Quindi, se abbandoni una funzione, quando rientri il valore delle variabili TEMP non sarà più quello che tu avevi scritto, perché sicuramente qualche altra funzione lo avrà modificato.

Le variabili STAT invece vengono scritte nel DB di istanza.

.A questo punto inizio a "perder credibilità" negli FC

Non è una questione di "credbilità". Per certi scopi vanno bene le FC, per altri si devono usare le FB.

comunque sostituire app_apertura e chiusura con direttamente le uscite...??

Ciao Francesco, avevo provato anche così ma mi pare non mi funzionava.

Funziona se le uscite le dichiari non come variabili OUT, ma IN_OUT.

Per poter fare l'autoritenuta è indispensabile non solo scrivere il valore dell'uscita, ma anche leggerne lo stato.

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