四时宝库

程序员的知识宝库

关于上一篇 信捷C函数功能块遇到一个bug ,是我学艺不精,表示道歉

关于上一篇文章 使用信捷PLC的C语言函数功能块遇到一个bug,心里多少有点失望!,是我学艺不精,低级的错误。很多网友都给我提供了帮助,有的给我提供了解决办法,有的建议我把C语言的语法好好学学,有的建议我“不是计算机专业的,就不要用C”,有的说我学艺不精怪平台有问题,还有的被笑掉大牙。。。我诚恳的接受批评,也感谢好心网友的指导。

关于之前用汇川H5U遇到的浮点数比较指令遇到的问题,我现在也谨慎的怀疑是可能是我自己使用的问题,我也会再次仔细求证,然后再来分享给大家。

关于昨天使用信捷C函数功能块遇到的问题,早上上班,我就开始找问题,最终找到了问题所在,现在分享给大家(具体什么问题可以查看开头的文章链接):

1、其中一个网友在我写的函数基础上提供的解决方法是对的,对这位网友表示感谢

运行结果是想要的结果,如下

我用了另外一种写法也得到了正确的结果,如下(还有其他办法):

2、多个网友都让我把for循环中的 num > 0修改为num >= 0其实这个问题我知道,是我故意留下的一个梗,就按照我写的那个函数,修改为num >= 0之后,运行就宕机了,昨天晚上没找到原因,所以就留下了这个话头

如网友所愿,把num > 0修改为 num >= 0,修改如下:

测试运行结果如下:

关于上面的运行结果,是不是有点想不到?什么原因?(先不要往下看,再仔细想想能找到原因不?)

3、把 num>0修改为num>=0后,运行程序就出现了宕机,下面就把宕机的原因找出来(题外话,如果信捷的软件能给出语法检查的提示,昨天就把问题解决了,遗憾的是语法检查没有给出警告或者错误提示)

这个原因,我也一头雾水,当然了只能怪自己学艺不精,下面开始验证问题所在!

1)、用VisualStudio写了一段控制台程序进行验证,程序如下:

控制台程序运行结果如下:

什么情况?VisualStudio中正确运行了!当时,一度让我坚信,就是信捷PLC的C函数功能块有问题!想起来,有网友建议我不要轻易怀疑开发软件有问题,99%是自己代码有问题。此网友建议很中肯,再回看代码,还是没发现问题。再换一个开发环境试一试!

2)、用KEIL5写了个相同的函数进行测试,代码如下:

还没开始运行呢!一编译就出了warning,此时原因也就找到了(只能说,出现这样的问题还是自己学艺不精),编译错误提示如下:

3)、这时候想到了检查num的数据类型,在信捷C函数功能块和KEIL5中都是用的无符号整型 INT8U,在VisualStudio中用的是有符号整型int!将VisualStudio中的num修改为无符号整形uint再次运行看看效果,如下:

不同的是,在VisualStudio中报的是数组超限!为啥呢?继续求证!

4)、忽略KEIL5中的warning,单步仿真进行验证,如下:

for循环中比较条件是num>=0,即当num == 0时,条件也是成立的,再次运行num--后,num的值为0xFF,也是大于0的!如此,就死在了for循环中无法跳出了。说到这里,就要讲一下for循环的运行逻辑。

5)、for循环的运行逻辑介绍

for循环的运行逻辑如下:

6)、在VisualStudio中验证for循环跳出时的值

运行结果如下:

7)、回到当初 ,正确修改信捷C函数功能块

至此,这个坑给填上了,不知道网友们满不满意。

一场误会,在这里给信捷道歉。也感谢众多网友的批评与指正。另外,我觉得既然信捷提供了C语言函数功能块的功能,应该完善这部分的语法错误或者报警提示,更有利于用户的使用。加油!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接