Facendo riferimento a questa discussione come faccio a fare la stessa cosa in delphi?
cioè a leggere un array di 4 byte come se fosse una variabile di tipo Single.
Facendo riferimento a questa discussione come faccio a fare la stessa cosa in delphi?
cioè a leggere un array di 4 byte come se fosse una variabile di tipo Single.
Con le funzioni a disposizione che operano sui bit, non potresti creare una funzione che semplicemente estrae le parti singolarmente dal vettore di byte che ottieni e, successivamente, le dispone all'interno di una variabile di tipo Double?
Voglio dire, se conosci il significato dei singoli bit, allora qual è la difficoltà nell'estrarli in variabili separate e determinare il valore effettivo? :master:
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
quali sono queste funzioni? :master:
forse stai sopravvalutanto la mia conoscenza del linguaggio
questa sotto è la funzione per leggere una variabile intera di tipo doubleword:
la funzione MBTSwapDWord serve a scambiare i byte a due a due perché in alcuni plc (o su tutti, non lo so) il byte più significativo e quello meno significativo sono invertiti.codice:function TModBusConnection.ReadRegister(Adress: Cardinal; var Value: LongWord): Cardinal; var PointerToDWordBuffer: TpDWordBuffer; begin f_Adress := Adress; f_Quantity := 2; f_FunctionCode := mbfREADREGISTER; result := Execute; if result = 0 then begin PointerToDWordBuffer := @f_ReadBuffer; Value := MBTSwapDWord(PointerToDWordBuffer[0]); end; end;
Per le variabili Real ho fatto l'overloading della funzione però non so come modificare lo statement in rosso...
codice:function TModBusConnection.ReadRegister(Adress: Cardinal; var Value: Single): Cardinal; var PointerToDWordBuffer: TpDWordBuffer; begin f_Adress := Adress; f_Quantity := 2; f_FunctionCode := mbfREADREGISTER; result := Execute; if result = 0 then begin PointerToDWordBuffer := @f_ReadBuffer; Value := MBTSwapDWord(PointerToDWordBuffer[0]); end; end;
ho definito il seguente tipo:codice:TDWordBuffer = array[0..62] of LongWord; TpDWordBuffer = ^TDWordBuffer;
ho provato così, ma la MBTSwapDWord va in errore e non ho la possibilità di modificarla perché sta in una dll:codice:TSingleBuffer = array[0..62] of Single; TpSingleBuffer = ^TSingleBuffer;
codice:function TModBusConnection.ReadRegister(Adress: Cardinal; var Value: Single): Cardinal; var //PointerToDWordBuffer: TpDWordBuffer; PointerToSingleBuffer: TpSingleBuffer; begin f_Adress := Adress; f_Quantity := 2; f_FunctionCode := mbfREADREGISTER; result := Execute; if result = 0 then begin PointerToSingleBuffer := @f_ReadBuffer; Value := MBTSwapDWord(PointerToSingleBuffer[0]); end; end;
Ho provato così:
non da errore ma il numero restituito è sbagliatocodice:function TModBusConnection.ReadRegister(Adress: Cardinal; var Value: Single): Cardinal; var PointerToDWordBuffer: TpDWordBuffer; PointerToSingleBuffer: TpSingleBuffer; DWordValue: LongWord; begin f_Adress := Adress; f_Quantity := 2; f_FunctionCode := mbfREADREGISTER; result := Execute; if result = 0 then begin PointerToDWordBuffer := @f_ReadBuffer; DWordValue := MBTSwapDWord(PointerToDWordBuffer[0]); PointerToSingleBuffer := @DWordValue; Value := PointerToSingleBuffer^[0]; end; end;
:master:
Ho risolto!
ho aggiunto questa funzione che scambia, dato un array di byte, i byte pari con quelli dispari:
poi ho modificato così la ReadRegister:codice:procedure TModBusConnection.SwapByteArray(ArrayOfByte: TpByteBuffer); var i: Integer; byt: Byte; begin for i := 0 to 3 do begin if (i mod 2) = 0 then begin byt:= ArrayOfByte[i + 1]; ArrayOfByte[i + 1]:= ArrayOfByte[i]; ArrayOfByte[i]:= byt; end; end; end;
codice:function TModBusConnection.ReadRegister(Adress: Cardinal; var Value: Single): Cardinal; var PointerToSingleBuffer: TpSingleBuffer; DWordValue: LongWord; begin f_Adress := Adress; f_Quantity := 2; f_FunctionCode := mbfREADREGISTER; result := Execute; if result = 0 then begin SwapByteArray(@f_ReadBuffer); PointerToSingleBuffer := @f_ReadBuffer; Value := PointerToSingleBuffer^[0]; end; end;
In tal caso, posso solo suggerirti di approfondire il linguaggio.Originariamente inviato da ganesha
forse stai sopravvalutanto la mia conoscenza del linguaggio
In questo caso, diciamo allora che - considerando quanto ho capito della tua soluzione - sono io che ho sopravvalutato il mio stesso grado di comprensione del problema proposto.ho aggiunto questa funzione che scambia, dato un array di byte, i byte pari con quelli dispari
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...
probabilmente dipende da come io ho esposto il problema