Vai al contenuto
PLC Forum


Perchè non funziona? - Un esempio di codice AWL


Messaggi consigliati

Inserito:

Vorrei innanzitutto ringraziare in anticipo quanti decideranno di rispondere.

Ho questo problema.

Vorrei utilizzare questa formula:

exp(a*ln(B))

in AWL per poter ottenere:

b^a.

Ho scritto questo codice in una FC ma non funziona e non so perchè.

L 2 // carico il valore 2 in ACCU-1

DTR // lo converto in REAL

LN // ne faccio il logaritmo naturale e il valore risultante viene messo nuovamente in ACCU-1

L #canale // carico il valore passato alla FC in ACCU-2 (è vero?)

DTR // lo converto in REAL

*R // moltiplico ACCU-1 e ACCU-2 riponendo il valore risultante di nuovo in ACCU-1

EXP // faccio l'esponenziale del valore appena calcolato e lo rimetto in ACCU-1

T #registro // valorizzo la DWORD registro con il valore di ACCU-1

Si tenga conto che canale è un parametro di input di tipo WORD e che registro è un parametro di output di tipo DWORD.

Io vorrei che se canale vale 0, registro contenga 1 (2^0), se canale vale 1 registro contenga 2 (2^1), e così via...

Perchè non funziona come vorrei? C'è forse qualche problema con valori real in virgola mobile?

E' possibile trovare un'altra soluzione (magari con le funzioni di shift) per fare la stessa cosa?

Grazie a tutti.

Lock.


Inserita:

Il metodo che hai usato è corretto (per avere a^B), ma la funzione DTR pretende come parametro di ingresso un intero a 32 bit.

Prova così

L 2

DTR

LN

L #Canale // dichiarato come DINT

DTR

*R

EXP

T #Registro //dichiarato come REAL

Saluti

R.G.

Federico Milan
Inserita:

behh,

a parte l'osservazione fatta prima c'è da dire che ln(x) non è definito per x:) ...

se ho capito bene tu devi fare f(x) = 2^x ?!?!

a questo punto non devi scomodare l'elevamento a semplicemente uno shift ...

infatti 2^2 = 2*2 = 4; 2^3 = 2*2*2 = 8 da cui 2^n = 1 shiftato a sinistra di n bit

a questo punto si ha:

L L#1 // Carico costante a 32bit

L #Canale // Carico numero tra 0-32

SLD // Shifto a sinistra la costante di n bit pari a #Canale

T #Registro // Salvo il risultato

ciao

Inserita: (modificato)
rguaresc+Nov 6 2002, 01:46 PM-->
CITAZIONE(rguaresc @ Nov 6 2002, 01:46 PM)

Grazie mille...

Modificato: da NULL
Inserita: (modificato)
Federico Milan+Nov 6 2002, 02:16 PM-->
CITAZIONE(Federico Milan @ Nov 6 2002, 02:16 PM)

Grazie ancora una volta...

Modificato: da NULL
Inserita:

Qualcuno mi sa dire se è possibile trovare ancora un'altra strada per ottenere il medesimo risultato?

Federico Milan
Inserita:

Sono infinite le possibili alternative tutto sta nell'immaginazione,

elencarle una perdita di tempo :D

ciao

Inserita:

Ho pensato di chiedere soluzioni alternative perchè quelle finora suggeritemi, non so per quale motivo, vanno ad influire sul ciclo principale dal quale io richiamo la FC nella quale ho inserito il codice di cui sopra...

Qualche suggerimento?

Grazie in anticipo.

Federico Milan
Inserita:

Cosa intendi vanno ad influire sul ciclo principale ?!?

spiegati meglio ...

Inserita:

In un OB1 ho una ciclica (stato 0, stato 1, stato 2, stato 0) dalla quale richiamo la FC nella quale ho scritto il codice con lo shift.

Ebbene, gli stati con quel codice non variano, rimanendo sempre su stato 0, che poi è la variabile #Canale che io passo come parametro di input alla FC.

Spero sia abbastanza.

Grazie ancora una volta.

Lock.

Federico Milan
Inserita:

Scusa sarò tardo io, ma sinceramente non ho capito niente ... se puoi prova a postare il pezzo di codice interessato.

cosa è che cicla ?!?

una variabile o hai un gestore di salti ?!?

se hai una variabile è temporanea un merker una dbw ...

ciao

Ivan Castellaro
Inserita:

Attento che per le variabili locali non è garantito il valore al richiamo sucessivo del blocco, in quanto l'area di meoria e' comune e viene sfruttata da tutti i blocchi.

Se devi tenere un valore in memoria per i cicli sucessivi usa una variabile M o D

Gianmario Pedrani
Inserita:

Un altra srtada e utilizzare un fb e con un suo db, oppure un fb con db di istanza e sei sicuro di non perdere i tuoi risultati ciao

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