REAL aus DWORD konvertieren?

More
8 months 2 weeks ago #421 by Christoph
Hallo zusammen,

wir würden gern aus dem DWORD "43BE4000", welches von einer S7 per ProfiBus übergeben wird, mit LogiCAD wieder eine REAL konvertieren, die in diesem Fall "380,5" sein müsste. Leider ergibt die Funktion TO_REAL hier den Wert "1136541696".

Dass DWORD und Dezimalzahl korrekt sind, kann ich z.B. hier überprüfen: www.h-schmidt.net/FloatConverter/IEEE754.html

Was machen wir falsch? Für einen Tipp wäre ich sehr dankbar!

Please Log in or Create an account to join the conversation.

  • Walter Zögernitz
  • Visitor
  • Visitor
8 months 1 week ago #422 by Walter Zögernitz
Replied by Walter Zögernitz on topic REAL aus DWORD konvertieren?
Hallo,

nach interner Abklärung kann ich Dir folgende Rückmeldung geben:
Beim von Dir beobachteten Verhalten handelt es sich um einen Bug in der Konvertierung DWORD->REAL. Dieser wurde dokumentiert und wird in der Folge behoben. Aus jetziger Sicht kann ich für das Erscheinen des Fixes noch kein konkretes Datum nennen.

lg
Walter

Please Log in or Create an account to join the conversation.

  • Walter Zögernitz
  • Visitor
  • Visitor
8 months 5 days ago #426 by Walter Zögernitz
Replied by Walter Zögernitz on topic REAL aus DWORD konvertieren?
Hallo nochmal,


ich kann dir für die Zeit bis zur Behebung einen Workaround anbieten. Er kann zumindest bis zur logi.CAD 3 Version V2.0 eingesetzt werden können. Dazu muss ein C-Baustein erstellt werden, welcher die gewünschte Typkonvertierung durchführen kann.

Hier ein geeigneter Code dafür:


code für einen IECIF Baustein
{extern_c}
FUNCTION dwordtoreal : REAL
VAR_INPUT
in : DWORD;
END_VAR
END_FUNCTION

Für die Implementierung:

#ifndef LC_PROT_LCFU__DWORDTOREAL_C
#define LC_PROT_LCFU__DWORDTOREAL_C

#include <lcfu___dwordtoreal.h>

/* Functions */
void lcfu___DWORDTOREAL(LC_TD_Function_DWORDTOREAL* LC_this, LC_TD_DWORD LC_VD_IN, struct _lcoplck_epdb_1_impl* pEPDB)
{
/* Vendor Code */
LC_this->LC_VD_DWORDTOREAL = *(LC_TD_REAL *)(&LC_VD_IN);
}

#endif



ST-Code:

VAR
dw : DWORD := 16#43BE4000;
real1, real2 : REAL;
END_VAR

real1 := TO_REAL(dw);
real2 := dwordtoreal(dw);

Please Log in or Create an account to join the conversation.

LOGI.CALS AUSTRIA

Address

Europaplatz 7/1,
3100 St. Pölten

LOGI.CALS GERMANY

Address

Postfach 1306,
40738 Langenfeld
© 1987 - 2019 logi.cals GmbH