Frank681 Inserito: 9 marzo Segnala Inserito: 9 marzo 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
drn5 Inserita: 9 marzo Segnala Inserita: 9 marzo L'unico errore che vedo è che il ciclo FOR deve procedere a INCREMENT di 2.
Frank681 Inserita: 10 marzo Autore Segnala Inserita: 10 marzo 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.
simuffa Inserita: 10 marzo Segnala Inserita: 10 marzo (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: 10 marzo da simuffa
drn5 Inserita: 10 marzo Segnala Inserita: 10 marzo (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: 10 marzo da drn5
Frank681 Inserita: 2 ore fa Autore Segnala Inserita: 2 ore fa Ringrazio per il suggerimento per ottimizzazione esecuzione codice. Il mio problema principale che ora ho i dati nell'array #tempreal[#i], che sono i dati di uno strumento, io ho 15 strumenti dentro un db che ha un array di UDT di 20 Dword, devo riuscire a fare un ciclo del ciclo di lettera e indicizzarlo da 0a 15. spero di essere stato chiaro, non riesco a copiare i dati di #tempreal[#i], dentro il array nel db. Grazie mille
drn5 Inserita: 1 ora fa Segnala Inserita: 1 ora fa (modificato) Invece di usare un array monodimensionale usane uno bidimensionale e mettilo in un DB globale. Quindi quando fai il tuo: F "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 // #DB.tempreal[STRUMENTO, #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; variabile STRUMENTO che andrai ad impostare di volta in volta in funzione allo strumento che andrai a leggere. Potresti mettere tutto questo codice in una FC che richiamerai N volte tanti quanti sono i tuoi strumenti. In un campo di input di questa FC passi il numero dello strumento.. qualcosa tipo: CALL LeggoStrumento (1); CALL LeggoStrumento (2); CALL LeggoStrumento (3); .... Modificato: 1 ora fa da drn5
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