Vai al contenuto
PLC Forum


istanza di FB e variabili private


arbez

Messaggi consigliati

Ciao, chiedo un consiglio sul corretto utilizzo dei blocchi funzionali. 

Ho un blocco la cui interfaccia prevede alcune variabili di input /output e alcune variabili di tipo static, quando richiamo il blocco ad es. nel OB1 l'ambiente di sviluppo mi permette di accedere anche alle variabili dichiarate come static. 

Venendo da altri linguaggi di programmazione a oggetti (C++/python/php) trovo questa caratteristica abbastanza pericolosa in quanto inavvertitamente si potrebbe modificare il valore di variabili interne al blocco, sbaglio qualcosa nell'approccio? 

Grazie in anticipo

Link al commento
Condividi su altri siti


Non mi pare sia così semplice "inavvertitamente" modificare variabili interne al blocco. Ci sono le stesse possibilità che si hanno di modificare "inavvertitamente" le variabili di un qualsiasi DB, di istanza o globale che sia, o di passare un parametro sbagliato in ingresso alla funzione.
Il fatto che si possa fare fa storcere il naso a chi è abituato ad altri linguaggi come quelli da te citati ma, il fatto che si "possa" fare, non significa che si "debba" fare.

Se non ti piace accedere direttamente ai dati del DB di istanza, non lo fare.

Personalmente preferisco organizzare i dati da scambiare come parametri. A volte però questi parametri sono così tanti che diventano scomodi da gestire.
Ecco che organizzo i dati da scambiare in struct nell'area stat, e accedo direttamente dal DB di istanza. A qualcuno potrà non piacere, ma risulta estremamente comodo. E, sinceramente, non vedo controindicazioni di sorta.

Link al commento
Condividi su altri siti

Grazie per il chiarimento, quindi vene lasciata totale libertà al programmatore di strutturare il codice che sia il più possibile esplicativo. Forse la mia sorpresa deriva dal fatto di cercare delle similitudini tra un FB in siemens e una "classe" in altri linguaggi a oggetti. La chiara distinzione tra variabili pubbliche e private venne di fatto creata per migliorare la leggibilità del codice e permettere al compilatore di rilevare errori nell'accesso ai parametri. migliorare la cooperazione tra diversi programmatori .

Quindi se ho ben capito posso scrivere qualcosa di simile a quì sotto senza che il compilatore mi riporti alcun errore.

pippo_FB
input:
   A int   
   B int
out:
  C int
static:
  B1 bool  //bit di appoggio per calcoli interni al blocco 
  
................
pippo_FB_istanza1(a:=10,b=20);
pippo_FB_istanza1.B1:=10;   // errore non segnalato dal compilatore

 

Hai da consigliare qualche lettura sul corretto stile di programmazione in step7/TIA?

Link al commento
Condividi su altri siti

  • 5 months later...

Un chiarimento.
Le variabili STATIC sono quelle che differenzano un FB da un FC (gli FC non hanno l'area per dichiarare variabili STATIC ma solo TEMP).
La differenza tra una variabile dichiarata in STATIC rispetto ad una dichiarata in TEMP è che la prima mantiene il proprio valore nelle varie scansioni.
Un esempio: Se provi ad utilizzare un fronte di salita con una variabile TEMP questi non funzionerà. Funzionerà invece se utilizzi una variabile STATIC.

Quando inserisci un FB ti viene richiesto di dichiarare anche il proprio DB di istanza che ti permette di allocare memoria per il funzionamento dell'FB. Questo può confondere un programmatore abituato a ragionare ad oggetti.
Gli FB hanno tutte le variabili pubbliche e questo li differenzia da una Class propriamente detta.

L'unica cosa che puoi fare è creare una Struct "Public" ed una "Private" per chiarire all'utente cosa toccare o cosa no ma nulla di più.

Spero di essere stato utile.

Link al commento
Condividi su altri siti

Grazie lupusimprobusmi è chiarissima la differenza tra static e temp, sono sempre stato molto sorpreso che anche nel recente TIA portal non si possa fare  distinzione tra variabili pubbliche e private, in questo modo anche utilizzando un FB banale è possibile fare grossolani errori.

 

Link al commento
Condividi su altri siti

Quote

in questo modo anche utilizzando un FB banale è possibile fare grossolani errori.

E perché? Cos'è che ti fa fare confusione? Il fatto che le variabili STATIC vengano scritte nel DB di istanza, e siano quindi "pubbliche"? Ma nessuno ti obbliga ad accedere direttamente al DB di istanza. E poi, anche facendolo, dov'è la confusione? Se ho tre DB di istanza, "DB_Ist_Macchina_1", "DB_Ist_Macchina_2" e "DB_Ist_Macchina_3", ed accedo direttamente, per esempio, alla variabile "DB_ist_Macchina_1".Pippo, cosa è che non è chiaro? Cosa cambierebbe se la variabile "Pippo" non fosse visibile dall'esterno della funzione?

 

Prova a fare un esempio, e spiega cos'è che ti mette nella condizione di fare grossolani errori.

Link al commento
Condividi su altri siti

La confusione non è certo nelle istanze, un esempio potrebbe essere questo:

FUNCTION_BLOCK "Blocco_1"
   VAR_INPUT 
      start : Bool;
   END_VAR
   VAR 
      variabile_pubblica : Bool;    
      variabile_privata  : Bool; // valore intermedio di calcolo
   END_VAR
BEGIN
END_FUNCTION_BLOCK

in pratica l'unica informazione è contenuta nel nome della variabile, se voglio rendere il codice migliore posso mettere "variabile pubblica" come parametro.

quando iniziai questa discussione cercavo di fare una cosa di questo tipo:

FUNCTION_BLOCK "Blocco_1"
   VAR_INPUT 
      start : Bool;
   END_VAR
   VAR 
      PUBLIC
		variabile_pubblica : Bool;    
      PRIVATE
		variabile_privata  : Bool; // valore intermedio di calcolo
   END_VAR
BEGIN
END_FUNCTION_BLOCK

studiando del codice scritto da alcuni colleghi più esperti di me nel mondo Siemens ho notato che la "loro" tendenza è di manipolare direttamente i dati sulle DB di istanza senza avere parametri di blocco, metodo comodo ma se commetti una svista e accedi alla variabile sbagliata potresti perderci un sacco di tempo in debug se non qualche danno al macchinario.

Con altri PLC hai le FB ma non hai accesso ai dati STATIC  del blocco, maggior protezione ma minor flessibilità !

Come dicevo all'inizio della discussione sarebbe bello che il compilatore avesse la possibilità di segnalare anche questo tipo di errori.

 

 

 

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