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