前期回顾:可参见上篇文章西门子STEP7编程过程中常见错误之简单错误及循环程序错误举例 S7-300/400数制及基本数据类型
3.数据类型匹配不严谨
对于一门计算机语言,都是存在数据类型匹配检查不严格的问题,但为了要成为一个有良好编程习惯的编程人员应当遵循数据匹配规则。
3.1 STL指令数据类型匹配
由于STL相对于LAD对于数据类型匹配检查并不严格,这样就要求用户在使用STL编程的时候尤其要注意到这一点。
特别提示:无论是否获得正确结果,下列程序是不应当出现在程序中的:
L 0
L 1.000000e+000
+R
T MD 0
特别提示:而如下程序的细微区别也硬刚引起注意:
L 10
L L#10
L MB10
L MW10
这些操作后的执行结果可以参考L指令的STEP帮助文件及数据类型说明。
执行结果如下图:

装载不同的数据类型,累加器ACCU1中的内容改写情况是不同的,例如装在MW10时,ACCU1的高16位将添加0的处理。
3.2 数据类型匹配与浮点数运算
在流量累计编程中经常会遇到实数加法问题,实数加法运算的注意事项也应当引起重视,看如下程序(假设在0B35中被调用,目的是每隔一定时间累计一次流量)

那么大家看看以上程序是否存在问题呢?
可能大体上看是没有什么问题的,也是可以运行的,但实际情况就是在程序运行一段时间后就会出现问题,此程序在运行之初是正常的,因为累计流量初始值及流量瞬时值都为一个很小的浮点数,两数相加后,结果也正确,但是当一段时间以后,累计流量的数值逐渐增大,当它与瞬时流量的数值相差很远的时候,两者再执行相加操作后,瞬时流量的值将被忽略掉(如999999.0与0.2做加法)。其实具备计算机常识的人都应该清楚这一点,这是由于浮点数的存储机制造成,这个问题可以通过使用二次累加或多次累加的方法来解决。
3.3 浮点数运算与比较指令
用户程序中很多情况下会对浮点数运算的结果与预先设定的值进行比较,例如下面程序比较MD与10.0是否相等,相等则Q0.0=1。

此程序存在两个问题:
* 由于浮点数运算存在误差,所以MD0有可能非常接近于10.0,但是永远不等于10.0。
* 如果MD0在10.0附近数值波动,有可能造成Q0.0输出频繁动作,造成输出接点损坏。
因此,应当使用一个范围比较的方法代替等于数值比较的方法(9.9<MD0<10.1)。对于输出点Q0.0,可以使用R,S指令并增加比较延时指令,来减少输出点的波动情况。

电气相关知识和经验是用来分享,希望本文能对你有帮助。与人玫瑰,手留余香。
欢迎大家关注,点赞,评论及转发。