因为工作需求,写了一个关于生产率看板的程序,MCU用的是51单片机,因为只涉及到一些简单的计算,所以用51就足够了。(下图就是做的生产管理看板)
其中实际数和不良数是由光电开关提供脉冲进行加数的,这个只是做一个类似于按键消抖的功能便可以了,不良率是由不良数/实际数得来的,一开始我把三个变量设置的数据类型均为无符号int型的,大小在0~65535之间,感觉没啥毛病,整体功能完成后便给客户发过去使用了。
计算公式:
Defective_Rate = Number_Bad*1000/Actual_Production;
if(Number_Bad>=Actual_Production) Defective_Rate=999;
if(Defective_Rate<=0) Defective_Rate=0;
if(Defective_Rate>99) Defective_Rate_Code[0]=Defective_Rate%1000/100; else Defective_Rate_Code[0]=11;
Defective_Rate_Code[1]=Defective_Rate%100/10;
Defective_Rate_Code[2]=Defective_Rate%10;
后来客户反应不良率计算不准确,我的内心是比较尴尬的,在老板的追问下只好要求客户拍个视频过来看一下怎么个出错法。
看了客户发过来的视频,发现不良数加到65以内的时候都是没毛病的,但是超过65就变成0了,脑袋一闪,65、65、65535,好吧,知道问题在哪了,不良数*1000/实际数,这是我的计算公式,65*1000=65000,再加1的话,不良数便溢出了,所以导致不良率显示又为零了。
最后把不良数的数据类型换成了long int,然后就没有再出错了,这是一个很小的问题,但是我觉得这也是一个容易犯错的地方,还是得细心一点啊。