編程的時(shí)候除了注意指令的使用環(huán)境,還需要注意基本的運(yùn)行規(guī)則,否則就會(huì)產(chǎn)生不必要的小BUG,這些小BUG看似簡(jiǎn)單,但是真正解決起來(lái)卻不容易,因?yàn)檫@樣的錯(cuò)誤是根深蒂固地存在大腦的深處,看著錯(cuò)誤可能就是覺(jué)得是正確的,這樣就會(huì)懷疑其它的地方,造成方向性的錯(cuò)誤,比如是不是CPU的操作系統(tǒng)有BUG,或者是指令系統(tǒng)有BUG,即使老司機(jī)也可能犯低級(jí)的錯(cuò)誤。
在編寫(xiě)《從S7-300_400到S7-1500看變址尋址的改變》系列時(shí)做了一個(gè)小的示例程序,結(jié)果總是有問(wèn)題,分析也很燒腦。好了,先介紹一下程序的功能,這是一段表查詢的小程序:
例如創(chuàng)建一個(gè)數(shù)據(jù)塊A,然后在里面再創(chuàng)建一個(gè)數(shù)組B,INDEX從0~100,單位是INT,這樣一個(gè)表就創(chuàng)建完畢,然后使用一個(gè)已知的值與表中的值比較,如果查詢到第一個(gè)相同的值就記錄值的位置,就是數(shù)組中INDEX的值,然后清零INDEX的值并復(fù)位查詢使能位,如果沒(méi)有查詢到,INDEX值加1,如果整個(gè)表中都沒(méi)有相同的值,同樣清零INDEX并復(fù)位查詢使能位。程序參考圖1。
圖1
"Start_comp"作為查詢使能位,如果 "Comp_Value"與表(數(shù)組) "A".B["Index"]的值相同,將"Index"的值存儲(chǔ)到"Result"中,然后清零"Index"并復(fù)位查詢使能位 "Start_comp";如果 "Comp_Value"與表(數(shù)組) "A".B["Index"]的不相同,將"Index"的值加1,如果查詢到表的最后,還是沒(méi)有相同的值,同樣清零"Index"并復(fù)位查詢使能位 "Start_comp"。一段小程序,非常簡(jiǎn)單,好了,再看一下程序監(jiān)控吧,參考圖2。
圖2
查詢的結(jié)果是正確的,但是"Index"的值定格為1而不是0。對(duì)于這樣的結(jié)果,我首先想到的是時(shí)序的問(wèn)題,是不是S7-1500編程功能擴(kuò)展后程序有些變化?想起一個(gè)辦法就是在S7-300中編寫(xiě)相同的程序,然后切換到STL,使用斷點(diǎn)監(jiān)控一下,后來(lái)還是放棄了,因?yàn)镾7-300不支持?jǐn)?shù)組INDEX 的方式,如果使用S7-1500做也比較麻煩。可以把程序放到循環(huán)中斷中,放大掃描時(shí)間看一下結(jié)果,就是相當(dāng)于慢放功能,監(jiān)控程序,首先是值不相等條件滿足,如圖3所示。
圖3
從圖3中可以看到,值不相等,"Index"的值加1,然后與下一個(gè)值進(jìn)行比較,直到與比較值相同,如圖4所示。
圖4
從圖4中可以看到,比較值等于與不等于同時(shí)滿足,所以上面"Index"的值清零了,下面一行又加1了,所以"Index"的值最終定格在1上,只是什么邏輯!!! 搞不明白!!!
經(jīng)過(guò)一番折騰,發(fā)現(xiàn)問(wèn)題了,比較值相等的"Index"是2,比較值不相等的"Index"是0,說(shuō)明"Index"是清零了,所以會(huì)出現(xiàn)比較值等于與不等于同時(shí)滿足的情況,就是因?yàn)楸容^的值不同了,所以犯了一個(gè)小錯(cuò)誤,也是沒(méi)有仔細(xì)查看,也是由于設(shè)定的掃描時(shí)間還是比較短,最后使用圖片抓拍才發(fā)現(xiàn)。
總結(jié)一下這里的問(wèn)題,主要還是時(shí)序的問(wèn)題,相同程序段線圈的復(fù)位結(jié)果作用在下一個(gè)掃描周期,而賦值結(jié)果是在指令完成之后。可以把上下兩行程序互換一下位置就可以解決問(wèn)題了,程序參考圖5。
圖5
想要學(xué)習(xí)更多工業(yè)知識(shí),歡迎訪問(wèn)西門(mén)子1847工業(yè)學(xué)習(xí)平臺(tái),這是一個(gè)官方的學(xué)習(xí)平臺(tái),能夠幫助您高效獲得實(shí)用和權(quán)威的資料。
另外,這里還有60場(chǎng)西門(mén)子1847工業(yè)專家會(huì)議等您來(lái)參與!點(diǎn)擊下方鏈接查看會(huì)議詳情。