biuly Inserito: 11 settembre 2007 Segnala Inserito: 11 settembre 2007 (modificato) Salve a tutti, ho fatto in SCL una FC che sostituisce i timer della siemens. Questa FC come parametri ha:VAR_INPUT N_TIMER : INT; PRESET : INT; BASE : INT;END_VAR VAR_OUTPUT ACTUAL : INT; END_VAR dove N_TIMER rappresenta il numero del timer da utilizzare, che non sarà altro che l'indice di un array di interi dentro un DB che si incrementano a seconda della variabile BASE ogni decimo di secondo, secondo, minuto o ora.Il blocco viene inserito proprio come un timer siemens, quindi finchè non è abilitato, il codice non viene eseguito. Il problema è questo: COME FACCIO A FARE UN CROSS REFERENCE DEI TIMER USATI???Non trovo una maniera decente per farlo. Non posso settare nessun flag corrispondente al timer in uso all'interno del blocco, perchè finchè non è usato il timer, il codice non viene eseguito. Avete qualche idea ??? Modificato: 11 settembre 2007 da biuly
Gabriele Corrieri Inserita: 11 settembre 2007 Segnala Inserita: 11 settembre 2007 Ciao immagino che il cross reference ti serve per sapere qual'è il prossimo timer libero ... quindi in fase di programmazione, quindi ti conviene usare ancora i foglietti di carta oppure scrivi un po' di documentazione, che serve sempre.Ciao
Savino Inserita: 11 settembre 2007 Segnala Inserita: 11 settembre 2007 Avete qualche idea ??? Non ho capito niente! Posta il codice SCL...
biuly Inserita: 14 settembre 2007 Autore Segnala Inserita: 14 settembre 2007 Lo so che non è chiaro ma è difficile da spiegare.Il mio blocco in KOP funziona come un timer siemensA mano a mano che inserisco i timer a "N Timer " assegno numeri progressivi, ma a volte sbagliando ne trovo 2 uguali. Subito ho pensato di creare un DB con dei flag settati a seconda numero del timer usato. Esempio se ho usato i timer 1,2,3,4,7,9 dovrebbe settarmi i rispettivi flag su un array di bool in un DB, di modo che caricando il programma sul simulatore vedo quali sono i timer liberi. Il problemone, è che il codice non viene eseguito se tutte le condizioni non sono settate. quindi non era un metodo adeguato.Allo stato attuale delle cose non riesco a trovare un modo per sapere quali timer ho usato, e quindi stampo in un file il programma, ricerco la stringa FC45 (il mio blocco) e tengo nota dei timer, ma me li devo passare tutti.Fare il cross reference dell'FC45 non è veloce come metodo.Volevo sapere se qualcuno ha qualche altra idea, una direttiva del compilatore, una maniera per attivare tutte le istanze dell'FC45 nello stesso ciclo, o qualunque altra idea che mi aiuti a fare questa specie di cross reference.Se non mi sono spiegato fatemi pure altre domande.GrazieN.B.: Se un'administrator cancella il mio post precedente mi fa un favore
Savino Inserita: 14 settembre 2007 Segnala Inserita: 14 settembre 2007 (modificato) Non ho capito molto..Comunque, se il cross reference non riesce a identificare i timer utilizzati dovuto a che l'indirizzamento non e' stato diretto.. dovresti fare come ti ha riferito Gabriele sopra... scrivi un dittagliato commento la' (segmento) dove questi indirizzamenti indiretti avverrebbero Modificato: 14 settembre 2007 da Savino
romma00 Inserita: 14 settembre 2007 Segnala Inserita: 14 settembre 2007 Scusa, ma al posto di passargli il numero del timer come numero non puoi passargli direttamente il timer che vuoi usare, in questo modo funziona anche il cross reference.
biuly Inserita: 15 settembre 2007 Autore Segnala Inserita: 15 settembre 2007 No, non voglio usare i timer siemens. Altrimenti tanto valeva usare quelli direttamente
Savino Inserita: 15 settembre 2007 Segnala Inserita: 15 settembre 2007 non voglio usare i timer siemens e' qui ove non posso seguirti... se i timer utilizzati non sono quelli della libreria Siemens, allora dove e' il probelema? come fai ad andare in conflitto ..?Dovresti spiegare meglio.. non riesci a postare un disegno funzionale... il codice SCL... ?
biuly Inserita: 15 settembre 2007 Autore Segnala Inserita: 15 settembre 2007 Io mi sono fatto un FC che uso come un timer siemens, solo che al posto di dargli un ingresso di tipo timer gli do un intero.Vorrei trovare la maniera per sapere quali interi ho gia usato.Però dato che l'FC viene usato in base alle condizioni di chiamata non riesco a tener traccia degli interi usati, in altre parole non posso memorizzare quelli gli interi che ho già usati in un DB, dato che il mio blocco viene richiamato solo in base alle condizioni che lo precedono.
romma00 Inserita: 15 settembre 2007 Segnala Inserita: 15 settembre 2007 Premetto che non sono (ancora, per adesso) un esperto nella programmazione, quindi quello che ti dico potrebbe non essere giusto al 100%.Una soluzione che mi viene in mente è di togliere del tutto il numero intero che gli passi, ma fare in modo che a ogni chiamata del FC l'indice del timer da usare si incrementi (chiaramente devi resettarlo ad ogni inizio di ciclo) e modificare il programma in modo da avere sempre le chiamate al FC e mentre quello che si modifica durante l'esecuzione è solo l'attivazione o meno del timer.Non avresti ancora il cross reference, ma non avresti problemi con l'usare due volte nel programma lo stesso timer.Un'altro modo è incrementare 1 volta dopo ogni istruzione di chiamata del FC il numero di timer (resettando sempre all'inizio del ciclo) anche in questo caso devi fare in modo che l'FC sia sempre chiamato e attivare o meno il conteggio.Penso che entrambe queste soluzioni non funzionino se hai cicli che contengono la chiamata al timer nel programma.
biuly Inserita: 15 settembre 2007 Autore Segnala Inserita: 15 settembre 2007 (modificato) Il problema è proprio che non voglio avere sempre attive le chiamate all'FC ma solo quando vengono attivate dal ramo logico del programma.In pratica il mio FC memorizza l'ora in millisecondisecondi attuale del plc alla prima attivazione e poi controlla il tempo passato durante i cicli successivi fino alla scadenza. Quindi devo memorizzare in un array indicizzato dal numero del timer, l'ora di prima attivazione e poi controllare se (l'ora attuale - l'ora memorizzata) supera il mio set. Modificato: 15 settembre 2007 da biuly
kamikaze Inserita: 15 settembre 2007 Segnala Inserita: 15 settembre 2007 Caro Biuly,Simatic manager , non ti permette di fare un "cross reference" di numeri siano essi interi, esadecimali, bcd....ecc.Cosi' come i puntatori , non posso essere visualizzati nella cross reference.Purtroppo temo che cio' che che chiedi, se ho ben capito e' impossibile.CiaoIvan
biuly Inserita: 15 settembre 2007 Autore Segnala Inserita: 15 settembre 2007 (modificato) Lo credo anch'io ma sono convinto che un metodo alternativo con un pò di codice si riesca a trovare. Mai porre limiti alla creatività. Io avevo fatto un array di flags che veniva settato se il timer era usato più di una volta, ma c'è sempre il solito problema che me ne accorgo solo se tutti gli fc vengono richiamati almeno una volta. Modificato: 15 settembre 2007 da biuly
Savino Inserita: 15 settembre 2007 Segnala Inserita: 15 settembre 2007 In pratica il mio FC memorizza l'ora in millisecondisecondi attuale del plc alla prima attivazione e poi controlla il tempo passato durante i cicli successivi fino alla scadenza. Quindi devo memorizzare in un array indicizzato dal numero del timer, l'ora di prima attivazione e poi controllare se (l'ora attuale - l'ora memorizzata) supera il mio set. Adesso penso di avere capito ma il tuo primo quesito era stato:COME FACCIO A FARE UN CROSS REFERENCE DEI TIMER USATI??? .. quindi ecco qui la confusione! perche' timer usati.. Era per quello che ti avevo detto di postare quelle righe di codice SCL coinvolte .. per vedere appunto cosa volevi dire... Se il tuo FC ed eventuali sotto funzioni utilizzano i timer della libreria in modo diretto, allora verrano registrati nella cross list altrimenti no. il mio FC memorizza l'ora in millisecondisecondi attuale del plc alla prima attivazione e poi controlla il tempo passato durante i cicli successivi fino alla scadenza Come?
biuly Inserita: 16 settembre 2007 Autore Segnala Inserita: 16 settembre 2007 (modificato) Si infatti la mia domanda era posta malissimo, ma spiegare quello che intendevo non era semplice, quindi ho scritto cross reference per attirare l'attenzione con qualcosa di conosciuto.Riguardo la tua domanda tramite una chiamata all'SFC64, leggi questo: http://support.automation.siemens.com/WW/l...tranet=standard Modificato: 16 settembre 2007 da biuly
Savino Inserita: 16 settembre 2007 Segnala Inserita: 16 settembre 2007 Riguardo la tua domanda tramite una chiamata all'SFC64 Dunque, visto che questo blocco non coinvolge l'uso dei timers(Tn) della libreria, la risposta alla domanda COME FACCIO A FARE UN CROSS REFERENCE DEI TIMER USATI??? sarebbe da conseguenza, fuori range. Poi, per quanto riguarda aVorrei trovare la maniera per sapere quali interi ho gia usato. cosa intendi? alle locazioni di memoria loacale definite come INT dentro i blocchi SCL o cosa?
biuly Inserita: 16 settembre 2007 Autore Segnala Inserita: 16 settembre 2007 Voglio capire quali interi ho passato all'FC come parametro N_TIMER in ingresso, in tutti gli fc45 del mio programma, indipendentemente dall'attivazione dell'FC.
kamikaze Inserita: 16 settembre 2007 Segnala Inserita: 16 settembre 2007 Prova cosi' , e' complicato dal punto di vista editor , ma e' un'opzione.Invece di passare un'intero come numero, usa le variabili di interfaccia del blocco chiamante le tue SFC.Crei una serie di variabili TEMP chiamandole T1,T2,T3,T4....ec cosi' via, dichiarandole come INT.Dopo aver scritto nella variabile un valore univoco a come:L 1T #T1associ la variabile specifica alla chiamata dell'SFC nel paramentro timer, al posto di un semplice numero.Poi per fare una verifica di dove quella variabile e' usata, dall'interfaccia dove hai la lista variabili TEMP , clicca sulla vairabile e premi CTRL+SHIFT+F e l'editor ti porta nel punto esatto di utilizzo nel blocco.Non vedo altri sistemi di immediata realizzazione.Largo alla fantasia. Ivan
Savino Inserita: 16 settembre 2007 Segnala Inserita: 16 settembre 2007 (modificato) Voglio capire quali interi ho passato all'FC come parametro N_TIMER in ingresso, in tutti gli fc45 del mio programma, indipendentemente dall'attivazione dell'FC... ho capito! (penso)Se a 'N_TIMER' li passi la DBx.DBW1 che rappressentarebbe l' INT 1, DBx.DBW2 che rappressentarebbe l' INT 2 e via dicendo.. e DBx sarebbe la DB degli INT.. allora potresti almeno 'capire' in una cross reference quali interi hai associato per ogni richiamo di FC45, che ne dici Modificato: 16 settembre 2007 da Savino
Savino Inserita: 16 settembre 2007 Segnala Inserita: 16 settembre 2007 Meglio dire:DBx.DBW0 = 1; DBx.DBW2 = 2; DBx.DBW4 = 3; DBx.DBW6 = 4; ... .. ove DBx = DB_N_TIMER
robertopan Inserita: 17 settembre 2007 Segnala Inserita: 17 settembre 2007 non ho capito molto bene ma non si poteva usare un FB parametrizzato invece di un FC,sempre che il codice all'interno di ogni timer sia uguale.Saluti P.R.
kamikaze Inserita: 17 settembre 2007 Segnala Inserita: 17 settembre 2007 Meglio dire:CODEDBx.DBW0 = 1;DBx.DBW2 = 2;DBx.DBW4 = 3;DBx.DBW6 = 4;.....ove DBx = DB_N_TIMERCiao Savino magari meglio ancora se usa DBB Byte visto che sono numeri interi , a meno che non abbia bisogno piu' di 127 timer DBx.DBB0=0DBx.DBB1=1DBx.DBB2=2DBx.DBB3=3E' piu' immediato, come riconiscimento visuale.CiaoIvan
Savino Inserita: 17 settembre 2007 Segnala Inserita: 17 settembre 2007 magari meglio ancora se usa DBB Byte.. Il concetto non cambiarebbe... la 'base della idea' comunque resta valita.Poi, non essendo legato ai timer del sistema, l'intervallo per i timer a secondo la CPU utilizzata (128-512) no sarebbe un limite. a meno che non abbia bisogno piu' di 127 timer Questo non centra, potrebbe avere il bisogno di settare dei valori per DB_N_TIMER entro un intervallo anche maggiore di 0 - 127 o 0 - 511 per esempio senza problemi di rintraciabilita' nella cross reference.
Savino Inserita: 17 settembre 2007 Segnala Inserita: 17 settembre 2007 (modificato) Poi, se DBx = DB_N_TIMER , basterebbe una stampa del DB per avere un panorama completo degli enteri usati, piuttosto della cross reference. Modificato: 17 settembre 2007 da Savino
biuly Inserita: 17 settembre 2007 Autore Segnala Inserita: 17 settembre 2007 (modificato) L'idea mi piace però purtroppo io strutturo i miei programmi con degli UDT anche complessi che includono i numeri dei miei timer, così quando passo ad una FC una variabile di tipo UDTn all'interno ho tutto ciò che mi serve per fare il codice abbinato. Esempio nel mio FC per la scalatura delle analogiche metto anche un controllo sulle soglie di allarme, e queste sono temporizzate, quindi passo all'FC una variabile di tipo UDTn che include i numeri dei timer (i miei N_TIMER). Ovviamente nel DB che contiene gli UDT delle analogiche, al campo Numero Timer non posso assegnare DBx.DBWx. Comunque questa soluzione non è male e la posso utilizzare nel codice libero, ma nella parte strutturata in UDT la cosa si fa più complessa. Modificato: 17 settembre 2007 da biuly
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