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