回复:ASCII码转换

spring

官方工程师

  • 帖子

    191
  • 精华

    5
  • 被关注

    138

论坛等级:游侠

注册时间:2003-06-06

普通 普通 如何晋级?

发布于 2006-07-11 14:18:30

0楼

在一些通信程序中,需要将DINT 格式的数据转换为STRING 类型。虽然使用STEP7 自带的FC5(DI_STRING)可以把DINT转换为 STRING,但输出是从前排列的,例如输入1234,输出'$t''+''1''2''3''4',前面空位没有相应补充'0', 而且STRING 占用长度也比较大,用起来不太方便。

改进程序:

输入范围,0-2147483647,输出类型Array [1..10] Of Char,

前面会相应补充'0',

例如:输入 1234

   输出 '0''0''0''0''0''0''1''2''3''4' 



使用时如果数据不长,使用几位,就在输出结果中取用几位即可。

将源代码编译后,调用FB204即可,也可直接调用FC205(程序中指定MD0 为输入,大家可自行修改),但需将结果从Array中取出。

FUNCTION FC 205 : VOID

TITLE =

AUTHOR : zc

NAME : DINT_ASC

VERSION : 0.1





VAR_INPUT

DINT_IN : DINT ;

END_VAR

VAR_OUTPUT

ASC_OUT : ARRAY [1 .. 10 ] OF CHAR ;

END_VAR

VAR_TEMP

DINT_IN_TEMP1 : DINT ;

DINT_IN_TEMP2 : DINT ;

DINT_IN_TEMP3 : DINT ;

LOW_BCD : DWORD ;

HIGH_BCD : DWORD ;

END_VAR

BEGIN

NETWORK

TITLE =





L #DINT_IN;

L 0;


JC END;





L #DINT_IN;

L L#10000000;

>D ;

JCN NORM;



L #DINT_IN;

L L#10000000;

/D ;

T #DINT_IN_TEMP2; //HIGH 3 BIT of DIN_IN



L #DINT_IN_TEMP2;

L L#10000000;

*D ;

T #DINT_IN_TEMP3;



L #DINT_IN;

L #DINT_IN_TEMP3;

-D ;

T #DINT_IN_TEMP1; // LOW 7 BIT of DINT_IN



JU BCDS;





NORM: L 0;

T #DINT_IN_TEMP2;

L #DINT_IN;

T #DINT_IN_TEMP1;



BCDS: NOP 0; // BCD convert start



L #DINT_IN_TEMP1;

DTB ;

T #LOW_BCD;



L #DINT_IN_TEMP2;

DTB ;

T #HIGH_BCD;





L #LOW_BCD;

L DW#16#F;

AD ;

L B#16#30;

+D ;

T #ASC_OUT[10]; //GET CHAR[10]



L #LOW_BCD;

L DW#16#F0;

AD ;

RRD 4;

L B#16#30;

+D ;

T #ASC_OUT[9]; //GET NUM[9]



L #LOW_BCD;

L DW#16#F00;

AD ;

RRD 8;

L B#16#30;

+D ;

T #ASC_OUT[8]; //GET NUM[8]



L #LOW_BCD;

L DW#16#F000;

AD ;

RRD 12;

L B#16#30;

+D ;

T #ASC_OUT[7]; //GET NUM[7]



L #LOW_BCD;

L DW#16#F0000;

AD ;

RRD 16;

L B#16#30;

+D ;

T #ASC_OUT[6]; //GET NUM[6]



L #LOW_BCD;

L DW#16#F00000;

AD ;

RRD 20;

L B#16#30;

+D ;

T #ASC_OUT[5]; //GET NUM[5]



L #LOW_BCD;

L DW#16#F000000;

AD ;

RRD 24;

L B#16#30;

+D ;

T #ASC_OUT[4]; //GET NUM[4]





L #HIGH_BCD;

L W#16#F;

AD ;

L B#16#30;

+D ;

T #ASC_OUT[3]; //GET NUM[3]



L #HIGH_BCD;

L W#16#F0;

AD ;

RRD 4;

L B#16#30;

+D ;

T #ASC_OUT[2]; //GET NUM[2]



L #HIGH_BCD;

L W#16#F00;

AD ;

RRD 8;

L B#16#30;

+D ;

T #ASC_OUT[1]; //GET NUM[1]





END: NOP 0;

END_FUNCTION



FUNCTION_BLOCK FB 204

TITLE =

VERSION : 0.1





VAR

S1 : ARRAY [1 .. 10 ] OF CHAR ;

END_VAR

BEGIN

NETWORK

TITLE =



CALL FC 205 (

DINT_IN := MD 0,

ASC_OUT := #S1);





END_FUNCTION_BLOCK
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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