发布于 2009-09-21 08:27:48
0楼
感谢各位精彩的回答,尤其是Zane版主提供了一个新的思路。
以下是根据我自己的思路写的SCL程序,供大家参考:
FUNCTION FC70 : VOID //ASCII码转浮点数'0.123'->0.123
TITLE = 'ASCII 2 Float Data by dcount'
VERSION: '1.0';
AUTHOR: 'dcount';
NAME: 'ASCII2R';
FAMILY: 'CITICHMA';
VAR_INPUT
// Input Parameters
DBNO:WORD;
StartByte:INT;
END_VAR
VAR_OUTPUT
// Output Parameters
OutReal:REAL;
END_VAR
VAR_TEMP
// Temporary Variables
TempLoop:INT;
TempValue:INT;
TmpSignal:REAL; //符号
PointPos:INT; //小数点位置
TempReal:REAL;
END_VAR
LABEL
OVER;
END_LABEL
BEGIN
//初始化代码段*****************
OutReal:=0.0;
TmpSignal:=1.0;
PointPos:=StartByte+1;
//初始化代码段*****************
//错误检测代码段*****************
FOR TempLoop:=StartByte TO StartByte+4 BY 1 DO
TempValue:=BYTE_TO_INT(WORD_TO_BLOCK_DB(DBNO).DB[TempLoop]);
IF NOT (TempValue=45 OR TempValue=46 OR (TempValue>=48 AND TempValue<=57)) THEN //'-'=45,'.'=46
//如果有任一字符不属于(0~9.-),则退出程序
OutReal:=0.0;
GOTO OVER;
END_IF;
IF TempValue=46 THEN
PointPos:=TempLoop;
END_IF;
END_FOR;
IF PointPos<=StartByte OR PointPos>=StartByte+4 THEN
GOTO OVER;
END_IF;
//错误检测代码段*****************
//符号位检测代码段*****************
IF WORD_TO_BLOCK_DB(DBNO).DB[StartByte]=B#16#2D THEN TmpSignal:=-1.0; END_IF;
//符号位检测代码段*****************
//整数小数分割代码段*****************
IF WORD_TO_BLOCK_DB(DBNO).DB[StartByte]=B#16#2D THEN //如果首位为-号
FOR TempLoop:=StartByte+1 TO PointPos-1 BY 1 DO
TempReal:=INT_TO_REAL(BYTE_TO_INT(WORD_TO_BLOCK_DB(DBNO).DB[TempLoop])-48); //计算整数部分和
OutReal:=OutReal+TempReal*EXPD(PointPos-TempLoop-1);
END_FOR;
FOR TempLoop:=PointPos+1 TO StartByte+4 BY 1 DO
TempReal:=INT_TO_REAL(BYTE_TO_INT(WORD_TO_BLOCK_DB(DBNO).DB[TempLoop])-48); //计算小数部分和
OutReal:=OutReal+TempReal*EXPD(PointPos-TempLoop);
END_FOR;
ELSE
FOR TempLoop:=StartByte TO PointPos-1 BY 1 DO
TempReal:=INT_TO_REAL(BYTE_TO_INT(WORD_TO_BLOCK_DB(DBNO).DB[TempLoop])-48); //计算整数部分和
OutReal:=OutReal+TempReal*EXPD(PointPos-TempLoop-1);
END_FOR;
FOR TempLoop:=PointPos+1 TO StartByte+4 BY 1 DO
TempReal:=INT_TO_REAL(BYTE_TO_INT(WORD_TO_BLOCK_DB(DBNO).DB[TempLoop])-48); //计算小数部分和
OutReal:=OutReal+TempReal*EXPD(PointPos-TempLoop);
END_FOR;
END_IF;
OutReal:=OutReal*TmpSignal;
//整数小数分割代码段*****************
OVER:;
END_FUNCTION
非淡泊无以明志,非宁静无以致远