Vai al contenuto

Acquisizione valori via Modbus da contatori Iskraemeco

Home Forum Programmazione IEC 61131 (LogicLab) Acquisizione valori via Modbus da contatori Iskraemeco

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Autore
    Post
  • #35963
    Anonimo
    Inattivo

    Stiamo utilizzando dei contatori Iskraemeco MT831/MT860 con il modulo plug&play MKMB-3-e-3 di interfaccia Modbus di cui allego documentazione li abbiamo interfacciati a vostri sistemi SlimLine in Modbus RTU.

    Come si vede alcuni registri come ad esempio registro OBIS 1.8.0 Totalizzatore energia attiva A+ ritornano valori su 8 bytes espressi nel formato IEE754 a 64 bits. Mi chiedevo se esiste la possibilità di convertire questi valori nel formato REAL a 32 bits gestito dallo SlimLine.

    #39433
    Sergio Bertana
    Amministratore del forum

    Ho sviluppato una nuova funzione IEE754DoubleToFloat, IEE754 double to float (Estratto manuale) che converte un valore dal formato IEE754 a 64 bits nel formato REAL a 32 bits gestito dallo SlimLine.

    Ho realizzato il programma IEEConversion (Stampa) che esegue il test di funzionamento della funzione (Download progetto). Naturalmente eseguendo la conversione di formato si ha una perdita di precisione nel numero ed un range diverso del valore.

    #79882

    Rispolvero questo vecchio post ho provato ad utilizzare la funzione, con il seguente codice

    CombinedValue : DWORD;
    CombinedValueR : REAL;
    CombinedValueR:=IEE754DoubleToFloat(ADR(CombinedValue));

    Ma purtroppo ottengo un errore in compilazione SDF(1) – errore G0101:  VALUE => Tipo non corrispondente in assegnazione.

    La mia necessità sarebbe quella di leggere tramite modbus la corrente di assorbimento presa da 2 registri consecutivi a 16 bit, concatenarli in 1 variabile dword e convertirli in float(real).

    Ho visto che avete FB WordToDouble e questa funzione IEE754DoubleToFloat, con questi due sistemi dovrei riuscire ad ottenere quello che mi serve, il problema è l’errore in compilazione.

    #79890
    Sergio Bertana
    Amministratore del forum

    C’è un po di confusione, vedo se riesco a fare chiarezza… La funzione IEE754DoubleToFloat a cui fai riferimento permetteva di convertire un numero dal formato float IEE754 a 64 bits nel formato float IEE754 a 32 bits. Questa operazione era necessaria all’epoca perchè LogicLab non gestiva il formato LREAL cioè float a 64 bits.

    Ma tui hai un’altro problema, hai 2 registri Modbus a 16 bits che ritornano un valore DWORD a 32 bits almeno così credo (Attenzione molti meters di energia ritornano un valore su 2 registri Modbus a 16 bits ma con un valore REAL IEE754 a 32 bits).

    Ora se è una DWORD basta leggere i 2 registri a 16 bits e poi combinare i due valori con la funzione WordsToDouble stando attendo a LSW e MSW, al limite inverti i due registri. Se invece il valore è un REAL devi combinare i due valori e poi trasferirli in una variabile REAL, per comprendere il formato IEE754 puoi utilizzare un convertitore on-line come questo. Ecco un semplice esempio.

    VAR
        DWValue : DWORD; (* DWORD result *)
        RLValue : REAL; (* REAL result *)
        ModbusRegs : ARRAY[0..1] OF WORD; (* Modbus registers *)
    END_VAR
    
    ModbusRegs[0]:=16#449A; //MSW Value
    ModbusRegs[1]:=16#522B; //LSW value
    DWValue:=WordsToDouble(ModbusRegs[0], ModbusRegs[1]); //Result=16#449A522B
    RLValue:=eGetREAL(ADR(DWValue)); //Result=1234.5677
    #79920

    Grazie mille per le dritte,

    Si il mio problema è che devo leggere la corrente di un inverter tramite Modbus, e l’inverter appoggia la variabile float su 2 registri consecutivi WORD, quindi devo combinarli insieme e convertirli in REAL.

    La prima parte l’ho fatta (anche se WordsToDouble mi restituiva un errore “funzione sconosciuta” alla fine cercando un ho visto che nella libreria eLLabUtyLib cè l’FB WordsToDouble)

    Il problema ora è che anche eGetREAL mi ritorna errore ” funzione sconosciuta” ma non sono riuscito a trovarlo in nessuna libreria, come posso risolvere?

    #79927
    Sergio Bertana
    Amministratore del forum

    Da quello che scrivi vedo che non hai seguito l’evolvere delle versioni LogicLab, da un certo tempo a questa parte, nel progetto non vengono più incluse le singole librerie ma si include una raccolta di librerie (Vedi articolo).

    La raccolta ti evita di cercare gli oggetti nelle librerie, basta inserirli nel progetto e si preoccupa LogicLab di cercarli ed utilizzarli.

    Quindi elimina dal tuo progetto tutte le librerie ed inserisci la raccolta in questo modo riuscirai a compilare il programma.

    #79936

    Io utilizzo la versione 5.12.0.36 di logiclab nella gestione libreria non ho l’opzione per aggiungere il pacchetto di libreria, per adesso preferisco non aggiornare in quanto mi ritrovo ( con vecchi programmi ) ad avere decine e decine di problemi in compilazione, per ora preferirei rimanere cosi.

    Ho importato eGETReal ora però non trova PVOID, cè un elenco della posizione di tutte queste funzioni o FB necessarie cosi da importarle tutte?

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Devi essere connesso per rispondere a questo topic.