西門子S7-200PLC兩個子程序的局部變量和程序完全相同(見下面的右圖),運行時發現I0.0為1時Q0.0和Q1.0同時變為1。將置位指令改為對L0.1的賦值(線圈)指令后運行正常,將OUT參數“輸出”改為IN_OUT參數運行也正常。為什么?
1.出錯的原因
S線圈(置位指令)斷開時,L0.1的值保持不變。
從子程序的局部變量表可以看出,輸入參數IN和輸出參數OUT均用L區的局部變量保存。這兩個子程序屬于同一級,它們的局部變量使用同一片物理存儲區。換句話說,兩個子程序的L0.1先后使用同一個物理存儲器位。
OB1中的I0.0為1時, 子程序SBR_0中的L0.1和它的實參Q0.0被置位。在執行SBR_1時,因為兩個子程序的L0.1先后使用同一個物理存儲器位,SBR_1的L0.1仍然為1,使它的實參Q1.0也變為1。Q1.0變為1不是因為程序的作用,而是兩個子程序的L0.1共用同一個物理存儲器位引起的。
2.將OUT參數改為IN_OUT參數未出錯的原因
在Q1.0為0,I0.0為1時,L0.1因為是IN_OUT參數,剛開始執行SBR_1時,L0.1的輸入值為0,與SBR_0執行后L0.1的值無關。因為I1.0為0,SBR_1執行完后,L0.1的值不變,仍然為0。所以Q1.0的值為0,不會變為1。
3.置位指令改為賦值指令(線圈)未出錯的原因
假設I0.0為1時,I1.0為0,執行SBR_1的程序時,L0.0的觸點斷開,使L0.1的線圈斷電,所以Q1.0為0。
4.同樣的程序為什么S7-300不會出錯
S7-300的功能(FC)和S7-200的子程序差不多,S7-300的FC1和FC2中同樣的置位程序運行時不會出錯。這是因為S7-300和S7-200保存IN、OUT參數的方法不一樣。S7-300同一級的FC的臨時局部變量(TEMP)使用同一片物理存儲區,它們的IN、OUT參數沒有標出L區的地址,與臨時變量的保存方法不同。因此同樣的程序S7-300不會出錯。
1.出錯的原因
S線圈(置位指令)斷開時,L0.1的值保持不變。
從子程序的局部變量表可以看出,輸入參數IN和輸出參數OUT均用L區的局部變量保存。這兩個子程序屬于同一級,它們的局部變量使用同一片物理存儲區。換句話說,兩個子程序的L0.1先后使用同一個物理存儲器位。
OB1中的I0.0為1時, 子程序SBR_0中的L0.1和它的實參Q0.0被置位。在執行SBR_1時,因為兩個子程序的L0.1先后使用同一個物理存儲器位,SBR_1的L0.1仍然為1,使它的實參Q1.0也變為1。Q1.0變為1不是因為程序的作用,而是兩個子程序的L0.1共用同一個物理存儲器位引起的。
2.將OUT參數改為IN_OUT參數未出錯的原因
在Q1.0為0,I0.0為1時,L0.1因為是IN_OUT參數,剛開始執行SBR_1時,L0.1的輸入值為0,與SBR_0執行后L0.1的值無關。因為I1.0為0,SBR_1執行完后,L0.1的值不變,仍然為0。所以Q1.0的值為0,不會變為1。
3.置位指令改為賦值指令(線圈)未出錯的原因
假設I0.0為1時,I1.0為0,執行SBR_1的程序時,L0.0的觸點斷開,使L0.1的線圈斷電,所以Q1.0為0。
4.同樣的程序為什么S7-300不會出錯
S7-300的功能(FC)和S7-200的子程序差不多,S7-300的FC1和FC2中同樣的置位程序運行時不會出錯。這是因為S7-300和S7-200保存IN、OUT參數的方法不一樣。S7-300同一級的FC的臨時局部變量(TEMP)使用同一片物理存儲區,它們的IN、OUT參數沒有標出L區的地址,與臨時變量的保存方法不同。因此同樣的程序S7-300不會出錯。
























粵公網安備 44030402000745號