项目中遇到REAL计算输出成#NaN的情况,PCS7中用一个FC260来处理的,解密FC260得出的STL如下:

SET
SAVE
= L 16.1
L 0
T #ErrNum
L #In
T #theREAL
L #theREAL
L DW#16#7F800000
AD
T #exponent
TAK
L DW#16#400000
AD
T #fraction_1
TAK
L DW#16#3FFFFF
AD
T #fraction_2
L #theREAL
T #RET_VAL
L #exponent
L DW#16#7F800000
==D
JCN A7d0
L #fraction_1
L DW#16#0
<>D
L #fraction_1
L DW#16#0
= L 16.2
==D
L #fraction_2
L DW#16#0
= L 16.3
<>D
A L 16.3
O L 16.2
JCN A7d1
L 3
T #ErrNum
CLR
= L 16.1
JU A7d2
A7d1: L #fraction_1
L DW#16#0
==D
L #fraction_2
L DW#16#0
= L 16.2
==D
A L 16.2
JCN A7d7
L 1
T #ErrNum
L #theREAL
L 0.000000e+000
>R
JCN A7d4
L 3.402822e+038
T #RET_VAL
JU A7d2
A7d4: L -3.402822e+038
T #RET_VAL
A7d2: JU A7d7
A7d0: L #exponent
L DW#16#0
==D
L #fraction_1
L DW#16#0
= L 16.2
<>D
L #fraction_2
L DW#16#0
= L 16.3
<>D
O L 16.3
A L 16.2
JCN A7d7
L 2
T #ErrNum
L 0.000000e+000
T #RET_VAL
A7d7: CLR
A L 16.1
SAVE
BE
根据个人理解转成SCL如下:
FUNCTION "ChkREAL" :REAL
VAR_INPUT
IN:REAL;
END_VAR
VAR_OUTPUT
ErrNum:INT;
END_VAR
VAR_TEMP
theREAL:REAL;
exponent:DWORD;
fraction_1:DWORD;
fraction_2:DWORD;
END_VAR
ErrNum := 0;
theREAL := IN;
REALChk := theREAL;
exponent := REAL_TO_DWORD(theREAL) AND 16#7F800000;
fraction_1:= REAL_TO_DWORD(theREAL) AND 16#400000;
fraction_2:= REAL_TO_DWORD(theREAL) AND 16#3FFFFF;
IF exponent = 16#7F800000 THEN
IF fraction_2 <> 16#0 & fraction_1 = 16#0 OR fraction_1 <> 16#0 THEN
ErrNum := 3;
ELSIF fraction_1 = 16#0 & fraction_2 = 16#0 THEN
ErrNum := 1;
IF theREAL > 0.0 THEN
REALChk := 3.402822e+038;
ELSE
REALChk := -3.402822e+038;
END_IF;
END_IF;
ELSE
IF (fraction_2 <> 0 OR fraction_1 <> 0) & exponent = 0 THEN
ErrNum := 2;
REALChk := 0.0;
END_IF;
END_IF;
END_FUNCTION
求教大神转换是否准确,谢谢