Vai al contenuto
PLC Forum


S7 300 byte di scambio


markolino

Messaggi consigliati

Ciao a tutti,

con questo post per chiedervi una spiegazione riguardo al seguente codice scritto in awl.

Mi interessa capire il concetto, lo scenario è il seguente : vado a leggere in profinet alcuni dati a partire da una determinata word.

Devo mappare la lettura sulla mia DB, quindi:

 

L     #PEW00      //carico in ACCU 1 il valore della mia variabile interna (cioè della word di partenza, passato nel momento in cui chiamo questa FC)
L     8                  //carico in ACCU2 il valore 8
*D                       //eseguo moltiplicazione a 32bit e la memorizzo in ACCU1   -> es. 700*8 = 5600
 LAR1                 //carico in AR1 il contenuto di ACCU1

 

//mappo i dati sulla mia DB

 

L     PEB [AR1,P#0.0]
T     DB110.DBB0

 

L     PEB [AR1,P#1.0]

T     DB110.DBB1

 

Non capisco a cosa serve quella moltiplicazione per 8. Perchè è necessario farla ?

Grazie in anticipo.

Link al commento
Condividi su altri siti


28 minuti fa, Colonial54 ha scritto:

Perche' in questo caso Siemens lavora in bit.

Immaginavo che fosse legato a questo, ma se non la facessi che cambierebbe ?

Perchè non posso scrivere :

L     PEW_partenza //intero 32bit                     
LAR1                 

L     PEB [AR1,P#0.0]

 

Sarà banale e chiedo venia ma non riesco a capire perchè devo moltiplicare.

Grazie

 

Modificato: da markolino
Link al commento
Condividi su altri siti

Perché nella pew c'è il numero del byte che vuoi leggere, ma l'indirizzamento è a bit, quindi devi moltiplicare i byte per 8 per trovare l'indirizzo del bit. 

Link al commento
Condividi su altri siti

Grazie acquaman.

È corretto affermare che moltiplicare per 8 mi serve per stabilire il punto di partenza da cui leggere ?

Poi da tale punto seleziono il bit di partenza con il P#

Grazie

Modificato: da markolino
Link al commento
Condividi su altri siti

Mattia Spoldi

è corretto affermarlo, ma sarebbe preferibile invece di una moltiplicazione per 8, usare l'istruzione SLW 3, shifta a dx la parola di 3 bit.

Diciamo che a livello di funzionalità è la stessa cosa, ma è più corretto a livello di codice.

 

ti diventerebbe così

L     #PEW00   
SLW  3 
 LAR1  

 

nel caso in cui  #PEW00 fosse una dword, SLW diventa SLD

Modificato: da il toby
mancava una parte di risposta
Link al commento
Condividi su altri siti

5 ore fa, il toby ha scritto:

ma è più corretto a livello di codice.

Anch'io uso l'SLD 3, ma credo sia solo una convenzione , non credo ci sia nulla di scorretto a moltiplicarlo per 8, si risparmia solo di scrivere una riga di codice, ma per i neofiti è più semplice leggere e capire una moltiplicazione che uno shift di 3 bit.

Link al commento
Condividi su altri siti

Mattia Spoldi

non c'è niente di scorretto, parlo per me, se trovo un slw/sld 3 so che sto usando dei puntatori, se trovo un *8 devo ragionarci su un attimo per capire cosa sta succedendo

Link al commento
Condividi su altri siti

Ok il concetto della moltiplicazione per 8 é chiaro.

Se non ho capito male, per fare la stessa cosa con lo shift, esso deve essere fatto con SLW quindi verso sinistra (verso sx equivale a moltiplicare per 2 alla n dove n = numero di posizioni). 

 

Link al commento
Condividi su altri siti

SLD perché se nello shift sfori la massima capienza della word i puntatore non funziona e allora vai a capire il perché. 

2 ore fa, markolino ha scritto:

verso sx equivale a moltiplicare per 2 alla n dove n = numero di posizioni

Esatto

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