這是個(gè)值得臉紅的事情,但是教訓(xùn)是深刻的。
做一個(gè)系統(tǒng),通過modbus通訊5個(gè)站點(diǎn)的狀態(tài),每個(gè)站點(diǎn)的狀態(tài)值相加之和小于75需要進(jìn)行報(bào)警,很簡單的程序啊。
選型,硬件配置,軟件編寫。因?yàn)殚y值是一個(gè)實(shí)數(shù),為了讓程序好看點(diǎn),盡量少占用內(nèi)部寄存器,就用語句表編程了。第一個(gè)地雷已經(jīng)埋好,已經(jīng)埋好,已經(jīng)埋好,重要的事情說三遍。程序編好,總要模擬器運(yùn)行下,通訊一般不會出問題,那就直接模擬比較這個(gè)階段的程序了。第二個(gè)地雷已經(jīng)埋好,已經(jīng)埋好,已經(jīng)埋好,重要的事情說三遍。運(yùn)行沒問題。好了,完活。
其他沒就再管。等待現(xiàn)場調(diào)試,等待了五六個(gè)月,都快把這個(gè)項(xiàng)目給忘了。直到領(lǐng)導(dǎo)同志讓去現(xiàn)場服務(wù),才又想起這個(gè)事情。
到現(xiàn)場,檢查,上電,運(yùn)行,都沒問題。其他功能都調(diào)試完畢,準(zhǔn)備收拾完活了,突然想起那個(gè)閥值報(bào)警沒有做,于是模擬做閥值報(bào)警,一做閥值報(bào)警,問題來了:根本出不來!監(jiān)控程序,站點(diǎn)通訊正常,返回值正常,站點(diǎn)狀態(tài)值相加之和正常,比較之后,不正常。是的不正常了。什么鬼?
難道是數(shù)據(jù)格式問題?將相加之和再轉(zhuǎn)換成實(shí)數(shù)格式和閥值比較,還是不正常。什么鬼?
語句表行不通,那么換成梯形圖吧。逐條更換,梯形圖做數(shù)字運(yùn)算然后在轉(zhuǎn)換為實(shí)數(shù)這個(gè)過程的麻煩程度你懂得。做完之后再比較,沒問題。是的,是沒問題。那么問題來了,到底是哪里的問題?再返回去檢查,突然發(fā)現(xiàn)一個(gè)不順眼的地方,這個(gè)閥值是75,當(dāng)時(shí)為方便起見,直接寫75在比較程序里面了。用實(shí)數(shù)比較一個(gè)實(shí)數(shù)和75,結(jié)果能對么?趕緊將75改成實(shí)數(shù)形式。保存,編譯,下載,運(yùn)行,問題解決了。
哎,汗顏無比啊。怎么能將實(shí)數(shù)和整形默認(rèn)這樣的低級錯誤犯到實(shí)際應(yīng)用中?
總結(jié)整個(gè)錯誤的過程,第一個(gè)錯誤是在使用語句表編程的過程中,數(shù)據(jù)格式報(bào)錯不像梯形圖編程那么嚴(yán)苛,所以忽視了。第二個(gè)錯誤是在模擬運(yùn)行的過程中沒有認(rèn)真對待,沒有從源頭進(jìn)行模擬,為了圖一時(shí)的便利而造成了大的錯誤。
做控制不容易,在校的錯誤都會在現(xiàn)場被放大,在咱們看來是一個(gè)個(gè)的控制點(diǎn),到了現(xiàn)場都是和安全息息相關(guān)的,所以,還是要從每個(gè)細(xì)節(jié)抓起,做程序的時(shí)候,多做思考,多加保護(hù),多模擬且模擬要到位。希望以后不要再犯這種低級錯誤了。