Vai al contenuto
PLC Forum


FB e FC richiamate più volte da OB1


pixel

Messaggi consigliati

Ciao a tutti

... risolto il problema dell'OB100 per inizializzare le Var del programma adesso ho un altro problema...

sto realizzando il sw per un impianto di confezionamento

nel mio programma ho realizzato dei blocchi FB per la gestione di alcuni motori, una FB per una funzione di tara e un FB per la gestione del riempimento.

Credo di aver capito la differenza tra FC e FB e cioè le prime non gestiscono DB e quindi non è possibile reimpostare dei valori, mentre gli FB sì.

Comunque... creati questi blocchi ho provato a richiamare due volte FB (TARA) e qualcosa non funziona... se richiamo una sola volta l'FB in questione tutto funziona correttamente!

Ho sviluppato una mia teoria... una volta allocate le tabelle delle variabili, richiamarla più volte significa farla incasinare.... giusto?!

Preciso che non ho usato ne varibili globali per l'abilitazione o il Reset delle FB e quindi non c'è pericolo che qualche Merker in giro per il programma mi incasini tutto... qual'è il problema?

Grazie :blink:

Link al commento
Condividi su altri siti


walterword+7 Mar 2003, 03:19 PM-->
CITAZIONE(walterword @ 7 Mar 2003, 03:19 PM)

il problema dell'OB100 è stato chiarito...

commettevo l'errore di settare (per testare il funzionamento) un'uscita e non spiegavo xchè rimaneva settata :D

ma come mi hanno fatto notare se ob100 viene eseguito una volta sola ed io abilito l'uscita chi la deve riportare a off?

:ph34r:

Link al commento
Condividi su altri siti

E' vero... per i motori che sono tre ho dovuto creare tre DB differenti!

ma se trasformo la FB TARA in una FC si presenta lo stesso problema? e se sì come faccio nel mio sistema a fare più volte la tara?

Ho provato anche a richiamare un solo blocco FB TARA al verificarsi di condizioni diverse ma ho ottenuto lo stesso risultato... si incasina.... e pure l'OB1 non dovrebbe essere il Main Program e le FB e FC le subroutine del Linguaggio?

.......AIUTO........ :o

Link al commento
Condividi su altri siti

Luca Bettinelli

Questo FB o FC lo richiami più volte con dei parametri diversi o lo richiami più volte senza parametri?

Non potresti allegare il sorgente del blocco che utilizzi, per lo meno per capire cosa fa questa funzione, se mandi un messaggio entro le 17.00 ti posso rispondere subito.

Link al commento
Condividi su altri siti

per bettinelli:

non e' che se richiami un db piu volte ti si incasina tutto

non te lo compila proprio in fase di scrittura , te lo segnala in rosso

ogni FB (functional block) ha una sua area dati di appoggio

sua ed esclusiva.

Tale area si chiama DB di istanza dell'FB in questione

quando crei un FB anche se non hai un db in fase di chiamata

call FBx , DBx

se non c'e' il DB te ne genera uno lo STEP7

a differenza degli FC , gli FB hanno sola differenza oltre che avere in

comune parametri IN , IN_OUT , OUT , e TEMP

gli FB hanno i VAR che sono variabili STATICHE come i merker

Il DB viene creato a "stampo" come le variabili che vengono dichiarate nell'FB

se tiri giu la tendina (tabella) lo vedi

Oppure puoi legare un DB ad un FB quando ,una volta creato , gli clicchi sopra

e scegli per lui di essere associato a tale FB , operazione che non si usa mai

In genere prima si crea l'FB con tutte le sue funzioni e tutti i suoi parametri

dichiarati dopodiche si crea il DB , che e' la sua istanza .

E' come nei linguaggi orientati a oggetti per PC : la classe puo essere considerato l'FB

e la sua istanza il DB

ciao

walter

Link al commento
Condividi su altri siti

PIXEL

se l'FC o FB in questione lo crei tu , quindi un blocco parametrizzato

assicurati che all'interno non ci siano variabili statiche

o se ci sono che siano passate , nel caso sia un FC , come parametro IN_OUT

il discorso qual'e'?

se fai un parametrizzato, e all'interno usi dei merker per esempio,

ad ogni chiamata il merker ti varia in base al codice ovviamente ma in base anche

ai parametri che gli passi, quindi se proprio devi usare dei merker o mwx

passali come IN_OUT e ad ogni chiamata li cambi

in modo tale che ad ogni chiamata il tutto sia distinto e separato

senza correre il rischio di SOVRASCRIVERE qualche variabile

ciao

Link al commento
Condividi su altri siti

Luca Bettinelli

x walter

se un FB lo richiami più volte nella stessa scansione devi dargli per ogni chiamata un db di istanza diverso, altrimenti le variabili utilizzate per una chiamata vanno ad incasinare le chiamate degli altri quando alla scansione sucessiva vai a richiamarlo, è logico che se l'FB fa solo un calcolo non succede niente, ma se usato in modo indicizzato per fare della logica si perdono eventuali memorizzazioni che hai fatto.

Link al commento
Condividi su altri siti

Ciao..

Poi anche utilizare un FBxx e´ chiamare i altri FByy come Multinstanzia (force non é il nome ma facio analogia con lo spagnolo), vole dire che dichiara i altri FByy nella tabella stat d´FBxx é si crea un unico DB di Instanzia..

Per essempio se hai un FB chiamato Suma é vou fare piu di una suma in un stesso FB fai questo: :blink:

Link al commento
Condividi su altri siti

walterword+7 Mar 2003, 04:34 PM-->
CITAZIONE(walterword @ 7 Mar 2003, 04:34 PM)

Non credo di aver capito...

Le variabili in_out come si comportano?

comunque allego il listato in Kop

Link al commento
Condividi su altri siti

esatto

per crare una multi istanza

devi dichiarare nella tendina di dichiarazione delle variabili

il tipo di dato come FB

e lui crea con un solo DB

diversi DB concatenati ad esso

se poi si usano i puntatori ed il linguaggio SCL

si posso creare altre diavolerie

ciao

per bettinelli: era quello che volevo intendere io

:D

Modificato: da walterword
Link al commento
Condividi su altri siti

le variabili IN_OUT si comportano che possono essere lette e scritte

per esempio un marcia e arresto:

FC1

dichiarazione delle variabili:

IN pulsante bool

IN stop bool

IN_OUT motore bool

U #pulsante

o #motore \\ variabile IN_OUT perche leggi stato di motore e poi lo scrivi o viceversa

un #stop

= #motore

nell' OB1

call FC1

pulsante:= \\ in ;bool

motore:= \\ in_out ; bool

stop:= \\ in; bool

e' chiaro che ogni volta che richiami la funzione (blocco fc)

devi cambiare parametri altrimenti sovrascrivi

ciao

Modificato: da walterword
Link al commento
Condividi su altri siti

x walterword

forse ho capito le var in_out, ma cosa intendi dire col cambiare i parametri...

nel post precedente ho allegato il listato KOP della FC realizzata, cosa devo fare?

non ci sono molti parametri da cambiare nella mia FC....

Dalla discussione che c'è stata ho capito che devo creare una FC con multiistanza....?

fammi sapere

;)

Link al commento
Condividi su altri siti

Dal programma allegato sembrerebbe che alla fine devi solamente trasferire un valore su un fronte di salita.Forse potresti utilizzare solamente la funzione SCALE con un richiamo sul fronte di salita e fare il set sull'uscita ENO della funzione.

In ogni caso mi sembra che il problema è nella variabile temporanea Tara_ON,prova a sostituirla con un merker e poi vedi se cambia qualcosa.

Link al commento
Condividi su altri siti

no pixel

quello ch e dicevamo e' stato uno s viluppo teorico

vedendo il blocco che hai creato

si direbbe che tara_on sia il bit che resetta il flip-flop

prova a dichiararlo IN o IN_OUT invece di OUT

ciao

ah poi un'altra cosa , la variabile locale #tara_ok che sarebbe il bit che setti e resetti (blocco SR) non va bene , essendo locale all'uscita del blocco perde il suo significato e valore , dichiarala invece che TEMP come IN_OUT

ti perde lo stato e di conseguenza togli EN al blocco fc105 (scale)

quindi sballi i calcoli

Modificato: da walterword
Link al commento
Condividi su altri siti

B)

comunque hao da poco appreso a multiistanziare le FB eccezionale.... molti db li ho eliminati.

proverò a sostituire il merker...

walterword tieni presente che la mia FC non ha multiistanze... comunque provo subito a fare la prova

x Dago, in effetti la FC è molto semplice ma è solo l'inizio per fare delle prove è la prima volta che programmo un S7-300 !!! :P

ma stai tranquillo che si complicherà la FC...

Poi sono convinto che anche per FC relativamente semplice e meglio creare blocchi a se stanti per rendere migliore la manutenzione e la lettura del SW.

Grazie comunque a tutti per l'affiatamento...

Link al commento
Condividi su altri siti

le FC non hanno istanze

solo gli FB le hanno te lo avevo detto anche nell'altro post

cambia il parametro locale #pesa_ok e dichiaralo come IN_OUT

invece che TEMP , e poi il parametro #tara_on dichiaralo come IN.

ovviamente ad ogni chiamata cambia i merker da fuori (OB1)

ciao

se invece di un FC crei un FB allora #tara_on dichiaralo come IN

e #tara_ok lo dichiari come variabile "statica"

fai questi 2 cambiamenti e vedrai ch e poi va tutto

....ascolta un cretino ;)

Modificato: da walterword
Link al commento
Condividi su altri siti

Non centra con il problema di Pixel, ma voglio comunque raccontarvi un fatto che mi è accaduto in settembre 2001:

Avevo 2 FC diversi con parametri OUT che accedevano a dati delle DB:

Quando cambiava il valore di un parametro del primo FC, il secondo FC sbagliava l'assegnazione dei dati sui suoi parametri (OUT)

(Azzerava o imposta valori casuali, settava o resettava bit).

In particolare:

I dati DB se sono usati in parametri OUT di un FC e non sono elaborati dentro l'FC (causa salti interni) assumono valori casuali che provengono dal richiamo dell' FC precedente (anche un'altro fc diverso richiamato il segmento prima) (!!![at]#+*)

I dati M se sono usati in parametri OUT di un FC e non sono elaborati dentro l'FC (causa salti interni) rimangono invariati (FUNZIONAMENTO CORRETTO)

Ho telefonato alla Hotline e mi hanno risposto:

- LI FACCIA TUTTI IN-OUT !

- E' UN BACHETTO DI S7, CON I MERKER VA BENE !

- ANCHE V5 PRESENTA L'ERRORE !

- NON SO SE V6 ANDRA' BENE !

INTANTO NEI MIEI PROGRAMMI SI VERIFICAVANO I PROBLEMI PIU' DISPARATI (e disperati):

- ENCODER PROFIBUS CHE SI AZZERANO DA SOLI

- LA MACCHINA CHE VA IN BLOCCO CON MESSAGGI DI ANOMALIA INESISTENTI QUANDO L'OPERATORE CAMBIA UNA VARIABILE SULL'OP

- ECC.ECC.

E IO AVREI DOVUTO SPIEGARE AI CLIENTI CHE SI TRATTAVA DI UN BACHETTO DI S7 ??????????

Comunque sia, non so se la Siemens ha sistemato la faccenda in quanto io da allora ho abolito completamente i parametri OUT dai miei programmi (uso IN-OUT).

Purtroppo ora non ho il tempo per verificare se le cose sono cambiate, se qualcuno non sa cosa fare, qui c'è del codice per provare: (My Webpage)

Ciao

Modificato: da JumpMan
Link al commento
Condividi su altri siti

altri bachi ci sono

se usi qualche fronte di salita ( P ) o discesa (N) nel 200

mentre nel 300 mi capitava con i contatori (Z_haler e company)

come sarebbe no c'enrta con pixel quello che hi detto io

hai visto il codice?

ciao

cioe se setto una variabile locale #tara_ok , esco dal blocco , perdo l'informazione

per di piu chiamo il blocco piu volte e secondo te questa variabile mi da lo stato

al ciclo successivo e per di piu di diverse situazioni

conosci il significato di variabile locale?

:unsure:

ciao

Modificato: da walterword
Link al commento
Condividi su altri siti

Federico Milan

Ciao,

credo di essere sempre il solito fortunato, effettivamente io gli ingressi li uso come ingressi, le uscite solo come uscite e quindi sempre vengono elaborate, mentre le variabili in/out le uso per appoggi negli Fc oppure per settare allarmi!

Questo mio metodo non è molto piaciuto ai vecchi che usavano S5 però non ho mai riscontrato probleci citati ...

Una cosa sicura, attenti ad istanziare gli FB in multiistanza dentro agli FB, esiste un altro baco non documentato, ossia se hai FB diversi in multiistanza dentro ad un FB succedono cose strane ... quindi ... istanziare solo FB uguali !!!

Personalmente non uso mai questa tecnica, nel senso che le azioni standard le ho fatte con semplici (si fa per dire) FC , mentre FB li uso come contenitori particolari e gestori completi visto che sono oggetti con memoria ...

ciao

Link al commento
Condividi su altri siti

Ciao Walter, mi dispiace che tu mi abbia frainteso.

Ho postato dopo di te, e forse mi sono anche espresso male, ma la frase che ho scritto:

"Non centra con il problema di Pixel, ma voglio comunque raccontarvi un fatto che mi è accaduto in settembre 2001"
in realtà voleva dire:
"Il fatto accadutomi in settembre 2001 che ora sto per raccontarvi non centra con il problema di Pixel, ma ve lo espongo comunque:"

Lo so benissimo che le variabili TEMP sono locali e cioè interne al blocco e perdono il loro valore quando termina il blocco, io tra l'altro nei miei FC non ho MAI usato merker ma solo variabili locali, piuttosto che usare merker interni agli FC, se ho proprio bisogno che una variabile rimanga memorizzata anche all'uscita dell FC, uso una variabile IN/OUT così la posso definire in OB1 e non ho mai conflitti o sovrapposizioni di scritture sullo stesso MW da parte di FC diversi!

E' infatti difficile tenere traccia dei MERKER negli FC/FB creati nel corso degli anni, va bene, puoi fare la xref, ma è una rottura di scatole quando prendi un FC da una tua biblioteca dover controllare i suoi M interni per essere sicuri che non vadano in conflitto con altri M del programma.

Pertanto il consiglio che mi sento di dare a tutti:

- All'interno degli FC che create se avete bisogno che un valore rimanga memorizzato all'uscita dall'FC e sia accessibile al resto del prog. usate un dato IN/OUT, il suo indirizzo lo definirete in OB1 (o dove avete richiamato l'FC), in questo modo potete cambiarlo quando volete senza modificare l'FC che magari avete anche protetto con KNOW_HOW_PROTECT.

- Non usate M o DB assoluti all'interno di FC/FB.

- All'interno degli FB che create se avete bisogno che un valore rimanga memorizzato all'uscita dall'FC e sia accessibile al resto del prog. potete usare un dato IN/OUT, il suo indirizzo lo definirete in OB1 (o dove avete richiamato l'FB). In alternativa potete anche usare un dato STAT che non vi comparirà nella riga di richiamo ma comunque sarà accessibile dal resto del programma (basta leggere il valore nella DB di istanza)

(poi ognuno fa come gli pare)

Modificato: da JumpMan
Link al commento
Condividi su altri siti

Cosa intendi Federico con:

Una cosa sicura, attenti ad istanziare gli FB in multiistanza dentro agli FB, esiste un altro baco non documentato, ossia se hai FB diversi in multiistanza dentro ad un FB succedono cose strane ... quindi ... istanziare solo FB uguali !!!

?

Link al commento
Condividi su altri siti

scusami jumpman

per aver interpretato male il tuo concetto

ti assicuro comunque che quello che ho scritto

era in tono amichevole , quindi non da arrabbiato

:D

ciao

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