Vai al contenuto
PLC Forum


Accostamento di 2 WORD per ottenere una DWORD - Un metodo AWL per farlo


lock

Messaggi consigliati

Grazie in anticipo a tutti quanti vorrano rispondere.

Vorrei sapere se e come è possibile fare questo in AWL:

ho due WORD, diciamo

1000000000000000 e 0000000000000001.

Vorrei sapere se si può ottenere una DWORD (e se sì, come sia possibile farlo in AWL) che sia esattamente la risultante dell'accostamento delle due WORD precedenti, ossia:

10000000000000000000000000000001.

Grazie ancora.

Lock.

Link al commento
Condividi su altri siti


Ivan Castellaro

La doppia word è invertita, cioè w0,w1.

Per fare cio' che dici te puoi trasferire la w1 nella doppia word, shiftarla di 16 posizione e fare l'OR con la w0

L "W1"

T DWxx

SLD 16

OD "W0"

T DWxx

Questo se usi il 300

Link al commento
Condividi su altri siti

Grazie per la risposta Ivan, ma purtroppo così non funziona e ti spiego perchè.

Innanzitutto per poter fare l'OR ho necessità di trasformare ambedue le WORD in DWORD. Ora immagina che faccio lo shift su una delle due DWORD ed ottengo un valore che è -(2^31), ossia -2147483648, ossia

10000000000000000000000000000000, almeno così viene interpretato da S7.

Adesso, quando faccio l'OR con la seconda DWORD, il valore risultante non viene aumentato, ma diminuito.

Cioè, se la seconda DWORD è per esempio 00000000000000000000000100000000, io non ottengo

10000000000000000000000100000000, ma qualcos'altro, dato dalla differenza fra -(2^31), ossia la prima DWORD, e 256, ossia la seconda DWORD.

Dunque, a me servirebbe invece che la DWORD risultante fosse 10000000000000000000000100000000 (cioè -256, almeno per come viene interpretato da S7).

Come posso fare?

Grazie ancora.

Lock.

Link al commento
Condividi su altri siti

Ivan Castellaro

Mi sembra strano,

Che numero risulta dopo l'or ?

Sei sucuro di fare l'or con la doppia parola (OD)?

Le doppie word che utilizzi come appoggio hanno il valore che ti aspettavi?

Per fare le prove appoggiati su 3 doppie word distinte e controlla i risultati

Fammi sapere.

Link al commento
Condividi su altri siti

1) Dopo l'OR il valore risultante è questo:

-2147483392, ossia 11111111111111111111111100000000....

2) Sono sicuro di aver fatto l'OR con la doppia parola (utilizzando OD)

3) Le doppie word che utilizzo hanno il valore che mi aspetto.

Adesso riesco a farmi capire? S7 utilizza il bit di segno, dunque una DWORD può contenere valori compresi fra -2147483648 e 2147483647...

Se faccio l'OR fra un numero negativo e uno positivo, ottengo che il numero negativo viene decrementato...

Dunque quello che mi serve è realmente poter solo accostare le due WORD per ottenere una DWORD... se mi metto a fare calcoli non funziona nulla.

10000000000000000000000000000000

OR

00000000000000000000000100000000

dovrebbe essere uguale a:

10000000000000000000000100000000

e invece è uguale a:

11111111111111111111111100000000.

Spero di essere stato chiaro.

Lock.

Link al commento
Condividi su altri siti

lock+Nov 27 2002, 01:27 PM-->
CITAZIONE(lock @ Nov 27 2002, 01:27 PM)

...per evitare di lasciare qualche bit per strada ti faccio un esempio in esadecimale....

se MD0 = 80000000x e MD1=00000100x

scrivendo

L MD 0

L MD 4

OD

T MD 8

su MD8 ti troverai 80000100 che in decimale vale -2147483392!!

spero di avere capito... e avere chiarito ;)

ciao

Andrea

Link al commento
Condividi su altri siti

Ivan Castellaro

Quello che dici non ha gran che senso,

Questo è l'. S7

OD (OR doppia parola) combina il contenuto dell'accumulatore 1 con il contenuto dell'accumulatore 2, oppure con una costante (a 32 bit), bit per bit, in conformità all'operazione logica combinatoria OR. Il bit della doppia parola di risultato è "1" solamente se i corrispondenti bit delle doppie parole combinate sono entrambi "1". Il risultato viene memorizzato nell'accumulatore 1. ACCU 2 (per le CPU con quattro accumulatori anche ACCU 3 e ACCU 4) rimane inalterato. Il bit di stato A1 viene impostato conformemente all'esito dell'operazione (A1=1 se il risultato è diverso da zero). I bit di stato A0 e OV vengono resettati a "0".

OD: combina il contenuto dell'accumulatore 1 con il contenuto dell'accumulatore 2.

OD : combina il contenuto dell'accumulatore 1 con una costante (a 32 bit).

Parola di stato

BIE A1 A0 OV OS OR STA RLC /ER

Scrive: - x 0 0 - - - - -

Esempi

Bit  31 . . . . . . . . . . . . . . . . . 0

ACCU 1 prima dell'esecuzione di OD 0101 0000 1111 1100 1000 0101 0011 1011

ACCU 2 o costante (a 32 bit): 1111 0011 1000 0101 0111 0110 1011 0101

Risultato (ACCU 1) dopo l'esecuzione di OD 1111 0011 1111 1101 1111 0111 1011 1111

Esempio 1

AWL Spiegazione

L ED20 Carica il contenuto di ED20 in ACCU 1.

L  ED24 Carica il contenuto di ACCU 1 in ACCU 2. Carica il contenuto di ED24 in ACCU 1.

OD  Combina i bit di ACCU 1 con i bit di ACCU 2 mediante OR, memorizza il risultato in ACCU 1.

T  MD8 Trasferisce il risultato a MD8.

Come vedi dall'esempio non centra nulla il segno.

A meno che non sia un bug....... :D:P

Link al commento
Condividi su altri siti

Questo dovrebbe funzionare! Domani comunque provo

L DBWx // Word 1

SLD 16 // Scorrimento a doppia parola

L DBWy // Word 2

OD // Or a doppia parola

T DBDz // Risultato

Non penso che i bit di segno possano creare problemi

Ciao Oscar

Link al commento
Condividi su altri siti

Ciao..

Cuello che dice Oscar funziona benne.. questo è cuello chi fá..

L MW0 // Word 0 (1000000000000000)

SLD 16 // Scorrimento a doppia parola 1000000000000000 + (16 bits in 0)

MW1 // Word 1 (0000000000000001) Word basso

OD // Or a doppia parola ACCU2 OD ACCU1

T MD0// Risultato

risultato: 1000000000000000 0000000000000001

spero essere chiaro?

:rolleyes:

Link al commento
Condividi su altri siti

Ciao a tutti.

Sebbene la soluzione dell'OR a parola funzioni, puoi risolvere il problema semplicemente trasferendo le due word nella destinazione finale:

i due dati da accoppiare sono MW6 e MW54 e il dato finale deve essere MD70:

L MW6

T MW70

L MW54

T MW72

leggendo il dato MD70 avrai il risultato cercato.

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