| 作者 | 主题 |
|---|---|
|
w7703 游民 经验值:60 发帖数:11 精华帖:1 |
楼主
主题:初试STEP 7二三事
初用STEP 7,几天来的摸爬滚打中,从论坛上汲取了不少西门前辈们的经验,如今咱也有一点经历分享给大家。
命题:CPU315+CP340(RS232),使用“串口”及“ASCII”驱动连接打印机。打印内容有:字符串(类似ABC6abc)、日期(07-Mar-2012)、数字编号(000168)、浮点数(12.34)等。 今天我就拿输出“数字编号”说事。 思路:数字编号是DINT类型,因为最终要的是字符,所以要用“FC5 DI_STRING”功能块。一个功能块就搞定,SO EZ! 行动:1、DI_STRING,进去的000168出来的字符只有313638H,还要进行第二步前导0处理。 2、处理前导0,对原DI进行判断,依次:DI小于100000,字符串区第一位写30H;小于10000,第二位写30H;小于1000,第三位写30H;小于100,第四位写30H;小于10,第五位写30H。 3、输出字符串。 结果:考虑还是欠周全,第二步虽然进行了前导0处理,但是因为DI数字的位数不定,所以要BLKMOV指令的地址和大小也要判断考虑,烦烦烦! 这么繁琐,让我们休息一下换种思路吧! 思路_换:DI的数字最前面的0它不是给咱忽略了吗?那咱不让0排在最前它总不会无视吧。DI是6位,给它加上L#1000000,这下DI变成7位了,而且0被“保护”了。下面就可以继续堂而皇之地用FC5 DI_STRING了,String出来以后,string地址的前面四个字节(两个头,一个符号,一个我们加上的‘1’)都给扔了,只要后面的6个字节(‘000168’),欧了!ADD_DI,DI_STRING,BLKMOV三步搞定。 其他问题:浮点转换字符串的时候,出来的是指数形式,这个比较晕,莫非是我指令用错了?没办法只有先乘100然后取整,转成DI,再用DI_string。这点请各位前辈指点。 还有,给大家讲个犯的一个低级错误。因为给字符串分配了固定大小的DB区,而字符串长短不同,有的DBB最后是00H,输出时要换成空格20H输出。所以,要对整个DB数据块进行字节00H筛选,这就用到了指针和循环,STL写完后调试时一直报错,看门狗叫。不用说,肯定是循环出了问题,但是检查来检查去也没找到,最后苦读书,发现是LOOP的问题,LOOP后没有把累加器里减一后的数值T给循环次数,想当然地以为是把循环次数自己减一然后判断了。这个大家权当笑话听吧,(最后感慨一下)练好基本功是何等的重要啊!
我很低调,不随便给人签名。
|