西門子S7-300/400PLC的上升沿與下降沿檢測指令
plc的上升沿、下降沿檢測指令的功能需要至少兩個掃描循環(huán)周期才能完成,即通過比較前后兩個掃描周期同一個BOOL變量或RLO(邏輯運(yùn)算結(jié)果)的狀態(tài)來判斷是否是上升沿、下降沿。
同一級的邏輯塊的臨時(TEMP)局部數(shù)據(jù)區(qū)是公用的,結(jié)束對FB、FC的調(diào)用后,它們的臨時變量的值可能被別的邏輯塊的臨時變量覆蓋掉。網(wǎng)友youhm的測試驗證了這一結(jié)論。他說:“如果僅僅調(diào)用一個FC,代碼放在FC里測試實現(xiàn)了存儲的功能,當(dāng)調(diào)用多個FC,并且FC里都使用了臨時變量,我在另外一個FC變量里把所有的臨時變量都復(fù)位為0,這時在第一個FC里調(diào)用的這段代碼就不能實現(xiàn)這個功能了,另外也測試了,在OB35里同時使用臨時變量也是一樣的效果”。
因此,用塊的臨時變量作上升沿、下降沿檢測指令的邊沿存儲位來保存變量的狀態(tài)是極其危險的,稍有不慎,可能會出現(xiàn)災(zāi)難性的后果。
建議:“**還是不要用(臨時變量作邊沿存儲器位),我以前使用過,造成的后果很嚴(yán)重。后來就學(xué)乖啦!”
邊沿存儲位雖然允許使用L區(qū)(局部數(shù)據(jù)區(qū)),但是請注意,F(xiàn)B的L區(qū)包括靜態(tài)變量和臨時變量等,允許用L區(qū)并不說明用臨時變量作邊沿存儲位是合理的。
編程的*高境界是在FB、FC中全部使用局部變量,不使用像M這樣的全局變量。這樣的塊不需作任何修改,就可以移植到其他項目。為此可以使用功能塊的靜態(tài)變量來作上升沿、下降沿檢測指令的邊沿存儲位。這樣不會出現(xiàn)使用臨時變量帶來的問題,也解決了塊的可移植性問題。
有個德國人作的符合IEC 61131-3標(biāo)準(zhǔn)的編程軟件干脆就把邊沿檢測指令做成功能塊(也可能是IEC61131-3規(guī)定的指令),把使用臨時變量作邊沿存儲位的路徹底堵死了。