BUG? BUG? 我觉得应该算是BUG

已锁定

伊默

西门子1847工业学习平台

  • 帖子

    4260
  • 精华

    119
  • 被关注

    201

论坛等级:至圣

注册时间:2003-10-24

黄金 黄金 如何晋级?

BUG? BUG? 我觉得应该算是BUG

4015

34

2019-12-10 19:31:20

现场一台机器出现了个问题,我是按照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时才有问题。

BUG? BUG? 我觉得应该算是BUG 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有8583条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。