Frank681 Inserito: 18 novembre 2015 Segnala Share Inserito: 18 novembre 2015 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 More sharing options...
batta Inserita: 19 novembre 2015 Segnala Share Inserita: 19 novembre 2015 Puoi cambiare dinamicamente i valori. Link al commento Condividi su altri siti More sharing options...
Frank681 Inserita: 19 novembre 2015 Autore Segnala Share Inserita: 19 novembre 2015 Come sempre grazie batta Link al commento Condividi su altri siti More sharing options...
Frank681 Inserita: 29 novembre 2015 Autore Segnala Share Inserita: 29 novembre 2015 Salve a tuttiCome 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 More sharing options...
pomat Inserita: 29 novembre 2015 Segnala Share Inserita: 29 novembre 2015 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 More sharing options...
Frank681 Inserita: 1 dicembre 2015 Autore Segnala Share Inserita: 1 dicembre 2015 Ancora problemiAndando 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 More sharing options...
Giuseppe Signorella Inserita: 1 dicembre 2015 Segnala Share Inserita: 1 dicembre 2015 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 More sharing options...
Frank681 Inserita: 2 dicembre 2015 Autore Segnala Share Inserita: 2 dicembre 2015 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 More sharing options...
Frank681 Inserita: 3 dicembre 2015 Autore Segnala Share Inserita: 3 dicembre 2015 SalveSono 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. Grazie milleQualsiasi idea e' bene accetta Link al commento Condividi su altri siti More sharing options...
batta Inserita: 3 dicembre 2015 Segnala Share Inserita: 3 dicembre 2015 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 More sharing options...
max.riservo Inserita: 3 dicembre 2015 Segnala Share Inserita: 3 dicembre 2015 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 More sharing options...
Frank681 Inserita: 4 dicembre 2015 Autore Segnala Share Inserita: 4 dicembre 2015 Salve ragazziGrazie 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 More sharing options...
batta Inserita: 5 dicembre 2015 Segnala Share Inserita: 5 dicembre 2015 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 More sharing options...
Frank681 Inserita: 8 dicembre 2015 Autore Segnala Share Inserita: 8 dicembre 2015 Grazie a tuttiRisolto facendo come dice batta , come sempre grazi eal forum si risolvono i dubbi.. Link al commento Condividi su altri siti More sharing options...
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