Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357

    [Delphi7] importare variabile REAL*4

    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.

  2. #2
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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...

  4. #4
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    quali sono queste funzioni? :master:

    forse stai sopravvalutanto la mia conoscenza del linguaggio

  5. #5
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    questa sotto è la funzione per leggere una variabile intera di tipo doubleword:
    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;
    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.


    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;

  6. #6
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    codice:
      TDWordBuffer = array[0..62]  of LongWord;
      TpDWordBuffer    = ^TDWordBuffer;
    ho definito il seguente tipo:
    codice:
      TSingleBuffer = array[0..62]  of Single;
      TpSingleBuffer    = ^TSingleBuffer;
    ho provato così, ma la MBTSwapDWord va in errore e non ho la possibilità di modificarla perché sta in una dll:
    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;

  7. #7
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    Ho provato così:
    codice:
    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;
    non da errore ma il numero restituito è sbagliato
    :master:

  8. #8
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    Ho risolto!

    ho aggiunto questa funzione che scambia, dato un array di byte, i byte pari con quelli dispari:
    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;
    poi ho modificato così la ReadRegister:
    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;

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da ganesha
    forse stai sopravvalutanto la mia conoscenza del linguaggio
    In tal caso, posso solo suggerirti di approfondire il linguaggio.

    ho aggiunto questa funzione che scambia, dato un array di byte, i byte pari con quelli dispari
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    probabilmente dipende da come io ho esposto il problema

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.