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