markolino Inserito: 3 ottobre 2020 Segnala Inserito: 3 ottobre 2020 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.
Colonial54 Inserita: 3 ottobre 2020 Segnala Inserita: 3 ottobre 2020 Perche' in questo caso Siemens lavora in bit.
markolino Inserita: 3 ottobre 2020 Autore Segnala Inserita: 3 ottobre 2020 (modificato) 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: 3 ottobre 2020 da markolino
acquaman Inserita: 3 ottobre 2020 Segnala Inserita: 3 ottobre 2020 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.
markolino Inserita: 4 ottobre 2020 Autore Segnala Inserita: 4 ottobre 2020 (modificato) 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: 4 ottobre 2020 da markolino
Mattia Spoldi Inserita: 4 ottobre 2020 Segnala Inserita: 4 ottobre 2020 (modificato) è 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: 4 ottobre 2020 da il toby mancava una parte di risposta
Colonial54 Inserita: 4 ottobre 2020 Segnala Inserita: 4 ottobre 2020 Forse sarebbe meglio scrivere: L #PEW00 SLD 3 LAR1
acquaman Inserita: 4 ottobre 2020 Segnala Inserita: 4 ottobre 2020 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.
Mattia Spoldi Inserita: 4 ottobre 2020 Segnala Inserita: 4 ottobre 2020 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
markolino Inserita: 4 ottobre 2020 Autore Segnala Inserita: 4 ottobre 2020 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).
acquaman Inserita: 4 ottobre 2020 Segnala Inserita: 4 ottobre 2020 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
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora