西門子s7-200plc兩個子程序的局部變量和程序完全相同(見下面的右圖),運(yùn)行時發(fā)現(xiàn)i0.0為1時q0.0和q1.0同時變?yōu)?。將置位指令改為對l0.1的賦值(線圈)指令后運(yùn)行正常,將out參數(shù)“輸出”改為in_out參數(shù)運(yùn)行也正常。為什么?
1.出錯的原因
s線圈(置位指令)斷開時,l0.1的值保持不變。
從子程序的局部變量表可以看出,輸入?yún)?shù)in和輸出參數(shù)out均用l區(qū)的局部變量保存。這兩個子程序?qū)儆谕患墸鼈兊木植孔兞渴褂猛黄锢泶鎯^(qū)。換句話說,兩個子程序的l0.1先后使用同一個物理存儲器位。
ob1中的i0.0為1時, 子程序sbr_0中的l0.1和它的實(shí)參q0.0被置位。在執(zhí)行sbr_1時,因?yàn)閮蓚€子程序的l0.1先后使用同一個物理存儲器位,sbr_1的l0.1仍然為1,使它的實(shí)參q1.0也變?yōu)?。q1.0變?yōu)?不是因?yàn)槌绦虻淖饔茫莾蓚€子程序的l0.1共用同一個物理存儲器位引起的。
2.將out參數(shù)改為in_out參數(shù)未出錯的原因
在q1.0為0,i0.0為1時,l0.1因?yàn)槭莍n_out參數(shù),剛開始執(zhí)行sbr_1時,l0.1的輸入值為0,與sbr_0執(zhí)行后l0.1的值無關(guān)。因?yàn)閕1.0為0,sbr_1執(zhí)行完后,l0.1的值不變,仍然為0。所以q1.0的值為0,不會變?yōu)?。
3.置位指令改為賦值指令(線圈)未出錯的原因
假設(shè)i0.0為1時,i1.0為0,執(zhí)行sbr_1的程序時,l0.0的觸點(diǎn)斷開,使l0.1的線圈斷電,所以q1.0為0。
4.同樣的程序?yàn)槭裁磗7-300不會出錯
s7-300的功能(fc)和s7-200的子程序差不多,s7-300的fc1和fc2中同樣的置位程序運(yùn)行時不會出錯。這是因?yàn)閟7-300和s7-200保存in、out參數(shù)的方法不一樣。s7-300同一級的fc的臨時局部變量(temp)使用同一片物理存儲區(qū),它們的in、out參數(shù)沒有標(biāo)出l區(qū)的地址,與臨時變量的保存方法不同。因此同樣的程序s7-300不會出錯。