回复:关于ASCII码转浮点数的讨论

dcount107

  • 帖子

    1737
  • 精华

    55
  • 被关注

    29

论坛等级:侠圣

注册时间:2003-06-06

普通 普通 如何晋级?

发布于 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
非淡泊无以明志,非宁静无以致远
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。