Vai al contenuto
PLC Forum


Accesso ai parametri del blocco di un fb fc durante elaborazione del programma


G.esse

Messaggi consigliati

Buongiorno sto leggendo un manuale e non riesco a capire su cpu 1200 1500 siemens, come avviene l accesso ai parametri durante l esecuzione del programma, in foto viene spiegato che le modalità sono due, ma quale delle 2?  E come si capisce in fase di programmazione di fb e fc? Come verranno scansionati? 

IMG_20210417_125111.jpg

Link al commento
Condividi su altri siti


I blocchi "fb" e "fc" vengono richiamati dal programma utente. L'ordine di esecuzione dipende esclusivamente dal programma utente.

 

Quanto espsosta dal manuale significa semplicemente che il bloco lavora con l'area di memoria locale, quindi i parametri di ingresso vengono copiati nelle variabili del blocco e similmente i parametri di uscita.

 

Faccio un esempio generico che ciarisce la dinamica.

 

blocco moltiplicazione:

risultato = mul( moltiplicando, moltiplicatore)

Ad un certo punto del programma necessiti di calcolare la circonferenza noto il diametro, così chiamerai:

circonferenza = mul( diametro, pi).

diametro è il valore del diametro che, ad esempio, hai misurato tramete un trasduttore, ed è memorizzato nel blocco dati del tuo OBxx, sempre come esempio; pi è una costante memorizzata sempre nel medesimo blocco dati, criconferenza è una variabile memorizzata nel medesimo blocco dati.

Quando chiami "FC mul" questi copierà diametro e pi in due variabili della sua area dati, eseguito io calcolo andrà a copiare il risultato nella variabile circonferenza.

Ogni volta ch e tu nel programma richiamerai la funzione "mul", magari per calcola re un'area o un peso, passerei i 2 parametri e ti ritornarà il rusultato nella variabile che avrai specificato.

 

Questa è una prassi normale per tutti i linguaggi in cui è possibile usare subroutine o funzioni parametriche. Si opera nel medesimo  modo in "C", "VB", "C#", "C++" e via elencando.

Le funzioni usano aree di memoria dinamica, area che è allocata alla funzione solo nel tempo in cui la funzione è attiva, poi questa stessa area può essere usata dal un'altra funzione.

Se invece definisci alcune variabili e costanti come globali, queste vengono asseganate ad una specifica locazione di memoria; questa locazione è usata esclusivamente da quella variabile.

Nel linguaggio siemens, poi bisogna tener conto che le aree di memoria sono assegnate in base ai "db" (data bloc). ma su questo potranno essere più precisi gli specialisti di siemens.

Link al commento
Condividi su altri siti

Grazie per la risposta, si mi sembra chiaro il concetto che hai esposto nella premessa che hai esposto. 

Però non mi sembra chiaro il modo in cui è spiegato sul libro. 

 

C'è l esecuzione di un fb ed fc avviene con una specie di immagine di processo? che sono i valori rilevati al istanza di richiamo del fb o fc?  

 

Link al commento
Condividi su altri siti

Probabilmente manca una parte del manuale.

Comunque, funziona così:

- Se alla funzione (FB o FC) passi i parametri come INPUT o come OUTPUT, viene creata una copia delle variabili nell'area di memoria della funzione

- Se alla funzione (FB o FC) passi dei parametri tipo Bool, Int, DInt, ecc. come IN/OUT, ugualmente viene creata una copia

- Se alla funzione (FB o FC) passi come IN/OUT strutture o array, viene creato un puntatore. Ai fini pratici dell'utilizzo della scrittura del programma, poco cambia, ma l'accesso a dati complessi (soprattutto se di dimensioni notevoli) come puntatore (quindi senza fare la copia dell'intera area), è più efficiente in termini di tempi di accesso alle variabili.

 

Link al commento
Condividi su altri siti

Grazie per la risposta, vorrei esporre altri dubbi che mi sono venuti:

 

L istanza/richiamo per un determinato blocco( fb o fc) determina sempre la rilevazione dei  nuovi valori dei parametri del blocco che verranno elaborati al suo interno? 

Ogni volta che lo richiamo rileva valori aggiornati giusto? 

 

La memoria in cui il blocco salva questi dati e visualizzabile da utente o è interna e non si vede? 

 

Un ultima domanda, si può pensare che le variabili temp valgono solo per il richiamo del blocco poi i valori si perdono a fine esecuzione di un fb fc? 

Per mantenere valori si usano le static? 

È sempre così con accesso ottimizzato o standard?

 

 

 

Link al commento
Condividi su altri siti

2 ore fa, G.esse scrisse:

Ogni volta che lo richiamo rileva valori aggiornati giusto? 

Certo che sì.

 

2 ore fa, G.esse scrisse:

La memoria in cui il blocco salva questi dati e visualizzabile da utente o è interna e non si vede? 

Se sei all'interno della funzione, vedi tutte le variabili della funzione stessa.

Dall'esterno, dipende. Una FB ha un blocco dati associato, il DB di istanza, che è accessibile come qualsiasi dato globale.

Nel DB di istanza trovi tutte le variabili dichiarate come INPUT, OUTPUT, STAT, e quelle IN/OUT dichiarate come "dati semplici", per le quali viene fatta una copia.

Le variabili TEMP, sia per le FC che per le FB, sono visibili solo all'interno della funzione.

Le FC non hanno DB di istanza, e i dati della FC non sono accessibili dall'esterno.

Link al commento
Condividi su altri siti

19 minuti fa, batta scrisse:

per le quali viene fatta una copia.

Fatta una copia del valore attuale dei parametri del interfaccia intendi giusto? 

 

Quindi se ho un fb con relativo DB di istanza in un segmento. 

 

Nel segmento successivo dichiarando un fc posso farlo lavorare con i dati raccolti dal fb precedente? 

 

Ci sono vantaggi in termini di tempo di ciclo con questo tipo di programmazione? Oppure lavorando con variabili globali e la stessa cosa? 

 

 

Link al commento
Condividi su altri siti

Ciao,

mi intrometto, anche se Batta ne sa sicuramente più di me; penso che i blocchi FB e FC sono comparabili ad una funzione C++ che, appunto, svolgono una determinata funzione; l'accesso alle variabili utilizzate internamente, oltre a creare confusione, potrebbe anche risultare in comportamenti anomali; i vantaggi non li conosco, e personalmente ritengo che ci siano solo svantaggi, come dicevo. In sostanza, quando scrivo un FB o FC per me è come una scatola nera: gli dai in pasto di parametri in ingresso e ti aspetti una uscita; se i parametri sono molti, cerco di raggrupparli in una struttura, in modo da facilitarne l'utilizzo, ma niente di più.

Link al commento
Condividi su altri siti

Secondo me questi problemi nascono perchè non si hanno le giuste basi di programmazione.

Quando si hanno le conoscenze fondamentali delle tecniche di programmazione questi problemi si superano istantaneamente.

Si devono solo capire alcune percurialità del lenguaggio che si sta usando e quelle della macchina su cui dovrà girare il programma.

Che sia un PLC, un PC, un micro dedicato ha poca importanza: certi concetti fiondamentali sono comuni ai vari linguaggi ed ai vari compilatori.

 

Per conto mio se si vuole programmare bene i PLC è meglio farsi prima una cultura generale di programmazione.

Link al commento
Condividi su altri siti

2 ore fa, drugo66 scrisse:

cerco di raggrupparli in una struttura

Sì ma, una volta raggruppati in una struttura, hai due possibilità: passarli come IN/OUT, quindi saranno appoggiati ad un DB globale, o creare una struttura nelle STAT della funzione, e quindi le troverai nel DB di istanza della funzione stessa.

A seconda dei casi, seguo entrambe le strade. Comunque, non ci vedo assolutamente nulla di male nel poter accedere direttamente alle variabili del DB di istanza.

Esempio: cosa c'è di diverso nello scrivere un valore in una variabile "DB_Globale".MiaStruttura.MiaVariabile, o scrivere nel DB di istanza "DB_Istanza".MiaStruttura.MiaVariabile?

 

Modificato: da batta
Link al commento
Condividi su altri siti

2 ore fa, batta scrisse:

"DB_Istanza".MiaStruttura.MiaVariabile?

Posso creare una struttura dichiarando dati struct sia in  DB globale che in locale( fb fc) e al  interno della struct posso dichiarare I diversi tipi di dati che mi servono? Giusto? 

 

 Seguo,grazie. 

 

 

 

 

Modificato: da G.esse
Link al commento
Condividi su altri siti

3 ore fa, batta scrisse:

Esempio: cosa c'è di diverso nello scrivere un valore in una variabile "DB_Globale".MiaStruttura.MiaVariabile, o scrivere nel DB di istanza "DB_Istanza".MiaStruttura.MiaVariabile?

 

Probabilmente nulla, ma a me non piace il concetto; preferisco strutturare il programma in modo che quei dati siano in un DB globale e che, ovviamente, il nome stesso del DB riconduca ai dati stessi che contiene; probabilmente, non ho mai verificato, facendoli risiedere nella stessa DB di istanza si ottiene anche un risparmio di memoria, è solo che a me non piace, tutto qui.

Link al commento
Condividi su altri siti

3 ore fa, drugo66 scrisse:

Probabilmente nulla, ma a me non piace il concetto;

Da un puntoi di vista puramente filosofico, anch'io preferirei passare tutto come parametri, e non accedere direttamente ai dati del DB di istanza. Ma la filosofia talvolta si scontra con la praticità.

Per esempio, creo una FB per la gestione di un motore, ed appoggio variabili di stato in una struttura, nell'area STAT, che chiamo Status. So che nel DB di istanza di quella funzione, nella struttura Status mi trovo le variabili di stato, tipo MotorePronto, PresenzaAllarme, VelocitàAttuale, ecc.

Perché dovrei appoggiare questi stessi dati in un DB globale?

Per inciso, a volte lo faccio, ma valuto caso per caso, e non ci trovo nulla di scandaloso nell'accedere direttamente al DB di istanza. Anzi, è una grande comodità.
 

Link al commento
Condividi su altri siti

  • 2 weeks later...

@battaPosso creare una struttura dichiarando dati "struct" sia su un  DB globale( es dbx) che in locale nel interfaccia del blocco(es variabili static di fb fc) ed al  interno del tipo struct posso dichiarare I diversi tipi di dati che mi servono? e questo che si intende per struttura  ?

 

grazie

Modificato: da G.esse
Link al commento
Condividi su altri siti

il 18/4/2021 at 22:49 , batta scrisse:

Per esempio, creo una FB per la gestione di un motore, ed appoggio variabili di stato in una struttura, nell'area STAT, che chiamo Status. So che nel DB di istanza di quella funzione, nella struttura Status mi trovo le variabili di stato, tipo MotorePronto, PresenzaAllarme, VelocitàAttuale, ecc.

un po quello che hai citato qui?

 

@batta

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