发布于 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