start和driver是外部輸入輸出接口。
例:如果在TEMP接口中新建一個(gè)變量A,數(shù)據(jù)類型為BOOL,地址0.0
1,正確的FC程序如下:
| #start #A
|--| |---------()
|
| #A #driver
|--|/|---------()
2,錯(cuò)誤的例子:
| #A #driver
|--|/|---------()
|
| #start #A
|--| |---------()
分析:
程序的掃描是從上到下。S7 FC中的接口TMEP中的變量必須遵守:先賦值后使用的原則。
1程序,當(dāng)start的值從0變?yōu)?,A也將從0變?yōu)?。掃描到第一段程序時(shí),因?yàn)锳的值已經(jīng)發(fā)生改變,程序?qū)⒊晒呙璧紸的常閉觸點(diǎn)從1變?yōu)?,那么driver線圈將成功得從原來的1改變?yōu)?。
2程序,因?yàn)閽呙璧降谝欢纬绦虻臅r(shí)候CPU沒有發(fā)現(xiàn)A的值改變。之后A值將一直保持不變,即使start的值從0變?yōu)?,A值也不會(huì)發(fā)生改變;結(jié)果是程序沒有反應(yīng)。下面是大家的一些心得體會(huì) 西門子這一點(diǎn)比其他的PLC都靈活,F(xiàn)B的DB作為FB的變量的固定存放地址,而Temp則是有系統(tǒng)分配臨時(shí)區(qū)L地址。比如:存在FC1,F(xiàn)C2兩個(gè)功能,它們都有兩個(gè)Temp,那么當(dāng)調(diào)用FC1時(shí),系統(tǒng)分配L區(qū)域地址給FC1的Temp,如分配了LB0,LB1,那么當(dāng)FC1調(diào)用完成后,系統(tǒng)認(rèn)為L(zhǎng)B0,LB1已經(jīng)不需要,但是西門子的系統(tǒng)不會(huì)對(duì)臨時(shí)區(qū)進(jìn)行清零,只是繼續(xù)分配,當(dāng)調(diào)用FC2時(shí),系統(tǒng)將LB0,LB1重新分配給FC2的Temp,此時(shí)如果不遵循先賦值后使用的準(zhǔn)則,那么FC2的Temp使用的值將是FC1的Temp的值。
臨時(shí)變量可以用于所有塊中 (OB, FC, FB)。當(dāng)塊執(zhí)行的時(shí)候它們被用來臨時(shí)存儲(chǔ)數(shù)據(jù),當(dāng)退出該塊時(shí)這些數(shù)據(jù)將丟失。因此, 在PLC掃描運(yùn)行時(shí), FC塊中的臨時(shí)變量TEMP不能自鎖!
TEMP變量不能自鎖的原因顯而易見:
每個(gè)掃描周期開始時(shí),TEMP變量的值并不像Q或M那樣可以保持上個(gè)周期的值。除非明確對(duì)其賦值,否則它的值是不確定的。 我使用TEMP只有一個(gè)原則: 第一次出現(xiàn)某個(gè)TEMP變量,必須是對(duì)其賦值(或線圈刷新)的寫指令,而不能是讀指令。 如果出現(xiàn)問題,建議使用STAT變量替代。 對(duì)TEMP的認(rèn)識(shí)都有問題! 我的建議是做邏輯不用TEMP,只在做運(yùn)算是用TEMP,會(huì)省去很多麻煩
|