| 作者 | 主题 |
|---|---|
|
spring 官方工程师
经验值:438 发帖数:191 精华帖:5 |
楼主
主题: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; 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 |
楼
主题:回复:DINT_STRING转换程序分享
'$t''+''1''2''3''4'
你看起来比较难受,是因为你对STRING类型数据定义不清楚所致。 前两个字节你应当用DEC方式监控,而不应当和后面的一样用CHAR监控。 然后你就会明白,STRING的定义方式还是有道理的。
微信公众号:PLC标准化编程,ZHO6371995
|