Vai al contenuto
PLC Forum


Conversione Da Numero Di 4 Byte A Float


doctdevid

Messaggi consigliati


Non e' chiaro cosa intendi per un numero di 4 Byte:

se e' un doppio intero con DTR

se e' un BCD fai BTD per metterlo in doppio intero e DTR per metterlo in REAL o Virgola mobile.

Ciao.

Link al commento
Condividi su altri siti

Probabilmente mi sono espresso male. Con vb.net, tramite lidnodave devo leggere e scrivere dei dati di tipo float da e verso db. Per quanto riguarda leggere byte o int non ho problemi, anche perchè stamattina ho preso dall'area download il programma in vb.net (fatto da Bruno) che fa praticamente quasi tutto: si connette, legge e scrive. Vorrei solo sapere come potrei fare a leggere e a scrivere numeri reali.

Link al commento
Condividi su altri siti

Non dovresti convertere, dovresti solo associare un tipo di data, come l'Union sotto:

union reg_32bits
{float mw_32;
char mb_32[4];
};

esempio:

union reg_32bits m_FloatingValue;  // variable declare

m_FloatingValue.mb_32[0];   
m_FloatingValue.mb_32[1];
m_FloatingValue.mb_32[2];
m_FloatingValue.mb_32[3];

m_FloatingValue.mw_32

Link al commento
Condividi su altri siti

Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Explicit)> Structure myFormato
    <FieldOffset(0)> Dim myReal As Single
    <FieldOffset(0)> Dim myDint As Int32
    <FieldOffset(0)> Dim myInt As Int16
    <FieldOffset(0)> Dim Byte4 As Byte
    <FieldOffset(1)> Dim Byte3 As Byte
    <FieldOffset(2)> Dim Byte2 As Byte
    <FieldOffset(3)> Dim Byte1 As Byte
End Structure
    Function ByteToREAL(ByVal B1 As Byte, ByVal B2 As Byte, ByVal B3 As Byte, ByVal B4 As Byte, ByVal CifreDecimali As Short)
        Dim Valore As myFormato
        Valore.Byte1 = B1
        Valore.Byte2 = B2
        Valore.Byte3 = B3
        Valore.Byte4 = B4
        ByteToREAL = String.Format("{0:F" + CStr(CifreDecimali) + "}", Valore.myReal)
    End Function

Link al commento
Condividi su altri siti

Grazie tante per le risposte, per quanto riguarda il problema della lettura ho risolto. Ora mi è rimasto il problema della scrittura: leggo un numero reale, lo converto in bytes e lo passo al plc tramite la funzione apposita di libnodave; il problema però riguarda proprio la conversione. Ho usato la funzione BitConverter.GetsBytes(numero) ma il numero che vedo nel db non è quello letto.

Link al commento
Condividi su altri siti

leggendo le doc di libnodave esistono delle funzioni apposite per inserire un valore di tipo float, c'è qualcuno che l'ha già fatto?

Link al commento
Condividi su altri siti

Fatto.

Dim sValue As Single
Dim Value As Single

Dim buf As Byte() = New Byte(myLen) {}

Value = System.Convert.ToSingle(txtNewValue.Text) 

sValue = libnodave.toPLCfloat(Value)

ConnPLC.WriteByteOnPLC(libnodave.daveDB, myNumDB, myStart, myLen, buf)

Un ringraziamento a Bruno per l'esempio in vb.net su libnodave

Link al commento
Condividi su altri siti

Fatto.
Si', ma...Vedi, l'esempio che ti ho postato Io ( certo, in C++) e' il massimo perche non c'e' nessuna funzione vincolata o trasformazione by code. E' una stuttura pura, e i dati si ricavano solo per corrispondenza, quindi il tempo di esecuzione sarebbe il piu' piccolo ever.

Poi, se dovresti utilizzare per esempio 20000 tags del genere, non se ne parla ne anche.

Link al commento
Condividi su altri siti

  • 2 months later...
Gianmario Pedrani

Ciao ragazzi, ho provato la funzione

Dim sValue As Single

Dim Value As Single

Dim buf As Byte() = New Byte(myLen) {}

Value = System.Convert.ToSingle(txtNewValue.Text)

sValue = libnodave.toPLCfloat(Value)

ConnPLC.WriteByteOnPLC(libnodave.daveDB, 1,84,4,BitConverter.GetBytes(svalue))

quella consigliata da bruno, ma ho mi sfugge qualcosa, perchè non mi funziona..

la dll e la 0.8.4.4

sto utilizzando #develop

grazie a tutti

ciao

Link al commento
Condividi su altri siti

Gianmario Pedrani

Ho risolto, ho dovuto creare una funzione che girasse i byte,

praticamente ho fatto cosi,

Dim sValue As Single

Dim Value As Single

Dim buf As Byte() = New Byte(myLen) {}

Value = System.Convert.ToSingle(txtNewValue.Text)

sValue = libnodave.toPLCfloat(Value)

buf = BitConverter.GetBytes(svalue)

poi ho girato i vari byte di buf e li ho passati alla funzione

ConnPLC.WriteByteOnPLC(libnodave.daveDB, 1,84,4,buf)

cosi sono riuscito a scrivere i valori in virgila mobile..

pensavo che la funzione libnodave.toPLCfloat(Value) facesse già lei la rotazione dei byte

Link al commento
Condividi su altri siti

  • 5 months later...
Grazie Savino,

il tuo metodo per convertire 4 byte in un float è semplicemente perfetto!!!

Of Course!!

Vedi, queste righe di codice non li trovi da nessuna parti, e neanche sui migliore libri :P

Ti ringrazio per il tuo apprezzamento,!! per me e' stato semplicemente un piacere :)

Modificato: da Savino
Link al commento
Condividi su altri siti

  • 7 months later...

Mi è venuto un dubbio (forse stupido)ma

Sto facendo l'impianto di casa, ed ho scelto come sezioni 4 mm2 per dorsali principali, 2,5 per le prese e 1,5 prese .

Ora mi chiedo la terra la devo riportare con la stessa sezione dei vari tratti? o devo usare il 4mm2 anche quando la fase è 2,5(non penso che sia così).

Inoltre una volta che passato la terra in casa come faccio arrivare la terra fino in cantina dove c'è il collettore, di solito come si porta?

Grazie

Link al commento
Condividi su altri siti

ahhhhh :lol:

Veramente, nel senso che non so come farla arrivare al collettore in cantina. Come faccio a capire il passaggio(dietro il contatore presente in casa c'è tipo un cavedio ma non so dovew arriva e dove lo farò uscire il cavo).

Modificato: da aleto83imp
Link al commento
Condividi su altri siti

Fino a 16 mmq la sezione del conduttore di protezione deve essere uguale a quello delle fasi.

In realtà potrebbe essere anche molto meno se.... si facessero i conti.

La "sezione convenzionale" è stata introdotta proprio per non fare i conti.

Link al commento
Condividi su altri siti

Ho notato che non c'è un cavedio è solo un intercapedine .Ora per far arrivare in cantina la terra immagino che dovrò farla passaree nel tubo con i cavi che dal contatore alimentano la mia cantina (è un condominio); il problema è che non so dove arriva il tubo.

Dovrei postare delle foto

Grazie

Link al commento
Condividi su altri siti

  • 11 months later...

Salve a tutti, ancho sto avendo problemi ma sono poco pratico in programmazione

- Innanzitutto: c'è un modo per convertire i 4 byte in Visual ? Senza usare il c++ intendo

- Secondo: cosa si intende per "girare i byte" ?

Grazie in anticipo per le risposte

Link al commento
Condividi su altri siti

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