arbez Inserito: 21 settembre 2017 Segnala Share Inserito: 21 settembre 2017 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 More sharing options...
batta Inserita: 21 settembre 2017 Segnala Share Inserita: 21 settembre 2017 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 More sharing options...
arbez Inserita: 21 settembre 2017 Autore Segnala Share Inserita: 21 settembre 2017 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 More sharing options...
lupusimprobus Inserita: 26 febbraio 2018 Segnala Share Inserita: 26 febbraio 2018 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 More sharing options...
arbez Inserita: 26 febbraio 2018 Autore Segnala Share Inserita: 26 febbraio 2018 Grazie lupusimprobus, mi è 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 More sharing options...
lupusimprobus Inserita: 26 febbraio 2018 Segnala Share Inserita: 26 febbraio 2018 Tutto vero Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 26 febbraio 2018 Segnala Share Inserita: 26 febbraio 2018 Arbez, la programmazione ad oggetti è possibile solamente su Simotion, sui PLC non è possibile Link al commento Condividi su altri siti More sharing options...
batta Inserita: 28 febbraio 2018 Segnala Share Inserita: 28 febbraio 2018 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 More sharing options...
arbez Inserita: 28 febbraio 2018 Autore Segnala Share Inserita: 28 febbraio 2018 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 More sharing options...
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