技术论坛

 DINT_STRING转换程序分享

返回主题列表
作者 主题
spring
官方工程师
西门子官方工程师西门子官方工程师

经验值:438
发帖数:191
精华帖:5
楼主    2006-05-11 10:41:18
主题:DINT_STRING转换程序分享 精华帖 
在一些通信程序中,需要将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
万泉河
至圣

经验值:29190
发帖数:10900
精华帖:131
    2006-05-16 19:16:17
精华帖  主题:回复:DINT_STRING转换程序分享
'$t''+''1''2''3''4'
你看起来比较难受,是因为你对STRING类型数据定义不清楚所致。
前两个字节你应当用DEC方式监控,而不应当和后面的一样用CHAR监控。
然后你就会明白,STRING的定义方式还是有道理的。
微信公众号:PLC标准化编程,ZHO6371995
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。