Vai al contenuto
PLC Forum


Cross Reference Alternativo... E Blocchi Scl


biuly

Messaggi consigliati

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: da biuly
Link al commento
Condividi su altri siti


Gabriele Corrieri

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

Link al commento
Condividi su altri siti

Lo so che non è chiaro ma è difficile da spiegare.

Il mio blocco in KOP funziona come un timer siemens

post-44495-0-35033700-1387877350_thumb.g

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

Grazie

N.B.: Se un'administrator cancella il mio post precedente mi fa un favore :)

Link al commento
Condividi su altri siti

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: da Savino
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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: da biuly
Link al commento
Condividi su altri siti

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.

Ciao

Ivan

Link al commento
Condividi su altri siti

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: da biuly
Link al commento
Condividi su altri siti

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?
Link al commento
Condividi su altri siti

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: da biuly
Link al commento
Condividi su altri siti

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 a

Vorrei 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?
Link al commento
Condividi su altri siti

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 1

T #T1

associ 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

Link al commento
Condividi su altri siti

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: da Savino
Link al commento
Condividi su altri siti

Meglio dire:

CODE

DBx.DBW0 = 1;

DBx.DBW2 = 2;

DBx.DBW4 = 3;

DBx.DBW6 = 4;

...

..

ove DBx = DB_N_TIMER

Ciao Savino magari meglio ancora se usa DBB Byte visto che sono numeri interi , a meno che non abbia bisogno piu' di 127 timer :lol:

DBx.DBB0=0

DBx.DBB1=1

DBx.DBB2=2

DBx.DBB3=3

E' piu' immediato, come riconiscimento visuale.

Ciao

Ivan

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

Poi, se DBx = DB_N_TIMER , basterebbe una stampa del DB per avere un panorama completo degli enteri usati, piuttosto della cross reference.

Modificato: da Savino
Link al commento
Condividi su altri siti

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: da biuly
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...