Vai al contenuto
PLC Forum


ModBus TCP


Frank681

Messaggi consigliati

Salve

 

Sto cercando di leggere dei valori in modbus tcp da un contatore , il mio problema e che i registri che devo leggere sono diversi e distantt tra loro .

Ora sono riuscito a leggere i valori che mi interessano , uno alla volta , m ase volessi implementare una lettura in automatico cambiando solo il numero del registro e la lunghezza come posso fare , devo disconnettere ogni volta o posso cambiare dinamicamente i valori ?

 

Grazie mille

Link al commento
Condividi su altri siti


  • 2 weeks later...

Salve a tutti

Come consigliato da batta cambio dinamicamente i valori , ora però ho qualche problema nell'interpretazione dei valori , mi spiego meglio:

L'apparecchio è un conttatore del fotovoltaico da cui voglioleggere dei dati , il totalizzatore è presente sia in formato 64 che 32 bit per ora leggo il formato 32 bit 4 byte formato long  faccio lo swap dellaword poi da word a dint e da dint a real il tutto funziona mentre altri valori tra cui potenza istantanea , tensioni e correnti sono in formato 32 bit 4 byte formato float , la stessa conversione non i funziona mi da valori che confrontati con quelli della pagina web del contatore non sono corretti.

Cosa sbaglio , dove è la differenza di lettura da long a float ?

Grazie mille

 

 

 

 

Link al commento
Condividi su altri siti

Il float è già di per sé un valore in virgola mobile, perciò non devi fare conversioni, lo metti tal quale in un REAL (purché sia in formato IEEE), al massimo potresti solo dover swappare le word prima.

Link al commento
Condividi su altri siti

Ancora problemi

Andando avanti con lo sviluppo dell'applicazione mi e' venuta necessità di leggere anche 8 byte ( numero 64 bit ) da un contatore via modbus TCP , il mio problema e che ho altri dati che hanno lunghezze diverse come posso fare a cambiare la lunghezza se non erro ( corregetemi per favore  ) 64 bit corrispondono a 4 word , per cui stavo pensando ( in scl ) di creare un area di parcheggio di 4 word , e poi utilizzare quelle di cui ho necessità , probabilmente dovrò fare lo swap delle word , come posso però fare per unire le word nel valore Lreal che mi serve ( oppure in un valore real , il totalizzatore è contonuo per cui sarebbe meglio LREAL).

Grazie mille

 

Link al commento
Condividi su altri siti

Giuseppe Signorella

Se rammento bene. ogni singolo registro del protocollo modbus, ha come lunghezza massima 16 bit (una word).

Per i numeri a virgola mobile, reali (float) a 32 bit si devono leggere due registri consecutivi, vale la stessa cosa per i numeri a 64 bit. Devi leggere 4 registri consecutivi.

In questi due casi, come detto da pomat, potresti avere la necessità di swappare le word.

Alcuni ambienti di sviluppo, nella configurazione della comunicazione, già ti chiedono se le word vanno swappare, in modo che a livello di programmazione devi fare poco o nulla.

Ciao

 

Link al commento
Condividi su altri siti

Ciao Ragazzi

 

Inanzitutto vi ringrazio delle info , in effetti ero gia' arrivato a fare leggere 4 word dal registro faccio lo swap delle word , poi pero' dovrei memorizzare il numero in LREAL che se ho ben capito e' un 64 bit , come posso ricomporlo per poi scriverlo nel campo lreal del db , pensavo di fare come di seguito..

 OUT_LR LReal 

 W_LR AT OUT_LR Array[1..4] of Word  

            #"W_LR AT OUT_LR"[1] := SWAP("FV_DB".PRK.W4);
            #"W_LR AT OUT_LR"[2] := SWAP("FV_DB".PRK.W3);
            #"W_LR AT OUT_LR"[3] := SWAP("FV_DB".PRK.W2);
            #"W_LR AT OUT_LR"[4] := SWAP("FV_DB".PRK.W1);
           
            "FV_DB".TEST:= #OUT_LR;

cosi' facendo mio da sempre 0

Link al commento
Condividi su altri siti

Salve

Sono riuscito a fare le letture , ho pero' adesso un problema ho le 4 word del formato long del totalizzatore 8 byte , comeposso convertire in lreal in scL ?

Per quanto riguarda i valorio real o creato la DW puntando direttamente alle W  e poi ho convertito la dword in real , per il formato lreal non ho idee..

Aiuto. :wallbash:

Grazie mille

Qualsiasi idea e' bene accetta

 

Link al commento
Condividi su altri siti

comeposso convertire in lreal in scL ?

Non sono sicuro di avere capito bene la domanda.

Se devi fare delle conversioni tra i vari formati in SCL, la sintassi è:

VarLReal := REAL_TO_LREAL(VarReal);

VarReal := LREAL_TO_REAL(VarLReal);

VarLReal := INT_TO_LREAL(VarInt);

 

e via di seguito.

Link al commento
Condividi su altri siti

Se rammento bene. ogni singolo registro del protocollo modbus, ha come lunghezza massima 16 bit (una word)

Confermo quanto detto da Giuseppe : 'l' unità di misura' del protocollo Modbus è la word (16 bit).

Riconfermo quanto detto da altri : devi gestire (se serve) lo Swap della Word (quindi Byte H e Byte L) e della doppia Word (Word H Word L). Per la Quad Word non ho info ma per similitudine ti direi che è come la doppia Word.

I numeri interi (16 bit) occupano 1 word, i doppi interi (Long) e i Float (Real) occupano 2 word, i LongReal (non li ho ancora incontrati nel mondo Schneider) ovviamente richiedono 4 word.

Ti consiglio di concentrarti sui numeri interi (da 16 a 64 bit) per trovare le regole dello swap, una volta che avrai ottenuto i valori aspettati, la lettura dei valore Real sarà una semplice conseguenza.

Link al commento
Condividi su altri siti

Salve ragazzi

Grazie per i suggerimenti infatti , mi ero gia' mosso in tal senso , unico problema che LREAL , viene composto da 4 WORD  , devo prima combinare le word in dword poi come combino le 2 dword in lreal ?

Il mio problema e' combinare le 4 word , swappate a dovere in lreal..

Link al commento
Condividi su altri siti

Dal dispositivo remoto leggi 4 registri a 16 bit.

Prima di tutto devi capire l'ordine di questi 4 registri, ovvero se il primo registro è la word più significativa o la meno significativa. Questa indicazione la trovi di sicuro nel manuale del tuo dispositivo.

Devi quindi provare a mettere i 4 registri nell'ordine R1-R2-R3-R4 oppure R4-R3-R2-R1.

Non serve accoppiare a due a due i registri per comporre due DWORD. Devi solo trovare il corretto ordine e comporre direttamente la tua LREAL.

Potrebbe essere necessario anche scambiare i byte all'interno di ogni singola word, ma non credo.

Secondo me, ti basta fare quello che hai riportato come esempio in un tuo precedente post, eliminando lo swap.

Ti bastano comunque poche semplici prove per capire come ordinare le variabili.

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