Vai al contenuto
PLC Forum


Sfb Indicizzato


wwwFede

Messaggi consigliati


ciao!

in realtà è molto semplice:

CALL SFB 46, DB46 // se la DB non esiste la crea automaticamente

a questo punto se ci sono dei parametri da inserire, ti verranno

proposti in sequenza.

Link al commento
Condividi su altri siti

Attenzione, se usi questo sistema (copia da DB di processo a DB di appoggio) devi avere anche l'accortezza di fare l'operazione inversa (copia da DB di appoggio a DB di processo). Inoltre devi anche tener presente che una SFB (dipende ovviamente da quale SFB) potrebbe richiedere più cicli di programma per la completa esecuzione.

Questo implica che dovresti creare un semaforo per la lettura/scrittura del DB di appoggio.

Link al commento
Condividi su altri siti

Tanto per essere chiari si tratta del Sfb47 per la gestione dei contatori delle 31xC, se funzionano come le Fm350 richiede più cicli.

Il problema è che devo usare tutti i counter contemporaneamente.

Domanda: Se faccio un richiamo incondizionato del Sfb con il comando UC è possibile in qualche modo assegnarli il blocco dati (tipo auf [nrDb])?

Grazie

Link al commento
Condividi su altri siti

Bene, allora NON devi richiamare la SFB47 una sola volta cambiando di volta in volta il DB associato, ma devi richiamare la SFB47 n volte (quanti sono i contatori) ed ogni volta associando il DB di istanza corretto, senza nessun bisogno di indicizzare.

Se proprio vuoi indicizzare il DB di istanza (sconsigliato) puoi fare nel seguente modo:

- creare FB con parametro in ingresso di tipo "Block_DB"

- creare DB di istanza (se non ci sono altri parametri il DB sarà costituito da un'unica variabile di tipo "Block_DB" che occupa 2 byte

- richiamare all'interno della FB così creata la tua SFB. Per l'associazione del DB di istanza anziché scrivere "DBnn" scrivi il nome della variabile di tipo "Block_DB"

- richiamare la FB lasciando in bianco il parametro richiesto

- prima del richiamo della FB trasferire nella variabile di tipo "Block_DB" del DB di istanza il numero del DB che dovrai associare alla SFB

Io ho fatto alcune prove e sembra funzionare, ma continuo a sconsigliarti di utilizzare questo metodo.

Link al commento
Condividi su altri siti

Tutto questo perché devo inserire la gestione di questi counter in una mia logica multiplexata esistente per la gestione di assi AC fatta con le Fm350.1/2.

Provo con il tuo metodo, Ti ringrazio comunque vada

Link al commento
Condividi su altri siti

emanuele.croci

Nota: per questa applicazione, se non hai bisogno di operazioni particolari puoi anche leggere direttamente il valore di conteggio sulla PED corrispondente, tipo L PED768 o simili, senza usare la SFB47.

Se può servirti...

Ciao, Emanuele

Link al commento
Condividi su altri siti

Tutto questo perché devo inserire la gestione di questi counter in una mia logica multiplexata esistente per la gestione di assi AC fatta con le Fm350.1/2.

Non puoi, nella tua logica multiplex, indicizzare solo il DB dove andare a leggere e scrivere i dati che ti servono, ma continuare a richiamare SFB47 n volte, al limite saltando l'esecuzione di quelle non richieste?

Voglio dire: se eseguo un ciclo che legge in sequenza il valore corrente di Z0, Z1, Z2 e Z3, posso sempre richiamare le SFB47 per tutti i contatori, salvo andar a leggere il valore corrente da DB[Z0], DB[Z1], DB[Z2], DB[Z3] a seconda del ciclo multiplex in atto. Per alleggerire il programma puoi eventualmente saltare l'esecuzione delle SFB47 non utili in quel momento.

Se ci fosse bisogno di richiamare la SFB47 un centinaio di volte potrei capire l'utilità di indicizzare, ma per 3 o 4 richiami...

Poi c'è la possibilità di agire come suggerito da Emanuele. Dipende ovviamente da cosa devi fare.

Link al commento
Condividi su altri siti

Hai perfettamente ragione non vale la pena spaccarsi la testa per quattro contatori, ma volevo ricondurre il tutto alla gestione esistente, dove il numero di assi, il tipo di fm o di cpu non comporta alcuna modica se non nell Ob100 dove dichiaro HW.

Link al commento
Condividi su altri siti

Forse quello che ti interessa e' creare una FC al cui interno richiamare l'SFB47. L'FC deve poi essere richiamata n volte per gestire n assi?

Se la situazione e' questa, allora puoi inserire come parametro di ingresso dell' FC un dato (es pippo) di tipo 'blocco DB'.

All'interno dell'FC puoi richiamare la tua sfb come

call sfb47, #pippo

richiamando l'FC puoi passare a pippo differenti DB (uno per ogni SFB) precedentemente creati come blocchi di istanza dell'SFB47.

Se invece di una FC hai una FB il discorso si semplifica perche' non serve creare un dato di ingresso ma basta creare un parametro STAT di tipo SFB47 (es pippo). All'interno dell'FB potrai poi richiamare

call #pippo

che si presentera' come una SFB47 il cui DB di istanza e' annegato nel DB di istanza della tua FB (che sara' diverso per ogni richiamo della stessa)

Questo metodo e' detto "programmazione in multi-istanza"

Ciao

Spero di aver fatto abbastanza confusione

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