資源描述:
《STEP7中FC的應(yīng)用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、FC參數(shù)處理過(guò)程解析:實(shí)例:新建一個(gè)FC塊,編寫一個(gè)簡(jiǎn)單的按鈕啟停程序,如下圖所示:2個(gè)bool型輸入變量IN1,IN2;一個(gè)bool型輸出變量OUT1;以及完成簡(jiǎn)單的按鈕啟停程序如下:1.在OB1中調(diào)用FC1,實(shí)參輸入為M區(qū)變量,觀察結(jié)果如下:如圖:M250.0有輸入時(shí),M250.2輸出為1;M250.3沒有輸入,M250.4輸出為0,結(jié)果符合程序預(yù)期,運(yùn)行正確;1.在OB1中再次調(diào)用FC1,賦給實(shí)參為DB區(qū)的變量,如下圖所示:注意,如上圖:但把DB3.DBX0.0置1時(shí),DB3.DBX0.2有輸出;但同時(shí)發(fā)現(xiàn),Network2中,DB3.DBX0
2、.4也輸出了1,這是為什么呢,本來(lái)不應(yīng)該有輸出的?。繂?wèn)題提出:為什么同樣的FC,當(dāng)參數(shù)為M區(qū)變量和DB區(qū)變量時(shí),執(zhí)行的結(jié)果會(huì)不同呢,F(xiàn)C對(duì)于參數(shù)的調(diào)用機(jī)制是怎么樣的?問(wèn)題解答:在STEP7V5.4編程手冊(cè)中,我們可以找到這樣的描述:在編程調(diào)用塊時(shí),請(qǐng)確保寫入聲明為OUTPUT的參數(shù)。否則,輸出值為隨機(jī)值!對(duì)于功能塊,該值為最后一個(gè)調(diào)用指定的實(shí)例DB中的數(shù)值;對(duì)于功能,該值為位于L堆棧的數(shù)值。注意以下幾點(diǎn):l調(diào)用FC時(shí),初始化所有OUTPUT參數(shù);l盡量不要使用任何置位和復(fù)位指令,這些指令取決于RLO,當(dāng)RLO的值為0時(shí),將保持隨機(jī)值;l如果在塊內(nèi)跳轉(zhuǎn)
3、,那么確保沒有跳過(guò)寫入OUTPUT參數(shù)的位置。結(jié)論:FC調(diào)用輸出實(shí)參為數(shù)據(jù)塊時(shí)的處理,與輸出實(shí)參為M、I、Q、PQ不同。在輸出實(shí)參為M、I、Q、PQ時(shí),F(xiàn)C輸出形參(指針)指向?qū)崊?shí)際存儲(chǔ)地址,如果在FC中,沒有對(duì)輸出形參形成實(shí)質(zhì)性操作,則形參指針?biāo)赶虻膶?shí)際存儲(chǔ)區(qū)內(nèi)容不會(huì)改變,對(duì)于參數(shù)傳遞過(guò)程而言,僅僅是調(diào)用時(shí)形參指向?qū)崊?,調(diào)用結(jié)束時(shí)形參指針區(qū)域釋放的一個(gè)過(guò)程。在輸出實(shí)參為DB塊時(shí),F(xiàn)C開始調(diào)用時(shí),先在V區(qū)為該形參分配一個(gè)存儲(chǔ)區(qū)(可能是位,也可能是字節(jié)或其它,根據(jù)形參參數(shù)類型而定),每一次調(diào)用FC,根據(jù)調(diào)用FC時(shí)所傳遞的實(shí)參類型不同,為輸出形參分配
4、的V區(qū)區(qū)域可能不同,比如一個(gè)FC有一個(gè)位輸入形參,一個(gè)位輸出形參,在第一次調(diào)用時(shí),實(shí)參分別是I0.0,DB0.DBX0.0,則為輸出形參分配的V區(qū)為V20.1;第二次調(diào)用FC,實(shí)參分別為DB0.DBX0.1,DB0.DBX0.2,則為輸出形參分配的V區(qū)為V20.2,原來(lái)的V20.1被輸入形參所對(duì)應(yīng)的實(shí)參DB0.DBX0.1內(nèi)容所填充。如果第二次調(diào)用FC時(shí),實(shí)參為M0.1,DB0.DBX0.2,則為輸出形參分配的V區(qū)仍為V20.1。其后,F(xiàn)C在實(shí)際運(yùn)行時(shí),針對(duì)輸出形參(數(shù)據(jù)塊)的處理其實(shí)都是在對(duì)該V區(qū)進(jìn)行處理,在FC結(jié)束調(diào)用后,不管在FC中有沒有對(duì)該V
5、區(qū)進(jìn)行實(shí)質(zhì)性處理,該V區(qū)的內(nèi)容均會(huì)被拷貝至另一個(gè)存儲(chǔ)區(qū),比如L區(qū),該L區(qū)與實(shí)參區(qū)對(duì)應(yīng),但不在同一區(qū),此時(shí)并一直等到本次OB循環(huán)結(jié)束,該L區(qū)內(nèi)容都不會(huì)被拷貝至實(shí)參區(qū),所以這個(gè)時(shí)候?qū)崊^(qū)的內(nèi)容還不會(huì)有變化。等到下一個(gè)OB循環(huán)開始之前,該L區(qū)內(nèi)容就會(huì)被拷貝至實(shí)參區(qū)。根據(jù)以上內(nèi)容,結(jié)合本例分析:1:第一次調(diào)用FC1時(shí),在V區(qū)為形參分配一個(gè)存儲(chǔ)區(qū),本例中實(shí)參為DB3.DBX0.0,DB3.DBX0.1,輸出實(shí)參為DB3.DBX0.2,則為形參分配的V區(qū)為V20.1,V20.2,V20.3;程序執(zhí)行完畢后,V20.3值為1,并輸出給DB3.DBX0.2;2:第二
6、次調(diào)用FC1時(shí),同樣為形參分配的V區(qū)為V20.1,V20.2,V20.3,但程序并未對(duì)OUT1變量進(jìn)行初始化操作,此時(shí)V20.3的值仍然為1,即OUT1保持為第一次調(diào)用后的V20.3的值,所以第二次調(diào)用FC1時(shí),輸出DB3.DBX0.4也變?yōu)榱?!解決辦法:1.在FC1中對(duì)OUT1進(jìn)行初始化操作,如下圖所示:2.把OUT1變量改為IN/OUT類型。3.以上2點(diǎn)適用于所有FC調(diào)用,切記。