他在學(xué)習(xí)帶參數(shù)子程序的編寫,編寫了一個(gè)簡(jiǎn)單的帶參數(shù)的子程序,但是發(fā)現(xiàn)在調(diào)用時(shí),第一個(gè)子程序執(zhí)行后,第二個(gè)子程序也會(huì)有輸出,他不知道是為什么?程序很簡(jiǎn)單,是我們編程程序經(jīng)常會(huì)用到的一個(gè)起保停電路。程序運(yùn)行結(jié)果如下圖所示程序中,I0.0接通后,Q0.0輸出為1,Q0.1不應(yīng)該為1的卻也為1了。(左側(cè)為主程序,右側(cè)為子程序)。
下面是我個(gè)人之見解,若有分享不當(dāng)之處,望大家指正,謝謝!
為什么會(huì)出現(xiàn)這個(gè)情況呢?
這主要是對(duì)于子程序中變量的類型應(yīng)用不正確造成的這種錯(cuò)誤。子程序中有四種變量類型,分別為:
(1)輸入變量(IN):用于傳遞實(shí)際參數(shù)進(jìn)入子程序運(yùn)算
(2)輸入/輸出變量(IN/OUT):用于把實(shí)際參數(shù)的初始值傳遞到子程序中進(jìn)行運(yùn)算,運(yùn)算完后把結(jié)果放回到該實(shí)際參數(shù)中,因此這個(gè)變量的實(shí)際參數(shù)不能使用常數(shù)。
(3)輸出變量(OUT):該變量分配的實(shí)參用于存儲(chǔ)子程序中運(yùn)算完后的結(jié)果
(4) 臨時(shí)變量(TEMP):用于存儲(chǔ)子程序中運(yùn)算的中間結(jié)果。
在這四種變量中,對(duì)子程序輸出會(huì)有影響的主要是后面兩個(gè)變量,我們主要了解后面兩個(gè)變量的時(shí)候,就可以避免帶參數(shù)子程序在重復(fù)調(diào)用時(shí)會(huì)出現(xiàn)相互干擾的問題。
首先,我們看輸出變量(OUT)的使用,在上面這個(gè)朋友所發(fā)表的問題中,就是因?yàn)檩敵鲎兞康膯栴},所以才造成了這種情況的。
我們可以來分析這個(gè)程序,在這個(gè)程序中,“啟動(dòng)”、“停止”這兩個(gè)明顯建立的是輸入變量(IN)的變量類型,而“輸出”這個(gè)建立的是輸出變量(OUT)類型。我們要分析他為什么會(huì)出現(xiàn)干擾,得從PLC的掃描過程,及實(shí)操與形參的對(duì)應(yīng)如下圖所示,箭頭方向表示數(shù)據(jù)傳遞方向。
眾所周知PLC的掃描是從上往下周期型掃描的,所以PLC在執(zhí)行程序的時(shí)候,會(huì)先執(zhí)行網(wǎng)絡(luò)1,然后在執(zhí)行網(wǎng)絡(luò)2的程序,所以當(dāng)執(zhí)行網(wǎng)絡(luò)1的程序的時(shí)候,會(huì)把實(shí)參的狀態(tài)傳遞到子程序的形參中,所以對(duì)于網(wǎng)絡(luò)1的程序來講,形式參數(shù):“#啟動(dòng):L0.0”=I0.0,“#停止:L0.1”=I0.1 而實(shí)參Q0.0=“#輸出:L0.2”
所以在執(zhí)行這個(gè)子程序時(shí),當(dāng)I0.0=1,I0.1=0的時(shí)候,即按下啟動(dòng)按鈕I0.0時(shí),形參“#啟動(dòng):L0.0=1”, “#停止:L0.1=0”,執(zhí)行程序后 “#輸出:L0.2=1”因Q0.0= “#輸出:L0.2”,所以Q0.0=1.。
當(dāng)執(zhí)行網(wǎng)絡(luò)2時(shí),形式參數(shù):“#啟動(dòng):L0.0”=I0.2,“#停止:L0.1”=I0.3 而實(shí)參Q0.1=“#輸出:L0.2”所以在執(zhí)行網(wǎng)絡(luò)2的程序時(shí),當(dāng)I0.0=0,I0.1=1時(shí),則:“#啟動(dòng):L0.0=0”,“#停止:L0.1=0”因“#輸出:L0.2”在上一個(gè)網(wǎng)絡(luò)的運(yùn)行結(jié)果為1,所以當(dāng)“#啟動(dòng):L0.0”與“#輸出:L0.2”進(jìn)行邏輯或運(yùn)算后,得到的結(jié)果為1,然后與“#停止:L0.1”的非做邏輯與運(yùn)算,所以“#輸出:L0.2”還是保持為1的結(jié)果。所以輸出Q0.1=“#輸出:L0.2”=1.
通過這樣的分析,前面調(diào)用子程序的輸出狀態(tài)或在下個(gè)子程序調(diào)用中會(huì)用到,因此大家就可以理解為什么按下I0.0這個(gè)啟動(dòng)按鈕后,Q0.0 和Q0.1都會(huì)有輸出了。
若需要處理這個(gè)問題應(yīng)該如何處理呢?需要處理這個(gè)問題,很簡(jiǎn)單,我們只需要把這個(gè)輸出的變量改成輸入/輸出的變量就可以了,因?yàn)檩斎?輸出變量,相對(duì)于輸出變量來講,他是需要把初始值給到我們的子程序?qū)?yīng)的形參去運(yùn)算,運(yùn)算完后在給出,還是以剛才的方法去分析,就算前一個(gè)網(wǎng)絡(luò)中,他的輸出結(jié)果“#輸出:L0.2=1”執(zhí)行到下一個(gè)網(wǎng)絡(luò)后,因?yàn)楦某奢斎?輸出,會(huì)把Q0.1的初始狀態(tài)0,給到“#輸出:L0.2”,所以開始運(yùn)算時(shí)是以“#啟動(dòng):L0.0”與“#輸出:L0.2”進(jìn)行邏輯或運(yùn)算,因兩個(gè)狀態(tài)都為0,所以運(yùn)算結(jié)果為0,然后跟“#停止:L0.1的非”做邏輯與運(yùn)算,輸出結(jié)果“#輸出:L0.2=0”因此Q0.1=“#輸出:L0.2”=0.所以當(dāng)你把這個(gè)變量改成輸入/輸出變量的時(shí)候就不會(huì)產(chǎn)生干擾了。
我們?cè)賮砜戳硗獾囊粋€(gè)帶形式參數(shù)的子程序,程序如下圖所示:
(1)變量表:
(2)子程序
(3)主程序
大家可以分析下,這個(gè)程序,在運(yùn)行的過程中會(huì)不會(huì)出現(xiàn)干擾呢?
很明顯,你只需要掌握了前面我們所說的分析方法去分析,你會(huì)發(fā)現(xiàn)這個(gè)程序也是會(huì)相互干擾的。
這個(gè)程序其實(shí)跟我們前面所提到的是一樣的意思,如何去改,大家應(yīng)該也知道。
若程序改成這樣后,大家覺得是否還是會(huì)出現(xiàn)干擾呢?
(1)變量表
(2)子程序
(3)主程序
在程序中,我們把原來開始計(jì)算的那個(gè)條件給去掉了,換成了SM0.0作為條件,大家可以自己分析下,這個(gè)程序會(huì)不會(huì)出現(xiàn)相互干擾的情況。