Jump to content

Perchè non funziona? - Un esempio di codice AWL


Recommended Posts

Posted

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.

Posted

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
Posted

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

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

Grazie mille...

Edited by NULL
Posted (edited)
Federico Milan+Nov 6 2002, 02:16 PM-->
CITAZIONE(Federico Milan @ Nov 6 2002, 02:16 PM)

Grazie ancora una volta...

Edited by NULL
Posted

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

Federico Milan
Posted

Sono infinite le possibili alternative tutto sta nell'immaginazione,

elencarle una perdita di tempo :D

ciao

Posted

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
Posted

Cosa intendi vanno ad influire sul ciclo principale ?!?

spiegati meglio ...

Posted

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
Posted

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
Posted

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
Posted

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...