现场一台机器出现了个问题,我是按照FOR-NEXT循环写的程序, 总共有15节烘箱加热,可是现场反映就第13节动作异常! 我是打死不信啊! 原因无它,用循环语句循环15遍,要出问题就都有问题啊,怎么可能单单第13节有问题呢? 今天到现场监控了一下,别说,还真是第13节有问题! 问题出在那儿呢? 程序中有如下一句:(为了求当前字总共16位当中那个位为1的最高值,比如第10位为1,则返回10)
iNum := DINT_TO_INT(TRUNC(LN(UINT_TO_REAL(SWAP(#iTemp)))/LN(Real#2.0)));
就这么简单的一句,可是当iTemp=32时,得到的结果iNum却还是12! 按照计算应该是13才对呀!
10#32= 16#20 , Swap后即为16#2000=10#8192
LN(8192)=9.010913...
LN(2.0)=0.693147...
两者相除,结果等于13.000028854,截尾取整,按理说应该是13吧? 可是PLC运算的结果就是12 !
其他的条件,比如iTemp=16则iNum=12, iTemp=64则iNum=14都是正常的!
我没招了! 只能人为地改啊! 把语句改成: iNum := DINT_TO_INT(TRUNC(LN(UINT_TO_REAL(SWAP(#iTemp)))/LN(Real#2.0) + 1.0E-6));
人为地加个极小的数,则正常工作了!
后来再玩一把,改成: iNum := DINT_TO_INT(TRUNC(LN(UINT_TO_LREAL(SWAP(#iTemp)))/LN(LReal#2.0)));
各位看官,注意到区别没? 将原程序的REAL改成了LREAL, 则也正常工作了!
大家觉得这算BUG吗? 有兴趣的朋友测试一下,就量iTemp=32时才有问题。