Vai al contenuto
PLC Forum


Scl- Fb Con Numero Db Parametrico - Ricerca


Mbn

Messaggi consigliati

Qualcuno ha già trovato la necessità di chiamare una FB in SCL ma con numero della DB indicizzato e non assoluto ?

Chiamata Normale FB404.DB107(------argomenti)

Chiamata Indicizzata FB404.xxx (------argomanti)

xxx numero della Db. Tutti i tentativi di conversione non hanno successo

Manuale non ne parla

Può essere che una allocazione dinamica non sia possibile.

Ma forse....

Grazie

Mbn

Link al commento
Condividi su altri siti


Ciao,

io sto vedendo da poco tempo l'SCL dello Step 7, non mi sono mai posto il tuo problema, però nel manuale Gettin Starter SCL ho trovato il seguente esempio:

IF Interruttore di uscita THEN

//Commutazione uscita

Uscita := RILEVAZIONE_DATI.risultato_out; //Radice o

quadrato

ELSE

Uscita := RILEVAZIONE_DATI.valoremisura_out; //Valore di

misura

END_IF;

Magari non è proprio quello che intendevi tu, però mi sembra ci assomigli parecchio. ;)

Link al commento
Condividi su altri siti

Busanela

grazie,ma questa è solo la modalità di chiamata simbolica e presuppone di conoscere già la db.

Il mio tentativo è un pò più complicato cercando di allocare db in modo dinamico.

Ho dei dubbi si possa fare ma chissamai che qualcuno non abbia scoperto qualche trucchetto.

Link al commento
Condividi su altri siti

uhmm....non so se ho ben capito il problema....

ma se richiami i vari FB all'interno di un FB, puoi allocare i vari db di istanza direttamente all'interno delle STAT del FB "più esterno" che racchiude tutto il resto ;)

e questo vale sia per awl che scl ;)

Se non centra col tuo emblema... è sempre un idea.

Ciaoz

Link al commento
Condividi su altri siti

  • 4 months later...
fabio.elettrico

Anche io sto cercando di richiamere un FB in SCL con il DB di Istanza dinamico... ma credo prorpio che non sia possibile.

Se qualcuno ha qualche esperienza... si faccia avanti.

Grazie

Link al commento
Condividi su altri siti

  • 1 year later...

Non so se e' questo che ti servirebbe, comunque:

..
 VAR_TEMP
  AUX1 : WORD;
  DB_N : WORD;
  INDEX: INT;
..
.

VAR_INPUT
   DB_NUM : INT;
..
.

BEGIN 

DB_N :=INT_TO_WORD(DB_NUM);

AUX1:=WORD_TO_BLOCK_DB(DB_N).DW[INDEX];  // legge Word da DB

Modificato: da Savino
Link al commento
Condividi su altri siti

Io sto cercando di richiamare la FB41 (quella del PID, per intenderci) da una FC fatta in SCL - ovviamente

il DB di istanza è un parametro variabile della FC...

es:

CONT_C.DB101(.....)

funziona bene!

Però se al posto di DB101 voglio mettere un parametro ..... come posso fare ?

Link al commento
Condividi su altri siti

Però se al posto di DB101 voglio mettere un parametro ..... come posso fare ?

Non penso si possa fare.

Vedi, questa DB d'istanza viene creata appunto in fase di editazione ( in STL) e/o in fase di compilazione (in SCL).

Non in runtime.

Quindi, il richiamo avviene in modo assoluto.

Non vedo propio il proposito della tua necessita', se e' che ci sarebbe una, ameno che mi lo spieghi. <_<

Comunque, se qualcuno ti ha detto che sarebbe fattibile un roba del genere, sarei curioso anche Io in saperne.

Modificato: da Savino
Link al commento
Condividi su altri siti

Sicuramente hai già valutato l'opzione tuttavia credo che l'unico modo di fare quello che chiedi è usare un FB con la multistanza:

FUNCTION_BLOCK FB20
VAR_INPUT
    ResetPid : BOOL;
    ManPid : BOOL;
    PvPerPid : BOOL;
END_VAR

VAR
  Pids : "CONT_C"; //<<---FB41
END_VAR

Pids(COM_RST:=ResetPid,
     MAN_ON :=ManPid,
     PVPER_ON :=PvPerPid
);

END_FUNCTION_BLOCK

In questo ad ogni chiamata dell'FB20 crei un blocco di istanza per FB41.

Ciao

Modificato: da drei
Link al commento
Condividi su altri siti

FUNCTION_BLOCK FB20

VAR_INPUT

ResetPid : BOOL;

ManPid : BOOL;

PvPerPid : BOOL;

END_VAR

VAR

Pids : "CONT_C"; //<<---FB41

END_VAR

Pids(COM_RST:=ResetPid,

MAN_ON :=ManPid,

PVPER_ON :=PvPerPid

);

END_FUNCTION_BLOCK

Questo non si riesce a compilare.

Pids : "CONT_C"; //<<---FB41  
Errore : Non-existent functional block or missing instance declaration

Appunto, la dichiarazione Pids : "CONT_C"; //<<---FB41 da errore perche il richiamo del blocco deve riferire al DB d'istanza in modo assoluto, come ho affermato precedentemente.

In questo ad ogni chiamata dell'FB20 crei un blocco di istanza per FB41.

Non e' vero.

Cosi, come l'hai impostato, non se riesce ne meno a compilare, quindi non funziona.

Modificato: da Savino
Link al commento
Condividi su altri siti

Io l'ho fatto, compilato e provato. Funziona.

Chiaramente dei aver inserito il blocco FB41 nel programma.

Comunque se tu dici che non funziona per me va bene.

Link al commento
Condividi su altri siti

Io l'ho fatto, compilato e provato. Funziona.

Io ho copiato ed incollato cosi' come l'hai postato, e non compila, dando l'errore ho segnalato sopra.

Non puoi dire che tu riesci a compilare, ameno che non hai postato il codice giusto.

l'FB41 e' nel progetto, certo.

Comunque se tu dici che non funziona per me va bene.

No, non e' che non funziona, non compila. Certo che se non riesci a compilare, quindi non puo' funzionare.

Ad esempio, se Io richiamo il blocco come sotto, al compilare, mi crea la DB d'istanza 41.

 FB41.DB41(       
       COM_RST :=M20.5,
       MAN_ON  :=M20.2,
       PVPER_ON:=TRUE,
       P_SEL   :=TRUE,
       I_SEL   :=TRUE,
       INT_HOLD:=FALSE,
       I_ITL_ON:=FALSE,
       D_SEL   :=TRUE,
       CYCLE   :=T#100MS,
       SP_INT  :=REAL_VAR1,
       PV_IN   :=REAL_VAR2 ,
       PV_PER  :=MW20,
       MAN     :=REAL_VAR3,
       GAIN    :=REAL_VAR4,
       TI      :=T#100MS,
       TD      :=T#100MS,
       TM_LAG  :=T#100MS,
       DEADB_W :=REAL_VAR5,
       LMN_HLM :=REAL_VAR6,
       LMN_LLM :=REAL_VAR7,
       PV_FAC  :=REAL_VAR8,
       PV_OFF  :=REAL_VAR9,
       LMN_FAC :=REAL_VAR10,
       LMN_OFF :=REAL_VAR11,
       I_ITLVAL:=REAL_VAR12,
       DISV    :=REAL_VAR13);
Cosi come l'hai scritto te, non crea nessun DB d'istanza, infatti l'errore indica:
Pids : "CONT_C"; //<<---FB41  
Errore : Non-existent functional block or missing instance declaration

Modificato: da Savino
Link al commento
Condividi su altri siti

Ho fatto alcune prove e sono riuscito a replicare quell'errore solo non avendo nel progetto l'FB41.

Ho allegato il progetto con sorgenti e compilati. Vedi se riesci a compilare la sorgente.

Io ho la versione 5.1 SP4 di SCL che sia un problema di versione?

Link al commento
Condividi su altri siti

Ciao,

Purtroppo non riesco ad unzippare il file. Mi da come se avesse un formato errato. ( questo non penso sia un tuo problema visto che mi succede anche con mie attachments <_< )

Comunque, non fa niente ti devo credere..

Io ho la 5.1 SP3 ma non penso sia quello.. ma potrebbe darsi..

In ogni caso, tornando al quisito di walter.ini :

Io sto cercando di richiamare la FB41 (quella del PID, per intenderci) da una FC fatta in SCL - ovviamente

il DB di istanza è un parametro variabile della FC...

es:

CONT_C.DB101(.....)

funziona bene!

Però se al posto di DB101 voglio mettere un parametro ..... come posso fare ?

Tu avevi detto:

In questo ad ogni chiamata dell'FB20 crei un blocco di istanza per FB41.

Ameno che Io non abbia capito bene a walter.ini, come faresti te a richiamare l'FB41 con una DB d'istanza dato come parametro, utilizzando il tuo FB20?

Tanto per capire.. grazie

Link al commento
Condividi su altri siti

Presumo che la richiesta di come parametrizzare il numero del DB di istanza sia dovuta alla necessità di richiamare la FC più volte per "comandare" più regolatori pid senza dover scrivere tutte le volte la chiamata con il numero di DB di istanza fisso. In questo modo può creare un FC da usare e riusare parametrizzando "al volo". Almeno è quello che ho inteso io.

Siccome questo non lo può fare l'unico modo è creare una multistanza. Quindi se parametrizzando la FC con il numero del DB la chiamata sarà qualcosa tipo:

call FC1
       DBIstanza := 4
Usando il blocco in multistanza la chiamata sarà:
call fb20 , db4

a questo punto nel FB20 si può ricreare il codice dell'FC associandogli la DB di istanza.

Forse la spiegazione è un po' contorta.. spero di essermi spiegato bene.

Se poi ho capito male e questo non risolve il suo problema magari servirà a qualcun altro nel futuro.

Ciao.

Link al commento
Condividi su altri siti

Ciao,

Sono riuscito a vedere il progettino.

Alla fine sono riuscito a compilarlo anch'io. Ma ho dovuto creare un'altro progetto perche ancora su quello che compilavo prima non ci riesco. <_<

Boo, non lo so cosa potrebbe essere, magari c'e' qualche file che e' rimasto bloccato..

All'inizio avevo pensato che forse poteva essere la differenza nella versione del PID, con quello che utilizzavi te:

FB41 CONT_C

Size: 1160 bytes

Version header: 1.4

Last interface change: 07/22/1996

Last modified : 05/04/2000

FB41 CONT_C

Size: 1462 bytes

Version header: 1.5

Last interface change: 07/22/1996

Last modified : 12/02/2003

Ma non e' quello.

Comunque, penso che quello che tu fai sarebbe incapsulare il richiamo del PID FB41, dentro l'FB20.

Poi, richiami l'FB20 (da OB1) appunto con la DB20 d'istanza. Visto che al compilare il FB20 non ti la crea.

Il richiamo del FB20 con DB20 d'istanza ti crea una DB d'istanza su un oggetto Pids .

Penso che questo non farebbe differenze con il richiamo diretto del FB41 con la sua correspondente DB d'istanza, visto che il richiamo in ogni caso viene fatto passando la DB d'istanza a monte, e quindi in fase di editazione, cioe' la DB d'istanza si genera in quel momento, sulla base di una DB pre-definita

La richiesta di walter.ini, a meno che io non abbia ancora capito bene, era di richiamare una FB, passando un parametro = numero DB e richiamare il PID FB41 con la DB d'istanza numero= parametro.

Questo sembra non si possa fare.

Link al commento
Condividi su altri siti

  • 3 months later...

Si potrebbe richiamare l'FB41 sempre con lo stesso DB d'istanza e copiare i valori del DB passato come parametro nel DB d'istanza prima della call FB41 e dopo la call salvarlo nel DB passato come parametro.

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