Converting LREAL to binary and interpreting it as base 10 LINT

Solution 1:

I think what you are trying to achieve is to take as input an LREAL but with the bits inside really being those of a LINT, but byte-swapped.

If so, there should be a more straightforward solution. Here is an example :

FUNCTION lreal_to_int64 : LINT
VAR_INPUT
  value: LREAL;
  value_is_little_endian: BOOL;
END_VAR
VAR
  no_swap: BOOL;
  source_bytes, target_bytes: POINTER TO BYTE;
  value_as_lint: POINTER TO LINT;
END_VAR

{IF defined (IsLittleEndian)}
  no_swap := value_is_little_endian;
{ELSE}
  no_swap := NOT value_is_little_endian;
{END_IF}

IF
  no_swap
THEN
  value_as_lint := ADR(value);
  lreal_to_int64 := value_as_lint^;
  RETURN;  
END_IF

target_bytes := ADR(lreal_to_int64);
source_bytes := ADR(value);
target_bytes[0] := source_bytes[7];
target_bytes[1] := source_bytes[6];
target_bytes[2] := source_bytes[5];
target_bytes[3] := source_bytes[4];
target_bytes[4] := source_bytes[3];
target_bytes[5] := source_bytes[2];
target_bytes[6] := source_bytes[1];
target_bytes[7] := source_bytes[0];

Programmatic access to bits is certainly possible using bitwise operators. Try something like this.

FUNCTION get_bit : BOOL
VAR_INPUT
  value: LWORD;
  bit_position: USINT;
END_VAR
VAR
 shifted: LWORD;
END_VAR

shifted := SHR(value, bit_position);
get_bit := shifted.0;