Fulviodelmulino Inserito: 15 aprile 2011 Segnala Inserito: 15 aprile 2011 Premetto che nonostante siano quasi 15 anni che uso i PLC SIEMENS mi sono reso conto di avere lacune "basilari".Purtroppo spesso ho dovuto adeguarmi, modificare o rifare, programmi con strutture già definite e fatte da altri,per questo non mi ero mai posto troppe domande sulla corretta gestione delle risorse.. d'altronde funzionavatutto.. il compilatore non riportava errori.Ma andiamo al dunque:mi è sempre stato detto che agli FB si può appoggiare uno o più DB di istanza..dicendomi che ciò serve ad associareun determinato DB ad un FB per evitare quando si usa l'FB l'operazione di aprertura del DB all'interno dell'FB stessoottimizzando i tempi di esecuzione programma ecc. ecc. e sulla base di questo e sul fatto che ho messo le mani su centinaia di progetti (in STEP7 cpu serie 300 per capirsi) che avevano una miriade di FB.. ai quali non corrispondevanessun DB dichiarato come sua "istanza" io sono andato avanti pensando (a torto) che questi benedetti DB di istanza fossero del tutto facoltativi.. ora parlando con altri tecnici scopro che non è così, scoprire l'ho scoperto, ma nonho ancora trovato nessuno che mi abbia spiegato chiaramente come funzionano le cose.. e l'. mi appare un po'troppo faraginoso.Allora chiedo cortesemente, sperando di non avere ripetuto un argomento già trattato (se così fosse vi prego didirmi dove leggerlo e lo farò), qualcuno sa dirmi dove trovo questi dati di "istanza" relativi ad un FB... senzache io abbia espressamento creato alcun DB di istanza??Faccio un esempio pratico.. in un progetto in Step 7 v.5.4 su CPU315, vado ad aggiungere un FB, facciamo FB12, dentroa FB12 scrivo alcune righe di codice AWL e non metto nessuna variabile Stat, in o out interna a FB12, poi faccio ciclarea OB1 il mio FB12, fine. Ok tutto apparentemente corretto.Domande:1) Dov'è il DB istanza del mio FB12?? io non l'ho creato.2) Che variabili ci sono nel DB di istanza di tale DB?? se avessi delle variabili (in, out in/out, stat) interne all'FB penserei che ci sono quelle.. ma se non ho variabili definite internamente all'FB chi ci finisce nell'istanza??Credo di avere un po'di confusione... grazie in anticipo a chiunque sarà così gentile da darmi qualche dritta e delucidazioneSaluti
Fulviodelmulino Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 mi sovviene di fare una precisazione.. sulla guida di step 7 è espressamente indicato che al richiamo (call) di una FB deve essere precisato il relativo DB di istanza ad essa associato:esempio,in AWL se voglio chiamare il mio FB12 con annesso un ipotetico DB7 di istanza devo scrivere: UC FB12,DB7ecco.. riallacciandomi alla mia domanda.. la cosa che mi risulta strana è che io posso tranquillamente richiamare FB12 senza fare alcun riferimento al DB di istanza, se scrivo: UC FB12al compilatore va benissimo, e allora... chi è l'istanza di FB12 in questo caso?scusate se sono stato prolisso, intendevo solo essere il più chiaro possibile Saluti
Fulviodelmulino Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 Scusate se come si dice... "me la canto e me la suono" con questo argomento, ma provando e riprovando ho notato che...il comando UC per chiamare una DB è espressamente sconsigliato in quanto non prevede passaggio di DB di istanza, boh, io me lo sono trovato così e non mi ero mai posto il problema poi ho notato che se creo un DB di istanza a un FB e metto delle variabili locali in testa a tale FB me le ritrovo automaticamente nel DB di istanza.Quindi deduco.. e ditemi se sbaglio... i DB di istanza hanno sostanzialmente la funzione di mantenere in modo statico le variabili interne a un FB, cosa che non succede con gli FC che hanno dati interni "volatili" e validi solo nel momento dell'uso dell'FC stesso.Ergo.. in tutti i programmi in cui devo mettere mano è stato fatto un uso improprio delle FB? usate senza DB di istanza e sostanzialmente come fossero degli FC?strano è che nessuna segnalazione da parte del compilatore sia mai stata data.. spero non vi siano controindicazioni di sorta a questo errore formale, se di questo si tratta..
batta Inserita: 15 aprile 2011 Segnala Inserita: 15 aprile 2011 Faccio un esempio pratico.. in un progetto in Step 7 v.5.4 su CPU315, vado ad aggiungere un FB, facciamo FB12, dentroa FB12 scrivo alcune righe di codice AWL e non metto nessuna variabile Stat, in o out interna a FB12, poi faccio ciclarea OB1 il mio FB12, fine. Ok tutto apparentemente corretto.Non ho mai provato a creare una FB senza dati IN-OUT-IN/OUT-STAT, perché non ha senso.Se non hai dati STAT, utilizza una FC al posto di una FB.L'istruzione UC va bene per il richiamo di FC senza parametri.In tutti gli altri casi si deve usare l'istruzione CALL.Credo che il compilatore non segnali errore se si richiama una FB con l'istruzione UC perché il DB di istanza potrebbe essere aperto prima del richiamo con l'istruzione AUF.L'istruzione AUF infatti serve sia per aprire i DB di dati globali, sia i DB di istanza. Contemporaneamente possono essere aperti un DB globale e un DB di istanza.Dovrebbe quindi funzionare, ma non ho mai provato.In ogni caso, si tratterebbe di una procedura anomala, utile solo per complicarsi la vita.Quindi deduco.. e ditemi se sbaglio... i DB di istanza hanno sostanzialmente la funzione di mantenere in modo statico le variabili interne a un FB, cosa che non succede con gli FC che hanno dati interni "volatili" e validi solo nel momento dell'uso dell'FC stesso.In sostanza, sì. Con alcune precisazioni:- anche i blocchi FB hanno dati TEMP che non vengono appoggiati al DB di istanza- nel DB di istanza, oltre ai dati STAT, ci sono anche IN, OUT e INOUT- se si richiama un blocco FC con parametri, i parametri vanno inseriti tutti, mentre con un blocco FB non c'è questo obbligo. Inoltre è possibile scrivere e leggere i dati direttamente dal DB di istanza
Fulviodelmulino Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 Grazie batta!!sei stato molto chiaro...Non ho mai provato a creare una FB senza dati IN-OUT-IN/OUT-STAT, perché non ha senso.ecco.. avevo il sentore fosse così.. la tua conferma mi dà ragione, purtroppo come premesso all'inizio mi sono trovato a dover gestire e manutenere una serie di progetti (ma non pochi!!!) già attivi e funzionanti su altrettanti impianti e macchine in giro per il globo... ebbene in questi progetti, sostanzialmente sono usati solo FB, richiamati TUTTI rigorosamente con "UC" e non CALL come buona logica vorrebbe, i DB presenti sono globali e aperti qua e là dove serve (con AUF appunto) all'interno delle FB stesse...Ormai.. non capisco ma mi adeguo.Rinnovo ringraziamenti e saluti!!ciaoFulvio
Fulviodelmulino Inserita: 15 aprile 2011 Autore Segnala Inserita: 15 aprile 2011 Credo che il compilatore non segnali errore se si richiama una FB con l'istruzione UC perché il DB di istanza potrebbe essere aperto prima del richiamo con l'istruzione AUF.Ah a proposito solo per curiosità e visto che ho provato voglio condividerlo con tutti.. la cosa che infatti mi è parsa strana... il compilatore non segnala errore non solo se si chiama un FB con la funzione "UC" senza aver aperto preventivamente alcun DB di istanza tra l'altro.. ma non ha nessun problema a digerirsi gli FB di cui non esiste alcun DB di istanza! Purchè sia chiaro vengano richiamati mediante richiamo incondizionato (UC appunto) e non richiamo classico "CALL"provare per credere... Ciao
Fulviodelmulino Inserita: 12 luglio 2011 Autore Segnala Inserita: 12 luglio 2011 Riecco che mi affiorano dubbi, ora che è l'occasione di mettere ordine in alcuni vecchi codici...Come premesso in questo stesso topic, ho visto molti programmi che usano le FB senza un proprio DB di istanza (e questo mi dicono essere formalmente inutile).. detto cio' mi chiedo: potreste per cortesia farmi un esempio pratico di quando serve avere un FB rispetto a un FC? cioè a che serve avere un DB di istanza che mantenga lo stato delle variabili IN/OUT, INOUT.. per esempio se faccio..CALL FC10IN1_BOOL:=M100.0IN2_BOOL:=M100.1OUT_INT1:=DB10.DBW2passo i bit M100.0 e M100.1 come ingressi booleani che avranno il valore opportuno nel momento in cui lancio la mia FC, la FC mi ritornerà il valore intero "OUT_INT1"che io andro' a mettere dentro un bit di un mio DB globale (nell'esempio DB10)... e allora? a che mi sarebbe servito usare un FB e DB di istanza?So che probabilmente rappresenta una banalità, ma la cosa mi crea un po' di confusione.Saluti.
pigroplc Inserita: 12 luglio 2011 Segnala Inserita: 12 luglio 2011 Avere una DB di istanza agevola la standardizzazione di una struttura dati omogenea per tutto l'applicativo.Faccio un esempio:Ho 60 motori collegati con una CPU, se creo un blocco che mi gestisce l'interfaccia con i motori ho la certezza per esempio che il flag di start è sempre lo stesso all'interno della DB, così come le quote, le ore di funzionamento, il numero di ore alla prossima manutenzione ecc.Con questo non è detto che con le FC non si possa fare, anzi, passando come parametro formale il DB ottieni lo stesso risultato.Giocano a questo punto un ruolo fondamentale i gusti di colui che sviluppa il programma.pigroplc
Fulviodelmulino Inserita: 12 luglio 2011 Autore Segnala Inserita: 12 luglio 2011 grazie pigroplc..in sostanza avrei comunque bisogno di creare tot DB di istanza quanti sono i motori standard da trattare con la mia FB... a questo punto e' come dici tu solo questione di gusti.Comunque su un DB di istanza avrò solo le variabili in testa all'FB dedicato, mentre su un DB globale ho molta più libertà d'azione... tanto vale usare i DB globali e aprirli quando serve.. o no? Cosa mi sto perdendo?Scusate la cocciutaggine ma vorrei togliermi ogni incertezza su questo punto.
pigroplc Inserita: 12 luglio 2011 Segnala Inserita: 12 luglio 2011 Riprendiamo l'esempio che ho menzionato nel thread precedente:Se ho la visualizzazione su HMI dei miei 60 motori posso molto agevolmente preparare una pagina video dove visualizzo le variabili relative al motore stesso:velocità, direzione, ore di funzionamento ecc ecc.Con una semplice indicizzazione io visualizzo i dati di tutti i motori semplicemente cambiando il numero del motore stesso:per esempio:motore 1 : indicizza la DB 101motore 2 : indicizza la DB 102La stessa cosa la posso fare con la FC, ripeto basta inserire nel richiamo il parametro della DB del motore e il risultato è il medesimo, se la funzione è definita e non la devi più modificare non cambia nulla, se non il fatto che le DB di istanza poi non le modifichi in estensione dall'esterno.io con le DB di istanza ci faccio pure le catene sequenziali, quindi come vedi è una questione di gusti.....pigroplc
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