在ob1中兩次調(diào)用上一個日志中的子程序sbr_0,在運行程序時發(fā)現(xiàn),接通i0.0外接的小開關(guān),q0.0和q0.1同時變?yōu)閛n。這是因為分配給sbr_0的輸出參數(shù)“電動機”的地址為l0.2,第一次調(diào)用sbr_0之后,l0.2的值為on。第二次調(diào)用sbr_0時,雖然起動按鈕i0.2為off,但是因為兩次調(diào)用sbr_0時局部變量區(qū)是公用的,此時輸出參數(shù)“電動機”(l0.2)仍然為on,所以第二次調(diào)用sbr_0之后,由于執(zhí)行圖4-40中的程序,輸出參數(shù)“電動機”使q0.1為on。子程序的局部變量一定要遵循“先賦值后使用”的原則。
s7-200的子程序使用臨時變量來傳遞參數(shù),out類型的參數(shù)不會把實參讀入形參,所以這里使用out形參的觸點就出現(xiàn)了臨時變量未賦值先使用的情況。將輸出參數(shù)“電動機”的變量類型改為in_out就可以解決上述問題。這是因為兩次調(diào)用子程序,參數(shù)“電動機”返回的運算結(jié)果分別用q0.0和q0.1保存,在第二次調(diào)用子程序sbr_0,執(zhí)行“o #電動機”指令時,因為“電動機”是in_out參數(shù),使用的是前一個掃描周期保存到q0.1的值,與本掃描周期第一次調(diào)用子程序后參數(shù)“電動機”的值無關(guān)。
簡單地說,對于有記憶功能的電路,需要用存儲單元來保存要記憶的變量值。s7-300的fb可以用靜態(tài)變量來保存,而s7-200的子程序沒有靜態(tài)變量,只有用in_out變量的實參(本例中的q0.1)來保存變量值。