解码用的ASCII转Real函数

已锁定

无心打扰

西门子1847工业学习平台

  • 帖子

    359
  • 精华

    5
  • 被关注

    151

论坛等级:侠圣

注册时间:2009-07-15

黄金 黄金 如何晋级?

解码用的ASCII转Real函数

1037

0

2014-01-21 11:20:20

前段时间用PLC解码大发的监测报警数据,传上来的都是ASCII,库里带的转换函数不合适,自己写了一个,大家斧正。
////由于西门子的STRING_TO_REAL无法使用,采用此小程序转换
//// 最多支持4-5位小数
////
FUNCTION ASCIIToReal: VOID //FC710

VAR_INPUT
ASCIIValue : ARRAY[0 .. 8] OF CHAR;
END_VAR

VAR_IN_OUT

END_VAR

VAR_OUTPUT
Value : Real; ///电压值
END_VAR

VAR_TEMP
RemainPoint:INT; //剩余缓冲区指针
SentenceBegin:INT; ///语句的起始字节
SentenceEnd:INT; ///语句的结束字节
ValueIndex:INT;
IntValue: INT;
PointValue :INT;


c : ARRAY[0 .. 8] OF CHAR;
ValidLen :INT; ///数据有效长度
index:INT;

bNegative:BOOL;
bExistPoint:BOOL; ///是否存在小数点
PointPosition:INT; ///小数点位置
NumAfterPoint:INT; ///尾数个数
NumOfInt :INT; ///整数个数

val_str_point : STRING[10];
val_str_int : STRING[10];
END_VAR

LABEL
LAB1,LAB2;
END_LABEL


CONST
MAXLEN := 8;
END_CONST


BEGIN



ValidLen := 0;
bNegative := FALSE;
SentenceBegin := 0 ;
bExistPoint:=FALSE;
PointPosition := 0;
NumAfterPoint := 0;

val_str_int := '';
val_str_point := '';
/////////去空格
FOR index := 0 TO 7 BY 1 DO // 将接收的缓冲区加入到字符串的艉部
IF( ASCIIValue[index] = '-' OR ASCIIValue[index] = '+' OR ASCIIValue[index] = '.' OR ASCIIValue[index] = '1'
OR ASCIIValue[index] = '2' OR ASCIIValue[index] = '3' OR ASCIIValue[index] = '4' OR ASCIIValue[index] = '5'
OR ASCIIValue[index] = '6' OR ASCIIValue[index] = '7' OR ASCIIValue[index] = '8' OR ASCIIValue[index] = '9'
OR ASCIIValue[index] = '0') THEN
C[ValidLen] := ASCIIValue[index];
ValidLen := ValidLen +1;
END_IF;
END_FOR;


IF(ValidLen<1) THEN
Value := 0;
RETURN;
END_IF;


// PointPosition := ValidLen - 1; ////默认没有小数点
IF( C[0] = '-') THEN
bNegative := true;
SentenceBegin := 1;
END_IF;

FOR index := SentenceBegin TO ValidLen - 2 BY 1 DO // 将接收的缓冲区加入到字符串的艉部
IF(C[index] = '.') THEN
bExistPoint := TRUE;
PointPosition := index;
NumAfterPoint := ValidLen - 1 - PointPosition;
GOTO LAB1;
END_IF;
END_FOR;




/////////////如果不存在小数点
IF(bExistPoint = FALSE) THEN
FOR index := SentenceBegin TO ValidLen - 1 BY 1 DO // 将接收的缓冲区加入到字符串的艉部
val_str_int := CONCAT(in1 := val_str_int, IN2 := CHAR_TO_STRING(c[index]));
END_FOR;
IntValue := STRING_TO_INT(val_str_int);
Value := INT_TO_REAL(IntValue);
GOTO LAB2;
END_IF;

LAB1:

FOR index := SentenceBegin TO PointPosition - 1 BY 1 DO // 将接收的缓冲区加入到字符串的艉部
val_str_int := CONCAT(in1 := val_str_int, IN2 := CHAR_TO_STRING(c[ index]));
END_FOR;

FOR index := PointPosition + 1 TO ValidLen - 1 BY 1 DO // 将接收的缓冲区加入到字符串的艉部
val_str_point := CONCAT(in1 := val_str_point, IN2 := CHAR_TO_STRING(c[ index]));
END_FOR;

IntValue := STRING_TO_INT(val_str_int);
PointValue := STRING_TO_INT(val_str_point);

CASE NumAfterPoint OF
0:
Value := INT_TO_REAL(IntValue);
1:
Value := INT_TO_REAL(IntValue) + INT_TO_REAL(PointValue)/10.0;
2:
Value := INT_TO_REAL(IntValue) + INT_TO_REAL(PointValue)/100.0;
3:
Value := INT_TO_REAL(IntValue) + INT_TO_REAL(PointValue)/1000.0;
4:
Value := INT_TO_REAL(IntValue) + INT_TO_REAL(PointValue)/10000.0;

END_CASE;


LAB2:
IF(bNegative) THEN
Value := -1 *Value;
END_IF;

END_FUNCTION
解码用的ASCII转Real函数 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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