s7-300/400plc程序采用結(jié)構(gòu)化程序,把程序分成多個(gè)模塊,各模塊完成相應(yīng)的功能。結(jié)合起來(lái)就能實(shí)現(xiàn)一個(gè)復(fù)雜的控制系統(tǒng)。就像高級(jí)語(yǔ)言一樣,用子程序?qū)崿F(xiàn)特定的功能,再通過(guò)主程序調(diào)用各子程序,從而能實(shí)現(xiàn)復(fù)雜的程序。
在s7-300/400plc中寫(xiě)在ob1模塊里和程序就是主程序,子程序?qū)懺诠δ?fc),功能塊(fb)。
fc運(yùn)行是產(chǎn)生臨時(shí)變量執(zhí)行結(jié)束后數(shù)據(jù)就丟失-----不具有儲(chǔ)存功能
fb運(yùn)行時(shí)需要調(diào)用各種參數(shù),于是就產(chǎn)生了背景數(shù)據(jù)塊db。例如用fb41來(lái)作pid控制,則它的pid控制參數(shù)就要存在db里面。fb具有儲(chǔ)存功能
系統(tǒng)功能塊(sfb)和系統(tǒng)功能(sfc)也是相當(dāng)于子程序,只不過(guò)sfb和sfc是集成在s7 cpu中的功能塊,用戶能直接調(diào)用不需自已寫(xiě)程序。
sfc與fc不具有儲(chǔ)存功能,fb和sfb具有儲(chǔ)存功能。
ob模塊相當(dāng)于子程序,負(fù)責(zé)調(diào)用其他模塊。如果程序簡(jiǎn)單只需要ob就可以實(shí)現(xiàn)。
用西門(mén)子plc編程時(shí),可以用到功能塊fb和功能fc(fb、fc都是組織塊)資料上說(shuō)fb與fc都可以作為用戶編寫(xiě)的子程序,但是我不明白這兩個(gè)組織塊之間到底有什么區(qū)別阿?在應(yīng)用上到底有什么不同之處嗎?
fb--功能塊,帶背景數(shù)據(jù)塊
fc--功能,相當(dāng)于函數(shù)
他們之間的主要區(qū)別是:fc使用的是共享數(shù)據(jù)塊,fb使用的是背景數(shù)據(jù)塊
舉個(gè)例子,如果您要對(duì)3個(gè)參數(shù)相同的電機(jī)進(jìn)行控制,那么只需要使用fb編程外加3個(gè)背景數(shù)據(jù)塊就可以了,但是,如果您使用fc,那么您需要不斷的修改共享數(shù)據(jù)塊,否則會(huì)導(dǎo)致數(shù)據(jù)丟失。fb確保了3個(gè)電機(jī)的參數(shù)互不干擾。
fb,fc本質(zhì)都是一樣的,都相當(dāng)于子程序,可以被其他程序調(diào)用(也可以調(diào)用其他子程序)。他們的最大區(qū)別是,fb與db配合使用,db中保存著fb使用的數(shù)據(jù),即使fb退出后也會(huì)一直保留。fc就沒(méi)有一個(gè)永久的數(shù)據(jù)塊來(lái)存放數(shù)據(jù),只在運(yùn)行期間會(huì)被分配一個(gè)臨時(shí)的數(shù)據(jù)區(qū)。
在實(shí)際編程中,是使用fb還是fc,要看實(shí)際的需要決定。
fb與fc沒(méi)有太大的差別,fb帶有背景數(shù)據(jù)塊,而fc沒(méi)有。所以fb帶上不同的數(shù)據(jù)塊,就可以帶上不同的參數(shù)值。這樣就可以用同一fb和不同的背景數(shù)據(jù)塊,被多個(gè)對(duì)象調(diào)用。
fc和fb像c中的函數(shù),只不過(guò)fb可以生成靜態(tài)變量,在下次函數(shù)調(diào)用時(shí)數(shù)據(jù)可以保留,而fc的變量只在調(diào)用期內(nèi)有效,下次調(diào)用又重新更換。
這是一般的理解;fb需要背景數(shù)據(jù)塊,而fc是沒(méi)有的;參數(shù)的傳遞方式不同,fb的輸入輸出對(duì)應(yīng)著背景數(shù)據(jù)塊地址,而fc的輸入輸出是沒(méi)有實(shí)際地址對(duì)應(yīng)的,只有的程序調(diào)用時(shí),才會(huì)和實(shí)際的地址產(chǎn)生對(duì)應(yīng)關(guān)系。fb參數(shù)傳遞的是數(shù)據(jù),fc參數(shù)傳遞的是數(shù)據(jù)的地址。
fb(功能塊)的處理方式是圍繞著數(shù)據(jù)塊處理數(shù)據(jù),他的入口參數(shù)和出口參數(shù)都是數(shù)據(jù)塊里的數(shù)據(jù),以及stat的數(shù)據(jù)都是數(shù)據(jù)塊里,入口參數(shù)和出口參數(shù)、stat可以認(rèn)為是靜態(tài)數(shù)據(jù),這些數(shù)據(jù)不會(huì)因?yàn)楹瘮?shù)消失而逝去,他會(huì)一直保存在數(shù)據(jù)塊里。fb里的變量與他的背景數(shù)據(jù)塊是一一對(duì)應(yīng)的,而他的對(duì)應(yīng)并不是一層不變的。更確切的說(shuō),fb里的變量在調(diào)用時(shí)將根據(jù)ar2的值當(dāng)作偏移量與背景數(shù)據(jù)塊是一一對(duì)應(yīng)。如果一個(gè)fb功能塊里沒(méi)有入口參數(shù)、出口參數(shù)及stat數(shù)據(jù),他將不需要背景數(shù)據(jù)塊,這時(shí)的fb和沒(méi)有入口出口參數(shù)的fc就沒(méi)有什么區(qū)別了,就只能使用臨時(shí)變量和全局變量了。用很多人認(rèn)為,fb的背景數(shù)據(jù)塊必須由fb生成、fb里的第一個(gè)變量對(duì)應(yīng)著背景數(shù)據(jù)塊的第一個(gè)變量,還有就是由fb生成的數(shù)據(jù)塊只能作為fb的背景數(shù)據(jù)塊使用。其實(shí)這些理解是錯(cuò)誤的,fb的背景數(shù)據(jù)塊不一定是通過(guò)fb生成的,可以像生成共享數(shù)據(jù)塊一樣生成fb的背景數(shù)據(jù)塊,換句話說(shuō),普通的數(shù)據(jù)塊也可以作為fb的背景數(shù)據(jù)塊,不過(guò)這種做法是有一定前提的,就是這個(gè)數(shù)據(jù)塊的字節(jié)數(shù)必須大于等于fb所需的字節(jié)數(shù),如果小于fb所需的字節(jié)數(shù)時(shí),fb訪問(wèn)到超出背景數(shù)據(jù)塊的變量時(shí)就會(huì)找不到變量的地址,肯定會(huì)出錯(cuò)了。fb里的第一個(gè)變量對(duì)應(yīng)可以對(duì)應(yīng)數(shù)據(jù)塊字節(jié)數(shù)減去fb所需背景數(shù)據(jù)塊字節(jié)數(shù)里的任意位置的變量,我覺(jué)得這個(gè)比較好理解,在多重背景里不就是這樣嗎。