Home › Forum › Terminali operatore (Weintek) › Numero cifre decimali da variabile modbus
- Questo topic ha 5 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 2 mesi fa da Sergio Bertana.
-
AutorePost
-
Febbraio 4, 2019 alle 7:28 am #46533AnonimoInattivo
Ho un pannello MT8070iP e devo acquisire dei dati via Modbus TCP IP da in inverter Solaredge SE4000H. Per l’acquisizione nessun problema solo non riesco a formattare le variabili dato che l’inverter oltre alla variabile con il dato me ne da un’altra con il fattore di scala praticamente il numero di decimali.
ESEMPIO 1
Registro 40084 AC Power value valore letto 1500
Registro 40085 AC power scale factor valore letto -1
Quindi avrò come valore reale 150.0ESEMPIO 2
Registro 40084 AC Power value valore letto 1500
Registro 40085 AC power scale factor valore letto -2
Quindi avrò come valore reale 15.00ESEMPIO 3
Registro 40084 AC Power value valore letto 1500
Registro 40085 AC power scale factor valore letto 0
Quindi avrò come valore reale 1500Grazie a chi saprà darmi qualche consiglio
Febbraio 4, 2019 alle 8:30 am #46544Sergio BertanaAmministratore del forumLa visualizzazione delle cifre decimali non è dinamica, quindi la soluzione più veloce è usare una macro, leggere i 2 valori e poi in base al valore di scala dividere per 10-100-1000 ecc… quindi visualizzare il risultato.
Febbraio 4, 2019 alle 2:00 pm #46552AnonimoInattivoGrazie per la risposta, è possibile nella macro utilizzare la funzione per elevare a potenza.
Esempio X = Y^2
Febbraio 4, 2019 alle 2:03 pm #46556Sergio BertanaAmministratore del forumSul manuale di EasyBuilder sono riportate tutte le possibilità offerte dal linguaggio macro (Estratto manuale). Nel tuo caso la funzione POW esegue quello che ti serve, ecco l’estratto del manuale.
POW(source1, source2, result)
Calculate source1 to the power of source2.
source1 and source2 can be a constant or a variable.
result must be a variable.
source1 and source2 must be a nonnegative value.Febbraio 5, 2019 alle 7:49 am #46563AnonimoInattivomacro_command main()
unsigned int Hzinverter
float HZGetData(Hzinverter, “FV”, 4x, 86, 1)
HZ = Hzinverter/100
SetData(HZ, “Local HMI”, LW, 210, 1)
end macro_commandAllora ho fatto questa macro di prova ma non riesco a venirne fuori…. il problema è che la variabile LW 210 float che inserisco nel progetto mi restituisce 1.#qnan
La variabile modbus Hzinverter è int16 la divido per 100 su HZ che è una float dovrei trovarmi per esempio partendo da un valore 4990 il valore di 49.99. Non capisco dove sbaglio
P.S. Non utilizzo la funzione POW perchè ho anche degli esponenti negativi 10^-2 e ho visto che non vengono supportati.
Febbraio 5, 2019 alle 7:56 am #46568Sergio BertanaAmministratore del forumNon ho l’inverter ma utilizzo un nostro sistema SlimLine connesso in ethernet con protocollo Modbus TCP, ed ho fatto la stessa tua prova. Ecco la mia macro
macro_command main()
unsigned int Hzinverter
float HZGetData(Hzinverter, “SlimLine”, 3x, 40008, 1)
HZ=Hzinverter
HZ = HZ/100
SetData(HZ, “Local HMI”, LW, 210, 1)
end macro_commandCome vedi unica differenza è l’indirizzo di lettura della variabile Hzinverter.
Però nota che ho appoggiato il valore Hzinverter nella variabile HZ (Di tipo float) prima della divisione in questo modo considero anche i decimali. Se eseguo subito la divisione per 10o sul valore intero come hai fatto tu si perdono i decimali. Ecco lo screenshot del programma MacroTest simulato, ti allego anche il progetto con i sorgenti.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.