Numero cifre decimali da variabile modbus

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

Home Forum Terminali operatore (Weintek) Numero cifre decimali da variabile modbus

Questo argomento contiene 5 risposte, ha 2 partecipanti, ed è stato aggiornato da  Sergio Bertana 1 settimana, 4 giorni fa.

Stai vedendo 6 articoli - dal 1 a 6 (di 6 totali)
  • Autore
    Articoli
  • #46533

    Ivan
    Partecipante

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

    ESEMPIO 2

    Registro 40084 AC Power value  valore letto 1500
    Registro 40085 AC power scale factor valore letto -2
    Quindi avrò come valore reale 15.00

    ESEMPIO 3

    Registro 40084 AC Power value valore letto 1500
    Registro 40085 AC power scale factor valore letto 0
    Quindi avrò come valore reale 1500

    Grazie a chi saprà darmi qualche consiglio

    #46544

    Sergio Bertana
    Amministratore del forum

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

    #46552

    Ivan
    Partecipante

    Grazie per la risposta, è possibile nella macro utilizzare la funzione per elevare a potenza.

    Esempio X = Y^2

    #46556

    Sergio Bertana
    Amministratore del forum

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

    #46563

    Ivan
    Partecipante

    macro_command main()
    unsigned int Hzinverter
    float HZ

    GetData(Hzinverter, “FV”, 4x, 86, 1)
    HZ = Hzinverter/100
    SetData(HZ, “Local HMI”, LW, 210, 1)
    end macro_command

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

    #46568

    Sergio Bertana
    Amministratore del forum

    Non 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 HZ

    GetData(Hzinverter, “SlimLine”, 3x, 40008, 1)
    HZ=Hzinverter
    HZ = HZ/100
    SetData(HZ, “Local HMI”, LW, 210, 1)
    end macro_command

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

Stai vedendo 6 articoli - dal 1 a 6 (di 6 totali)

Devi essere loggato per rispondere a questa discussione.