MODBUS通讯小数点的故事
这是个值得脸红的事情,但是教训是深刻的。 做一个系统,通过MODBUS通讯5个站点的状态,每个站点的状态值相加之和小于75需要进行报警,很简单的程序啊。 选型,硬件配置,软件编写。因为阀值是一个实数,为了让程序好看点,尽量少占用内部四平治癫痫最好的医院寄存器,就用语句表编程了。第一个地雷已经埋好,已经埋好,已经埋好,重要的事情说三遍。程河北专业治疗癫痫病医院序编好,总要模拟器运行下,通讯一般不会出问题,那就直接模拟比较这个阶段癫痫病会遗传吗的程序了。第二个地雷已经埋好,已经埋好,已经埋好,重要的事情说三遍。运老人得了癫痫病怎么办行没问题。好了,完活。 其他没就再管。等待现场调试,等待了五六个月,都快把这个项目给忘了。直到领导同志让去现场服务,才又想起这个事情。 到现场,检查,上电,运行,都没问题。其他功能都调试完毕,准备收拾完活了,突然想起那个阀值报警没有做,于是模拟做阀值报警,一做阀值报警,问题来了:根本出不来!监控程序,站点通讯正常,返回值正常,站点状态值相加之和正常,比较之后,不正常。是的不正常了。什么鬼? 难道是数据格式问题?将相加之和再转换成实数格式和阀值比较,还是不正常。什么鬼? 语句表行不通,那么换成梯形图吧。逐条更换,梯形图做数字运算然后在转换为实数这个过程的麻烦程度你懂得。做完之后再比较,没问题。是的,是没问题。那么问题来了,到底是哪里的问题?再返回去检查,突然发现一个不顺眼的地方,这个阀值是75,当时为方便起见,直接写75在比较程序里面了。用实数比较一个实数和75,结果能对么?赶紧将75改成实数形式。保存,编译,下载,运行,问题解决了。 哎,汗颜无比啊。怎么能将实数和整形默认这样的低级错误犯到实际应用中? 总结整个错误的过程,第一个错误是在使用语句表编程的过程中,数据格式报错不像梯形图编程那么严苛,所以忽视了。第二个错误是在模拟运行的过程中没有认真对待,没有从源头进行模拟,为了图一时的便利而造成了大的错误。 做控制不容易,在校的错误都会在现场被放大,在咱们看来是一个个的控制点,到了现场都是和安全息息相关的,所以,还是要从每个细节抓起,做程序的时候,多做思考,多加保护,多模拟且模拟要到位。希望以后不要再犯这种低级错误了。