Vai al contenuto

copia dati da un db di array di word a un db di array di real facendo swap delle word


Messaggi consigliati

Inserito:

Salve

 

ho un problema leggendo dei valori da analizzatori di rete tramite un webserver GAVAZZI.

Sto leggendo a step 21 strumenti , alcuni campi resituiti in real non sono corretti, con un CASModbusScanner i valori vengono letti correttamente, per cui il problema è nell mia lettura, in rete ho trovato un esempio su come leggere e fare swap dell word, il mio problema e poi andare a scivere il valore in un db in cui i device sono indicizzati.

 

Come posso fare?

stralcio di programma

 

IF "MB_TCP_STATUS".DONE THEN
    
    // FOR #i := 0 TO 79 DO
    
    //     // Unisce due WORD in una DWORD e la converte in REAL mantenendo il pattern di bit
    //     #tempDWord.%W1 := "MOD_TCP_PARK_W".DataRaw[#i * 2];       // Word alta
    //     #tempDWord.%W0 := "MOD_TCP_PARK_W".DataRaw[#i * 2+1];         // Word bassa
    
    //     // Converte la DWORD in REAL tramite interpretazione dei bit
    //     #tempreal[#i]:= DWORD_TO_REAL (#tempDWord);
    
    // END_FOR;
    
    "MOD_TCP_RDATA".Device["MB_TCP_STATUS".STEP_TCP] := "MOD_TCP_PARK".PRK;
    "MB_TCP_STATUS".STEP_TCP := "MB_TCP_STATUS".STEP_TCP + 1;
    "MB_TCP_STATUS".REQ := FALSE;
END_IF;

 

Grazie

 

Inserita:

L'unico errore che vedo è che il ciclo FOR deve procedere a INCREMENT di 2.

 

Inserita:

ok provo a correggere avanzamento di 2 nel ciclo, il mio dubbio poi e come faccio a rtasferire e dati presenti in temp real a un db in cui ho 30 strutture di 20 real ognuna, mi serve un altro ciclo per scrivere i valori real in questo DB.

Grazie per ogni indicazione.

Inserita: (modificato)
Il 09/03/2026 alle 21:02 , drn5 ha scritto:

L'unico errore che vedo è che il ciclo FOR deve procedere a INCREMENT di 2.

Non penso, c'è la moltiplicazione per due.

Alcuni valori non sono corretti o tutti?

Hai provato a invertire parte alta e parte bassa, Gavazzi mi sa che è al contrario di Siemens

#tempDWord.%W1 := "MOD_TCP_PARK_W".DataRaw[#i * 2 + 1];       
#tempDWord.%W0 := "MOD_TCP_PARK_W".DataRaw[#i * 2];        

Modificato: da simuffa
Inserita: (modificato)

Oppss..

hai ragione. non serve l'INCREMENT

 

o meglio..

 

con l'increment non servono i *2 il che rende il codice più efficente e più veloce (2 moltiplicazioni in meno e un ciclo for lungo la metà)

Modificato: da drn5

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