早晨,我顺着北京早高峰的人流,辗转来到办公室,开始一天的热线工作。
我按登记电话,给客户打了过去,客户的彩铃很炫,“您好,我是接线员葛优,您呼叫的用户已经超出了地球服务区,我们将以广播找人的方式帮您联络。。。。。。”
终于接通了,“刘工您好,我是西门子热线,您有个计数器问题是吗?”
客户:“对。我搞了多年工控,居然计数器C都搞不定了,昨天折腾一天了。计数器预设值PV,到底怎么设?为啥时而正常,时而报错,甚至CPU停机,SF亮红灯,诊断信息显示BCD转换错误”
哦,肯定是编程错误了。“刘工,您的程序是不是计数器C编号冲突,在其他地方是不是也有这个C的定义?”
客户:“肯定没有冲突,我交叉参考表中都查了。我换了好几个C,也是这样的问题”
我继续挖,“刘工,您计数器C的预设值PV,是什么变量?是不是地址冲突?”
客户:“你就放心吧,我都查了,也换过地址,肯定没冲突。我干了多年PLC了,这些我都懂得”
莫非是预设值PV大于999了?我问道:“刘工,计数器C的范围是0~999,您没超限吧?”
客户:“没有,我的PV值是456,没超限的”
呦,看来问题有点复杂,编程问题是千头万绪的,这样语言沟通很难搞清楚。“刘工,您可否把出问题的这一块程序拷屏,把图片发过来?诊断信息也发来,好吗?”
客户动作麻利,很快就发邮件过来了。
客户程序如下图所示:

客户反映,在计数器预设值MW20小于等于9时,一切正常。MW20大于等于10时,置位S则CPU会停机,STOP亮黄灯,SF亮红灯。诊断信息如下图:
在程序中添加OB121后,再次置位S,则只SF亮红灯。诊断信息如下图:
有图有真相,我很快弄明白了客户的症结所在,问题就出在预设值MW20上。
首先,要知道计数器接口参数的数据类型,如下图。
可见,预设值PV是WORD类型,并且是C#<value>的格式。计数器C#<value>格式是什么呢?计数器C#<value>格式就是BCD码,范围为C#0 ~ C#999。
哈哈,看出问题了吧。客户用MW20做预设值PV,数据格式不对,必须转为BCD码才行。但为什么MW20等于小于9时,一切正常呢?这是因为9以内,和BCD码表示完全一样。大于9时,就大相径庭了。
正确做法,如下图所示。注意,MW20既可以做INT类型,也可做WORD类型。为严肃纪律,在此推荐用数据块DB地址,以便数据类型WORD和INT做明确定义。

