Mbn Inserito: 8 novembre 2007 Segnala Inserito: 8 novembre 2007 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 successoManuale non ne parlaPuò essere che una allocazione dinamica non sia possibile.Ma forse....GrazieMbn
busanela Inserita: 10 novembre 2007 Segnala Inserita: 10 novembre 2007 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 uscitaUscita := RILEVAZIONE_DATI.risultato_out; //Radice oquadratoELSEUscita := RILEVAZIONE_DATI.valoremisura_out; //Valore dimisuraEND_IF;Magari non è proprio quello che intendevi tu, però mi sembra ci assomigli parecchio.
Mbn Inserita: 13 novembre 2007 Autore Segnala Inserita: 13 novembre 2007 Busanelagrazie,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.
vashello Inserita: 15 novembre 2007 Segnala Inserita: 15 novembre 2007 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
fabio.elettrico Inserita: 17 marzo 2008 Segnala Inserita: 17 marzo 2008 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
walter.ini Inserita: 4 giugno 2009 Segnala Inserita: 4 giugno 2009 Qualcuno ha novità dopo due anni ?
Savino Inserita: 4 giugno 2009 Segnala Inserita: 4 giugno 2009 (modificato) 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: 4 giugno 2009 da Savino
walter.ini Inserita: 8 giugno 2009 Segnala Inserita: 8 giugno 2009 Io sto cercando di richiamare la FB41 (quella del PID, per intenderci) da una FC fatta in SCL - ovviamenteil 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 ?
Savino Inserita: 8 giugno 2009 Segnala Inserita: 8 giugno 2009 (modificato) 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: 8 giugno 2009 da Savino
Ospite drei Inserita: 15 giugno 2009 Segnala Inserita: 15 giugno 2009 (modificato) 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_BLOCKIn questo ad ogni chiamata dell'FB20 crei un blocco di istanza per FB41.Ciao Modificato: 15 giugno 2009 da drei
Savino Inserita: 16 giugno 2009 Segnala Inserita: 16 giugno 2009 (modificato) FUNCTION_BLOCK FB20VAR_INPUT ResetPid : BOOL; ManPid : BOOL; PvPerPid : BOOL;END_VARVAR Pids : "CONT_C"; //<<---FB41END_VARPids(COM_RST:=ResetPid, MAN_ON :=ManPid, PVPER_ON :=PvPerPid);END_FUNCTION_BLOCKQuesto non si riesce a compilare.Pids : "CONT_C"; //<<---FB41 Errore : Non-existent functional block or missing instance declarationAppunto, 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: 16 giugno 2009 da Savino
Ospite drei Inserita: 16 giugno 2009 Segnala Inserita: 16 giugno 2009 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.
Savino Inserita: 16 giugno 2009 Segnala Inserita: 16 giugno 2009 (modificato) 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: 16 giugno 2009 da Savino
Ospite drei Inserita: 16 giugno 2009 Segnala Inserita: 16 giugno 2009 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?
Savino Inserita: 16 giugno 2009 Segnala Inserita: 16 giugno 2009 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 - ovviamenteil 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
Ospite drei Inserita: 16 giugno 2009 Segnala Inserita: 16 giugno 2009 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 , db4a 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.
Savino Inserita: 21 giugno 2009 Segnala Inserita: 21 giugno 2009 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/1996Last modified : 05/04/2000FB41 CONT_C Size: 1462 bytesVersion header: 1.5Last interface change: 07/22/1996Last modified : 12/02/2003Ma 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-definitaLa 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.
biuly Inserita: 14 ottobre 2009 Segnala Inserita: 14 ottobre 2009 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.
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