签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
跟我一起玩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)指针应用的理解。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1394823&b_id=64&s_id=0&num=19
不错学习了,建议少用等于指令,因为会存在扫描周期问题,可能会使程序不能执行
具体问题具体分析,在这里可以。因为这个周期需要数据500mS。
多断电几次,你看看你的程序有没有问题?
看不习惯IL,比较习惯LD、ST。
还真没有测试过进行多次断电后重新上电的,如果说可能的问题,那只有这些数据的初始化。
shine侠:您能够说说?
sm0.1,vd100初始化了,但VW400没有。
在VW400>=10的时候,VW400用的move 0,但VD100用的是-22。如果断电的时候VW400不为0呢?V区都是默认断电保持的。
谢谢楼主挂念,不过我还有几个疑惑,本来想到项目上实际测试,为节约时间还是麻烦你了。
1、我看SMATER指针帮助大部分是以读为例子,不知道写的话有没有别的要求?
2、SMATER有离线的仿真器没有?
3、还有几个问题在图片上,请看一下!!
对了,储存区间隔是14字节,所以每次+14!
你好:
我有时间可以测试一下的,但让我一直无法理解的是你究竟有没有仔细的看过我任何的回帖呢?
是否一直停留在你说你的,我又讲我的那些事情。
哦,对了,你是那位在找答案中提问的那位?
引用详细内容:
你的担心不无道理,可这个问题的起因是我上面已经说过,这个仅仅是网友程序中其中的一个片段,我也是仅仅按这个片段做的一些回复,程序的完整性当然需要进一步验证。
因为我没有那位网友的完整程序,也仅仅是按上面的一段程序做了一些自己的判断。
这句“节约时间”用的真好
引用6楼详细内容:
其实你不要用-22复位指针,而是直接用MOVD & 就可以了
引用10楼详细内容:
区别在哪里?
我这样使用的目的是让楼主能够看清楚指针是怎么样一件东西。
引用12楼详细内容:
如果断电再上电,VD100初始化了,指向vw300,VW400没有初始化,假设其等于5,执行6次之后,vw400>10,vw400复位为0,VD100减22之后就寻址到了vb190了,如果多断电几次,就可能出现间接寻址错误了。
引用13楼详细内容:
看到这里,我必须要跟正一下了,指针不是初始化,指针地址不包含数据!而是指定指针的起始位置。
假设,你的可能成立,你这个VB190是如何算得?没有将数据寄存器和循环次数初始化的可能错误的结果是第一次循环计算可能会出现数据错误,但第二次循环时这些错误将不复存在!
实际上你这些说明也都是一些自己的疑问?如果按你的意思当循环结束指针返回用movd &,指针会按你的意思返回到起始地址?这些你的问题你都做过验证?更本性的实质问题,我已经在这个开始回复中强调了。
好吧,我错了,VD100指向VB200的话,不会出现间接寻址错误,因为每次上电还会有初始化,不会累积,但起始数据可能是VW180到vw200之间的一个地址,根据上次断电时vw400的值而定。
我告诉你190是怎么算出来的。
假设上次断电时vw400=5,V区断电保持
SM0.1时 VD100指向VB200
执行6次,VW400=11,VD100指向VB212,然后执行vw400=0,vd100-22后,VD100指向了VB190,然后就是循环从VW190到VW208传递数据到VW300了
如果不是用-22,而是直接取地址给VD100,就不会取错数据,只不过不是从VW200开始取数据,而是从VW200到VW218之间的其中一个数值开始取,但会一直在这个区间内取值。
这就是用-22 和直接取地址的区别
来学习学习,对指针还不够熟悉。
引用7楼详细内容:
哈哈哈哈,俗话说的好,得了一寸想一尺!!!!!
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录