【S7-300使用指南】22.先賦值后使用
唐琳
發(fā)布于2015-12-30 11:28
41
0
標(biāo)簽:程序編寫, 軟件,
1 TEMP區(qū)的問題
在《本地?cái)?shù)據(jù)TEMP》這篇文章中我們用一個(gè)簡(jiǎn)單的加法程序向大家演示了TEMP區(qū)的使用,但是我們?cè)谥鞒绦騉B1中只調(diào)用了1次,當(dāng)我們多次調(diào)用這個(gè)程序的時(shí)候大家就會(huì)發(fā)現(xiàn)一個(gè)問題,無論我們調(diào)用幾次,做幾次加法運(yùn)算都只能算出一個(gè)結(jié)果,如圖 1-1所示我們?cè)谥鞒绦蛑姓{(diào)用了三次FC1,雖然只是在次的調(diào)用中激活了加法運(yùn)算,但是可以發(fā)現(xiàn)程序段2和程序段3雖然并沒有進(jìn)行計(jì)算但是卻得出了和程序段1相同的結(jié)果。
圖 1-1
那么問題出在哪里呢,其實(shí)問題的關(guān)鍵就出在了本地?cái)?shù)據(jù)TEMP區(qū),讓我們一起來回顧一下FC1的程序吧。
接口
圖1-2
接口數(shù)據(jù)類型
表1
FC1
圖 1-3
在這個(gè)程序中我們可以看到,加法的運(yùn)算結(jié)果是先存放到本地?cái)?shù)據(jù)add3中然后再由add3傳送到輸出接口add3_3
圖1-4
這里我們可以看到本地?cái)?shù)據(jù)add3的起始地址是0.0由于是Int數(shù)據(jù)類型,因此add3占用的是FC1的本地?cái)?shù)據(jù)LW0這個(gè)存儲(chǔ)空間,由FC1程序可以看出只要add3被賦值,那么FC1就一定會(huì)將add3中的內(nèi)容進(jìn)行輸出,因此當(dāng)我們?cè)谥鞒绦騉B1中激活了段的加法,第二第三段在沒有激活的情況下就跟著將段的結(jié)果一起輸出了。
2 先賦值后使用 那么該如何避免這種情況的發(fā)生呢?這里我們就一定要用到先賦值后使用的方法,來避免這種情況的發(fā)生。那么怎么使用才算是先賦值后使用呢?其實(shí)非常簡(jiǎn)單,就是一定要保證建立好的本地?cái)?shù)據(jù)時(shí)時(shí)刻刻都被占用,這個(gè)方法讓我總結(jié)就是一個(gè)蘿卜一個(gè)坑,先來先占,后到的蘿卜PLC會(huì)自動(dòng)給他分配別的本地?cái)?shù)據(jù)區(qū)的位置,這樣就不會(huì)出現(xiàn)上面那種相互干擾的情況出現(xiàn)了。那么TEMP區(qū)的本地?cái)?shù)據(jù)怎么才算被時(shí)時(shí)刻刻都被占用呢?下面我們還是用這個(gè)加法的程序給大家舉例。我們要做的只是把圖 1-3中的常開觸點(diǎn)start和接口start一并刪除即可,刪除后如圖 2-1所示。
圖 2-1
那么為什么我們只需要將段加法指令前面的常開觸點(diǎn)刪除就可以達(dá)到先賦值后使用的效果呢?其實(shí)大家可以仔細(xì)想一想,當(dāng)加法指令前有常開觸點(diǎn)的時(shí)候,如果當(dāng)這個(gè)常開觸點(diǎn)是斷開的時(shí)候我們這個(gè)加法指令是不進(jìn)行計(jì)算的,當(dāng)不進(jìn)行計(jì)算的時(shí)候本地?cái)?shù)據(jù)add3就不處于被占用的狀態(tài),達(dá)不到時(shí)時(shí)刻刻都被占用的效果,而當(dāng)我們把這個(gè)常開觸點(diǎn)刪除后add3就不存在不被占用的情況了,換句話說就是現(xiàn)在add3已經(jīng)達(dá)到了被時(shí)時(shí)刻刻占用的效果了,這就是先賦值后使用,由圖 2-2可見使用了先賦值后使用以后就不會(huì)再出現(xiàn)輸出結(jié)果相互干擾的情況了。
圖 2-2