跟我一起玩200 smart PLC
关于指针及循环指令的应用续3
昨天下午,看到“找答案”版区有一个网友提问,说200smart的指针如何使用问题,问题链接:http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=160093&cid=1029
并帖出一程序,问题描述非常详细,给回答省却许多不必要的误解。我看了一下,感觉没有太大的程序错误语法,仅仅只是指定指针地址偏移处出现了地址区的错误,就回了一个贴,居然还被认可了。仔细想了想感觉不妥,似乎在那里出了一点状况(大汗淋漓)。在回帖时写了一句需要验证,又特将此程序剪切下来,回到家里仔细看起来问题还真不少。
网友的原程序: 经过提示,网友已经意识到错误的出处。
LD Clock_1s
EU //上升沿
LBL 1 //标记
MOVD &VB200, VD100
MOVW *VD100, VW300
+D +2, VD200 //寻址加2
+I +1, VW400 //循环+1次
AW> VW400, 10 //大于等于10次
= M0.0
LDN M0.0 //LD M0.0
JMP 1 //标记 //当循环10次上 调至标记1处,
重新进行循环,显然无法清除循环次数。
MOVW +0, VW400 //重置循环计数器
MOVD +0, VD100 //改此处?? //重置寻址起始位置 //
网友提问的本意应该是想通过指针的地址偏移,将地址自VW200开始的10个数据利用SM0.1标志位的上升沿、指针偏移方式依次写入到数据存储地址VW300中。
上述程序的错误:
首先,取初始指针地址不能每一个秒脉冲都取一次。可以调用SM0.1取一次初始指针地址或者每10个循环到达后再调用(这个方法我经常用的)。
其次,LDN M0.0,根据网友意图是当经过10秒后,清除循环次数及指针返回。但是,如果在此处使用LDN,则意义刚好相反,变为没有到达10始终清零。
再次,调用跳转指令JMP,显然有驳于原编程思路,当循环计数10到达后,调用JMP上跳至标记“1”处,反而无法将循环次数与指针返回。索性删除这个跳转,因为没有必要,原因是循环10次到达后,可以通过双整数指令的减法将指针返回了初始指针地址。
另外,我在初次回复中也强调过关于循环次数比较指令的应用。如果是采用AW>10时,指针返回需要上移22个字;如果是采用AW = 10时,指针返回上移20个字的地址,实际上仅仅是循环10次与11次的区别,如果采用的是AW = 10,最后应该数据VW218只能显示一个扫描周期时间。反之,如果采用的是AW > 10,则有1秒的时间显示,这个可以根据实际需要选择。
于是,修改了一下网友的程序,将程序下载到cpu验证,图示:
修改后的程序如下所示:
启用“状态图表”监控程序运行情况:
看似一个简单的指针调用,实际上里面的内涵还是蛮深奥的,曾经有一位资深大侠的那一句话,我一直记在心里“书读的越多,才知道这个书会变的越厚”。希望那位网友能够看到此贴后改正程序的不合理处,特将此贴通过整理发上来,让大家来看看,加深对西门子200(200smart)指针应用的理解。