Vai al contenuto
PLC Forum


Ancora Modbus


Messaggi consigliati

Inserito:

Salve a tutti

Sto cercando di leggere i valori da 2 centraline di rifasamento della lovato

Comunicazione 485 stabilita , il mio problema e che alla lettura del registro vengono restituiite 2 word , come le memorizzo come 2 word separate o come dword , domani faccio delle prove.

Inoltre in alcune word devo scomporle per leggere allinterno della word sia valore analogico che bit di stato .

Qualche suggerimento su come procedere ?

:huh::unsure:


francesco-ottosei
Inserita:

Sui primi punti non mi è del tutto chiaro...qual' è il tuo problema

Per l'ultinmo punto "Inoltre in alcune word devo scomporle per leggere allinterno della word sia valore analogico che bit di stato" potresti provare a "mascherare" la word facendo la "AND WORD" così riesci a separare i bit o i valori analogici di cui hai bisogno di elabrare...

Ad esempio in SCL:

MW100:=MW102 AND W#16#3 ... in questo modo consideri solo i primi 2 bit della MW102 (consideri solo il bit 0 e 1 della MW102 - (MW100 avrà come valori 1, 2 o 3) anche se la MW102 ha altri bit alti)

Spero di essere stato chiaro....e di aiuto...

Inserita:

Ci ritorno

ho una word in ingresso in un blocco fb

voglio andare a valurare bit per bit i dati e elaborarli .

avevo pensato di definire un array della word con una word STATW AT asw array[0..15] of bool

il compilatore mi dice ok ma quando vado a verificare i bit sono sempre false .

Dove sbaglio

Inserita: (modificato)

Per capire dove sbagli dovresti postare qualche immagine con dichiarazione delle variabili e codice.

Comunque, per analizzare il singolo bit di una word c'è un sistema molto semplice:

NomeVariabile.Xnn

Dove "n n" è il numero del bit (partendo da zero).

Modificato: da batta
Inserita:

Ciao Batta

Grazie della pasienza , ho profato a fare come mi consigli

#tmpstw.%X0 := true;

mi da errore dicendomi che l'uso di %x0 non ammesso per #tmpstw , variabile temp definita come word

per ora sono riuscito a fare funzionare il tutto dando in uscita alla word il valore sorrispondente , ma è bruttino se la word si valorizasse in automatico a seconda dei bit settati sarebbe bello .sarebbe bello

Inserita:

Strano. Io ho appena provato e la compilazione va a buon fine.

Inserita:

Ciao Batta

Ho TIA 13 sp1

mi sfugge qualcosa nell'uso del comando AT

per esempio nel blocco FB da me creato ho la mia WORD di ingresso , all'interno del blocco vorrei scomporla nei singoli bit , pensavo di creare una variabile interna con il comando at come array[0..15] of bool dove poter leggere i singoli biut nell'array niente da fare la variabile word all'interno del blocco è 4000 ma il bit 14 è 0 , che è quello di ready.

non so piu' cosa pensare .

Dimenticavo CPU 315 2DP.

Grazie a tutti :wallbash::unsure:

Inserita:

Fai attenzione all'ordinamento dei byte.

Siemens usa il formato Motorola (o Big Endian): il primo byte (quello con indirizzo più basso) è quello più significativo.

Quindi 4000 Hex significa che il primo byte ha valore 40 Hex, e il secondo ha valore 00 Hex.

Quando leggi i bit dell'array il primo bit è il bit a destra del primo byte.

Nel tuo caso:

40 Hex --> 0100 0000 Bin

Non so se mi sono spiegato, ma prova a leggere lo stato del bit 06.

Inserita:

Ciao Batta

Infatti dopo varie prove ho visto che i due byte sono invertiti , per invertirli in scl posso usare ilcomando ROL ruotato di 8 , oppure devo usare shr e leggere bit per bit ?

:thumb_yello:

Inserita:

Per scambiare l'ordinamento dei bytes all'interno di una WORD (o DWORD) l'istruzione più appropriata è SWAP.

Però, senza scambiare i byte, ti basta tenere conto del loro ordinamento quando effettui operazioni sui singoli bit.

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