签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
在最近的一个项目中,编程范了个错误,跟 大家分享一下:
先看程序 (2个累加程序 ):
程序运行一切正常,正常累计
M1.5为1S脉冲
但是运行了一段时间后,发现MW3000的累计可以正常累计到3769后清零,MD2000总是计不到123456,这个问题郁闷了很久。
后来查看了加法指令的帮助,发现了问题:
加一个16位数,范围为-32768 to 32767,问题找到,进行测试
把MD2000给定65530,累计到65536时,数据清零,看来就是加法指令没用好啊
把程序修改为以下可以解决:
L MD 2000 + L#1 T MD 2000
把1变为32位数
或者改为
L MD 2000 L 1 +D T MD 2000
看似一个小小的编程问题,说明了平时的编程不严谨,对SIEMENS的指令理解的还不够透彻。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1328939&b_id=4&s_id=0&num=16
这是你的过失啊,手册或者帮助都有例程可以参考只是你发的帮助不全省略了下面的示例程序。
对于溢出处理,是计算机编程的基本功啊
一般的想法是
LD 2000
+1
T LD 2000
是会加到2147483647再清零,因为是32位,但是就是这个+1没有定义为32位,所以才出现了这种情况。
+1和+L#1是两种不同的概念。前者是16位整数,后者是32位整数。L是long的缩写,即长整数。
是这样的,就是没有加上32位的1,当时也没多想,自以为只要加1就可以了,PLC会自动转换的
是有例子,是16位加16位的,和32位加32位的,我的问题是32位的存储器与16位的相加,结果变为了16位,我以为用了32位存储器就一定会是32位的结果,失误啊
用梯形图来编就不会出现这种失误。
又是一个典型的应用经验,看似简单,实际上也是能力的体现。
跟编程方式无关.
梯形图对数据类型有严格的要求,而语句表对数据类型的要求不是很严格。在梯形图中想犯这个错误都不行。
不看手册的后果
计数要考虑的上限~学计算机基础知识好像就有说了,对字节 字 双子 无符号 有符号都要注意~
梯形图直接报错,输不进去。我v用的STEP7 v5.5版的,以前没怎么注意,现在用仿真调试程序时,发觉OB1里的程序怎么没有编译功能,直接保存,是软件的问题还是西门子软件本来就是这样的。不编译好像还是能够发现错误,当你要保存程序时若有错误会提示你。感觉好怪
相加的数数据类型要一致
不错,学习了!
最主要是的还有一点:
当把MD2000给定超过65536时,MD2000还能继续往后累计,只要不为65536就可以正常累计;
测试的时候还是有疏漏。
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录