Jump to content
PLC Forum


Sign in to follow this  
luca959697

Che Cos'è L'area Di Periferia Del Plc E Perchè Fb Può Avere Un Solo E Non Più Db Di Istanza?

Recommended Posts

luca959697

Come si intuisce dalla domanda sono alle prime armi con la programmazione del plc s7-300.


E che cosa sono e a che cosa servono rispettivamente le variabili temporanee, statiche e di ritorno? Qual'è la differenza tra le variabili temporanee e quelle statiche?

Share this post


Link to post
Share on other sites

drugo66

Ciao,

Cos'è l'area di periferia del PLC: quando utilizzi, ad esempio, un modulo di ingresso analogico e lo aggiungi nella configurazione hardware. il software assegna automaticamente (le puoi anche cambiare) delle aree di memoria agli ingressi analogici presenti nel modulo, che è possibile richiamare con PEWn, dove n è l'indirizzo (ad esempio PEW260); P sta per perifica, E sta per ingresso e W sta ovviamente per WORD; ovviamente, a seconda del modulo, puo' anche esistere una PAWn (dove A sta per uscita); se non sai cos'è un'area di memoria, immagina un classificatore a cassetti: quando devi leggere una variabile la CPU apre il cassetto con il numero corretto (=indirizzo di memoria) e ti "consegna il contenuto" (=valore della variabile), quando, invece, devi scrivere, sei tu a "consegnare un contenuto" alla CPU che lo mette nel cassetto corretto.

Perchè un FB puo' avere un solo DB di istanza: questa mi torna nuova, perchè il blocco FB nasce proprio per essere utilizzato con più DB; se devi scrivere un ciclo che comanda n motori, tutti con il medesimo funzionamento, scrivi il tuo FB per il funzionamento, poi, quando effettui le chiamate al blocco (una per ogni motore), ogni volta cambi DB di istanza ed ottieni il tuo ciclo di funzionamento per N motori, con un solo blocco FB ed N DB di istanza; se, invece, intendevi che chiamando un blocco FB puoi definire un solo blocco DB di istanza, onestamente non lo so, ma perchè complicarsi la vita ? In ogni caso con la prossima risposta mi spiego meglio.

Cosa servono le variabili temporanee, statiche e di ritorno e qual'è la differenza tra le temporanee e le statiche: in ogni ambiente di programmazione e con tutti i linguaggi (credo ...) esistono due aree di memoria utilizzabili (queste due ci sono praticamente sempre) e, quindi, due tipi di variabili: globali e locali (o temporanee); le variabili globali si possono utilizzare in qualsiasi blocco o funzione del programma e hanno una vita uguale all'esecuzione del programma; per fare un esempio con un PLC, variabili globali sono i merker (M1.0, MB10, MW100, etc) oppure le variabili definite all'interno di un DB globale (DB10,DBX20.0, etc); le locali, invece, sono dichiarate all'interno di un blocco o funzione, possono essere utilizzate solo all'interno di quel blocco o funzione e, cosa molto importante, esistono da quando si utilizza il blocco a quando il blocco ha termine; praticamente queste variabili utilizzano un'area di memoria transitoria e comune a tutte le funzioni; quando deve essere eseguito il blocco che utilizza queste variabili, la CPU verifica quale aree è libera e la utilizza; quando il blocco termina la sua esecuzione, queste variabili smettono di esistere e l'area di memoria (ricordi il classificatore ?) ritorna a disposizione della CPU che puo' anche utilizzarla per altre variabili locali di altri blocchi; per questo motivo le variabili locali devono sempre essere inizializzate ad un valore certo, altrimenti potrebbero anche assumere un valore casuale e, quasi certamente, per te che scrivi il programma, improprio.

Le variabili statiche, invece, nascono con i blocchi FB: quando scrivi un FB e definisci una variabile static, quando effettuerai la chiamata al blocco e quindi ti verrà chiesto quale DB di istanza assegnare, quella finisce nel DB di istanza; come dovresti sapere, queste variabili non le puoi cambiare dal blocco DB di istanza, ma solo dall'intestazione del blocco FB (nei blocchi FC non puoi dichiarare variabili static: non è previsto nessun DB di istanza); finendo in un blocco DB, hanno una vita uguale a quella delle variabili globali e, anche se non è conveniente perchè sono dedicate a quel blocco FB, sono utilizzabili anche da altri blocchi (almeno credo ...); a questo punto la differenza dovrebbe saltarti agli occhi: le statiche nascono con il programma come le globali (uscendo dal blocco FB mantengono il valore e non sono sovrascritte, a meno che non lo fai tu volutamente), mentre le locali (o temporanee) sono create dalla CPU quando si esegue quel blocco che li dichiara, smettono di esistere quando si esce dal blocco e possono essere utilizzate solo all'interno di quel blocco.

Per variabili di ritorno, non so cosa intendi: quando si scrive un blocco FC o FB, puoi definire variabili con IN (nel blocco le puoi solo leggere), OUT (le puoi solo scrivere) e IN_OUT (le puoi sia scrivere che leggere), più le locali e le static (le static solo se è un blocco FB); quando richiamerai il blocco, dovrai assegnare alle IN, OUT e IN_OUT utilizzate delle variabili che, normalmente, sono globali; le OUT e IN_OUT potrebbero essere quelle che tu definisci variabili di ritorno.

Share this post


Link to post
Share on other sites
batta

Ottima esposizione di Drugo66.

Faccio solo un paio di precisazioni.

Le variabili statiche, invece, nascono con i blocchi FB: quando scrivi un FB e definisci una variabile static, quando effettuerai la chiamata al blocco e quindi ti verrà chiesto quale DB di istanza assegnare, quella finisce nel DB di istanza; come dovresti sapere, queste variabili non le puoi cambiare dal blocco DB di istanza, ma solo dall'intestazione del blocco FB

Con questo intende dire che non puoi aprire il DB di istanza e modificarlo come fai con un DB globale. Il DB di istanza assume fedelmente la struttura delle variabili dichiarate nell'FB.

Da programma comunque è possibile leggere e scrivere il valore di qualsiasi variabile di qualsiasi DB, DB di istanza compresi.

Le variabili statiche, invece, nascono con i blocchi FB: quando scrivi un FB e definisci una variabile static, quando effettuerai la chiamata al blocco e quindi ti verrà chiesto quale DB di istanza assegnare, quella finisce nel DB di istanza; come dovresti sapere, queste variabili non le puoi cambiare dal blocco DB di istanza, ma solo dall'intestazione del blocco FB

C'è anche la possibilità di dichiarare una variabile di ritorno. Di default è dichiarata come "Void", quindi richiamando la funzione non si ha nessun valore di ritorno.

Un possibile utilizzo della variabile di ritorno (che può essere una soltanto) è nel caso si abbia un solo valore in uscita (per esempio, il risultato del calcolo). In questo caso, a piacere, piuttosto che dichiarare una variabile di tipo OUT si potrebbe dichiarare la variabile di ritorno.

Un utilizzo più corretto però consiste nell'utilizzare la variabile di ritorno per dare informazioni sull'esecuzione della funzione.

Nel caso più semplice si potrebbe semplicemente assegnare alla variabile di ritorno valore FALSE se l'esecuzione della FB non è corretta (per esempio, impostazione errata di parametri, divisione per zero, ecc.) e valore TRUE in caso di esecuzione corretta.

Oppure si potrebbe assegnare alla variabile di ritorno un valore che indichi il tipo di errore rilevato nell'esecuzione della FB.

Per esempio:

0 = esecuzione corretta

1 = parametri in ingresso errati

3 = divisione per zero

4 = overflow

...

...

...

In ogni caso, si potrebbe fare la stessa cosa con una variabile OUT.

Se si richiamano funzioni con variabile di ritorno in KOP o in AWL, praticamente non si nota la differenza tra la variabile "RETURN" e una qualsiasi variabile "OUT".

In SCL invece, se c'è una variabile di ritorno, si deve mettere alla sinistra della funzione una variabile alla quale verrà assegnato il valore di ritorno.

RetVal := miaFunzione(IN1:=aaa; IN2:=bbb; OUT => ccc);

Share this post


Link to post
Share on other sites
drugo66

Non sapevo della variabile di ritorno nei blocchi: è proprio vero che non si finisce mai di imparare ...

Share this post


Link to post
Share on other sites
luca959697

Drugo66 ho fatto la domanda sui db di istanza perchè non ho capito bene questa frase: "Per ogni fb ci deve essere una e una sola db di istanza se no si sovrappongono i dati". Mi puoi spiegare questa frase?


e la frase "se un fc1 si appoggia a delle variabili locali e queste variabili temporanee vengono salvate nell'area di memoria, quando arriva fc2 sporca le variabili"

Share this post


Link to post
Share on other sites
luca959697

e che cos'è e come si usa un accumulatore?

Share this post


Link to post
Share on other sites
drugo66

Drugo66 ho fatto la domanda sui db di istanza perchè non ho capito bene questa frase: "Per ogni fb ci deve essere una e una sola db di istanza se no si sovrappongono i dati". Mi puoi spiegare questa frase?

Non so dove hai letto questa frase, probabilmente su qualche manuale, ma ho già provato a spiegarti che il problema non si pone: le variabili che si dichiarano nell'intestazione di un FB finiscono a tutti gli effetti nel suo DB di istanza, quindi a cosa puo' servire un secondo DB di istanza ? Il blocco FB è uno, necessita di un blocco DB di istanza quindi la cosa finisce lì ... ripeto, almeno per me, non sono necessarie altre spiegazioni.

"se un fc1 si appoggia a delle variabili locali e queste variabili temporanee vengono salvate nell'area di memoria, quando arriva fc2 sporca le variabili"

Rileggiti cosa ho scritto sulle variabili temporanee e la loro "vita" in #2 e vedrai che ci arrivi da solo.

e che cos'è e come si usa un accumulatore?

L'accumulatore dovrebbe essere un registro di sistema della CPU con cui è possibile, tra le altre cose, effettuare dei calcoli, usandolo come appoggio intermedio, oppure per i puntatori; come tutti i registri, dovrebbe avere un accesso più veloce alla memoria; lo usi come una variabile qualunque, solo che non hai necessità di dichiararla; nel Siemens S7-300 si chiama AR1, nel 200 AC1.

Share this post


Link to post
Share on other sites
luca959697

Scusa drugo66 ma mi sono espresso male. Ora ci riprova parafrasando le tue parole: quando il blocco fc1 termina la sua esecuzione le variabili temporanee smettono di esistere e l'area di memoria ritorna a disposizione della CPU che puo' anche utilizzarla per altre variabili locali del blocco fc2.

Quindi se fc1 ha terminato la sua esecuzione come fa fc2 a "sporcare" le variabili teporanee di fc1 (essendo quest'ultime non più esistenti)?

Share this post


Link to post
Share on other sites
batta

nel Siemens S7-300 si chiama AR1, nel 200 AC1.

Mi dispiace correggerti, ma AR1 è il registro indirizzi 1.

Per quanto riguarda gli accumulatori, in S7-300 non c'è bisogno di dare un nome all'accumulatore (cosa indispensabile invece in S7-200), perché ogni singola operazione fa già riferimento all'accumulatore.

In particolare, le CPU S7-300 dispongono di due accumulatori a 32 bit.

Nella guida di ogni istruzione è specificato chiaramente come l'istruzione influenzi gli accumulatori.

Per esempio, l'istruzione "L 100" sposta ACCU1 in ACCU2, azzera ACCU1 e poi scrive 100 in ACCU1

L'istruzione "T MW100" trasferisce il contenuto di ACCU1 in MW100 e non modifica gli accumulatori.

Per avere informazioni dettagliate, basta posizionare il cursore sull'istruzione e premere F1.

Oltre alle azioni sugli accumulatori, è specificato anche se e come viene influenzata la parola di stato.

Share this post


Link to post
Share on other sites
drugo66

Batta: Mi dispiace correggerti ...

Assolutamente non dispiacerti: quando ci vuole, ci vuole, mica mi offendo; ho fatto un po' di confusione e me ne scuso ... :senzasperanza:

luca: Quindi se fc1 ha terminato la sua esecuzione come fa fc2 a "sporcare" le variabili teporanee di fc1 (essendo quest'ultime non più esistenti)?

Probabilmente, la frase che hai riportato va intesa nel senso che, se non inizializzi la variabile temporanea che utilizzi in FC1, quando inizia l'esecuzione del blocco, questa puo' assumere un valore precedente alla sua creazione, magari risalente all'uso della stessa area di memoria durante l'esecuzione di FC2 (altro blocco, altra variabile temporanea, ma stessa area di memoria), quindi potrebbe risultare in un bel baco ...

L'esecuzione di un programma è ciclico (almeno nella maggior parte dei casi), quindi se deve eseguire FC2 e poi FC1 (o viceversa), continua a farlo fino a che non metti in stop la CPU.

Share this post


Link to post
Share on other sites
meccanico1

mi accodo con una domanda , durante lo sviluppo di un fb c'è modo di non dovere continuamente muovere l'indirizzamento delle variabili statiche ogni qualvolta si aggiunge una variabile di ingresso o di uscita ?

grazie

Share this post


Link to post
Share on other sites
walterword

se hai ben presente l'architettura di un elaboratore saprai che ci sono vari dispositivi periferici , porte .

I valori di questi registri vengono copiati in opportune aree di memoria della ram , e tramite macro istruzioni fornite in awl o ladder ect vi puoi accedere.Sono locazioni di memoria ram che il sistema operativo del plc riserva per informazioni esterne

Gli accumulatori sono registri della cpu

Share this post


Link to post
Share on other sites
kekkoian

Le variabili statiche, invece, nascono con i blocchi FB: quando scrivi un FB e definisci una variabile static, quando effettuerai la chiamata al blocco e quindi ti verrà chiesto quale DB di istanza assegnare, quella finisce nel DB di istanza

scusate se torno sull' argomento ma non solo le variabili static ma anche quelle di ingresso, uscita e ingresso/uscita definite all' interno di un FB finiscono nel DB di istanza.

Da come mi sembra di capire la differenza tra le variabili di ingresso, uscita e ingresso/uscita definite all' interno di un FC e FB sta nel fatto che quelle definite nell' FB vengono copiate all' interno del DB di istanza e quindi hanno una vita uguale a quelle delle variabili globali mentre nell' FC sono delle temporanee.

Quindi per capire meglio la differenza tra FC e FB bisogna porre l' attenzione non solo sul fatto che l' FB ha in piu le varibili static ma appunto su come le variabili di ingresso, uscita, ingresso/uscita vengono gestite diversamente.

Mi correggete per favore?

Share this post


Link to post
Share on other sites
walterword

io uso sempre variabili globali che passo IN/OUT a blocchi FC .Se mi servono degli appoggi uso quelle locali

Gli FB li uso solo per compiti specifici , PID , Rampa ,Calcolo encoder ect .Le variabili statiche degli FB devono vivere in pace all'interno del loro blocco e mai puntate dall'esterno

Usando FC con parametri IN/OUT si ha un notevole risparmio di memoria e piu velocità

Share this post


Link to post
Share on other sites
batta

Le variabili statiche degli FB devono vivere in pace all'interno del loro blocco e mai puntate dall'esterno

Come principio generale sono d'accordo, ma in alcuni casi ammetto deroghe ;)

Per esempio, una funzione FB di posizionamento che utilizzo spesso ha parecchi dati di setup (direzione richerca home, velocità ricerca home, velocità sincronizzazione, velocità jog, velocità di accostamento, offset cutoff avanti/indietro, velocità massima asse, costante conversione impulsi/mm, ed altro). Si tratta di variabili la maggior parte delle quali vengono impostate durante la messa in servizio e mai più toccate. Troverei alquanto scomodo linkarle tutte come parametri di ingresso, quindi le ho collocate in una struttura "Setup" all'interno della FB.

Da HMI/SCADA accedo direttamente alle variabili "Setup" nel DB di istanza.

Quando ho bisogno di funzioni con queste caratteristiche, adotto sempre questo sistema

Quindi per capire meglio la differenza tra FC e FB bisogna porre l' attenzione non solo sul fatto che l' FB ha in piu le varibili static ma appunto su come le variabili di ingresso, uscita, ingresso/uscita vengono gestite diversamente.

Diciamo che, proprio perché anche le variabili IN, OUT e IN/OUT, sono appoggiate nel DB di istanza, nel richiamo di una FB non è obbligatorio collegare variabili ai paremetri della funzione.

Capire, caso per caso, quando conviene utilizzare una FC oppure una FB non sempre è semplice.

Per esempio, potrei usare sempre FC e tutti i dati che nel caso di una FB finirebbero nell'area "STAT" li potrei dichiarare come IN/OUT ed usare variabili globali esterne alla funzione.

Questo però può andar bene se questi dati non sono molti.

Esempio banale: uno spesso una FC "Timer" che utilizza il tempo di scansione della cpu (oppure un clock). Il tempo trascorso viene appoggiato ad una variabile IN/OUT.

Volendo si potrebbe fare una FB ed utilizzare una STAT per il tempo trascorso.

Capisci però che sarebbe assurdo, per ogni richiamo della funzione, dover generare un DB di istanza (salvo ricorrere a multiistanze), solo per avere l'appoggio di una variabile.

Edited by batta

Share this post


Link to post
Share on other sites
walterword

quando in un FB ci sono dei dati che devono essere letti dall'esterno io li appoggio alle OUT .Esternamente dichiaro un'altra variabile e la uso per leggere il valore ma non punto mai direttamente alla variabile statica per questioni di performance e di correttezza dovute alla gestione dello stack e di altre cose .

Per quanto riguarda le FC uso parametri IN/OUT perche intrinsecamente una variabile IN/OUT è un vero e proprio puntatore , non pesa sullo stack delle varaibili locale e non da fastidio allo stack delle chiamate.

A prescindere delle istruzioni , le macro ect , dedicate a quel tale plc , l'architettura del OS e il modo di programmare è lo stesso che si usa fare con il C in altri OS

In C/C++ non si accede mai direttamente alla variabile statica , vi sono delle funzioni che ritornano il valore desiderato mantenendo un grado di separazione ed isolamento

Il grado di separazione ed isolamento va mantenuto anche con i plc , si tratta di pulizia del software , performances e correttezza programmativa :smile:

Il "#" in awl ha lo stesso significato della "&" del C, servono per caricare l'indirizzo di una variabile o l'inidirizzo iniziale di un vettore , ect ect

Edited by walterword

Share this post


Link to post
Share on other sites
LOCUTUSKiller
Il 30/7/2015 alle 12:14 , batta ha scritto:

Esempio banale: uno spesso una FC "Timer" che utilizza il tempo di scansione della cpu (oppure un clock). Il tempo trascorso viene appoggiato ad una variabile IN/OUT.

Volendo si potrebbe fare una FB ed utilizzare una STAT per il tempo trascorso.

Capisci però che sarebbe assurdo, per ogni richiamo della funzione, dover generare un DB di istanza (salvo ricorrere a multiistanze), solo per avere l'appoggio di una variabile.

In merito a questa discussione, ho una domanda:

Usando un FC richiamato piu volte, dove all'interno viene gestita una variabile Timer tramite IN-OUT esterni all'FC, senza che siano appoggiate su un DB come avviene per l'FB, non c'è il rischio di sovrascrivere il conteggio del timer tutte le volte che viene richiamato?

Se cosi non fosse, l'uso dell' FC è sicuramente preferibile, per non generare DB inutili. 

Eventuali differenze tra S7-300 e S1500? 

Edited by LOCUTUSKiller

Share this post


Link to post
Share on other sites
Livio Orsini

Nuovo utente che non ha letto il regolamento che ha accettato; se tu lo avessi fatto sapresti che non ci si può accodare ad altre discussioni.

Inoltre questa è ferma da quasi 5 anni!!

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...