西門子S7-1200PLC模塊遼寧代理商

每個(gè)塊包含一個(gè)代碼時(shí)間標(biāo)記和一個(gè)接口時(shí)間標(biāo)記,可以在塊的屬性對話框中查看它們。下列情況將會產(chǎn)生時(shí)間標(biāo)記沖突:
1)被調(diào)用的塊比調(diào)用它的塊的時(shí)間標(biāo)記更新。
2)用戶定義數(shù)據(jù)類型( UDT)比使用它的塊或使用它的用戶數(shù)據(jù)的時(shí)間標(biāo)記更新。
3)功能塊比它的背景數(shù)據(jù)塊的時(shí)間標(biāo)記更新。
4) FB2在FB1中被定義為多重背景,FB2的時(shí)間標(biāo)記比FB1的更新。
即使塊與塊之間的時(shí)間標(biāo)記的關(guān)系是正確的,如果塊的接口的定義與它被使用的區(qū)域中的定義不匹配(有接口沖突),也會出現(xiàn)不*性。
以隨書光盤中的例程“發(fā)動機(jī)控制”為例,如果在FB1的變量聲明表中修改或增減輸入/輸出參數(shù),在保存塊時(shí),將會出現(xiàn)“塊接口已改變……”的警告信息。保存后打開調(diào)用它的OB1,出現(xiàn)“至少一個(gè)塊調(diào)用有時(shí)間標(biāo)志沖突”的對話框。在OB1中可以看到,調(diào)用FB1的指令變成紅色。帶有時(shí)間標(biāo)記沖突的程序下載到CPU后將導(dǎo)致停機(jī)。如果用手工來消除塊的不*性,是很麻煩的。可以用下面的方法自動修正*性錯(cuò)誤:
1)關(guān)閉與沖突有關(guān)的所有的塊。
2)選中SIMATIC管理器左邊窗口的“塊”,執(zhí)行菜單命令“編輯”→“檢查塊的*性”。在出現(xiàn)的“檢查塊的*性”對話框中(見圖4-33),有時(shí)間標(biāo)記沖突的塊用紅色的指示燈標(biāo)出。執(zhí)行菜單命令“程序”→“編譯”,STEP 7將打開相應(yīng)的編輯器,時(shí)間標(biāo)記沖突和塊的不*性被自動地盡可能地消除,同時(shí)對塊進(jìn)行編譯。經(jīng)過編譯后,圖4-33中的時(shí)間沖突被消除,對應(yīng)的紅色指示燈消失(見圖4-34)。
3)如果上述編譯操作不能自動清除所有塊的不*性,在輸出窗口中給出有錯(cuò)誤的塊的信息。用鼠標(biāo)右鍵點(diǎn)擊某一錯(cuò)誤,調(diào)用彈出的菜單中的錯(cuò)誤顯示,對應(yīng)的錯(cuò)誤被打開,程序?qū)⑻奖恍薷牡奈恢谩G宄龎K中的不*性后,保存并關(guān)閉塊。對于所有標(biāo)記為有錯(cuò)誤的塊,重復(fù)這一過程。
4)重新執(zhí)行步驟1和2,直至信息窗口不再顯示錯(cuò)誤信息。
如果不能用上述的操作自動清除所有塊的不*性,只有刪除被調(diào)用的有沖突的塊,然后重新調(diào)用它們。
1.參數(shù)類型ANY
在調(diào)用邏輯塊時(shí),參數(shù)類型ANY用于將任意的數(shù)據(jù)類型傳遞給聲明的形參。ANY可用于實(shí)參的數(shù)據(jù)類型未知,或?qū)崊⒖梢允褂萌我鈹?shù)據(jù)類型的情況。數(shù)據(jù)類型ANY主要用于為系統(tǒng)功能( SFC)和系統(tǒng)功能塊(SFB)分配參數(shù)。用戶也可以用ANY作為邏輯塊的接口參數(shù)來傳遞數(shù)據(jù)。
ANY由10B組成(見圖4-31),第4~9個(gè)字節(jié)的意義與POINTER的第0~5個(gè)字節(jié)相同,第1個(gè)字節(jié)(數(shù)據(jù)類型編碼)見表4-6。
ANY指針可以用來表示一片連續(xù)的數(shù)據(jù)區(qū),例如P#DB2. DBX50.0 BYTE 10表示DB2中的DBB50~ DBB59這10個(gè)字節(jié)。在這個(gè)例子中,DB編號為2,重復(fù)因子(數(shù)據(jù)長度)為10,數(shù)據(jù)類型編碼為B#16#02 (BYTE)。
圖4-31 ANY指針
ANY指針也可以用地址作實(shí)參,例如DB2.DBW30和Q12.5,但是只能指向一個(gè)地址。ANY指針只能用于形參的IN、OUT(不能用于FB)、IN_OUT和TEMP變量。
表4-6 數(shù)據(jù)類型的編碼
2.FC2的程序設(shè)計(jì)
【例】 用ANY指針作為輸入?yún)?shù),用FC2對若干個(gè)連續(xù)存放的字作異或運(yùn)算。不是字則不進(jìn)行運(yùn)算。
在項(xiàng)目“寄存器間接尋址”中生成FC2,其局部變量如表4-7所示。下面是FC2中的STL程序:
表4-7 FC2的局部變量
L P##AnyPomt //P#表示指針,第2個(gè)#號表示局部變量
LAR1 //ANY指針?biāo)偷刂芳拇嫫?/span>AR1
L 0
T #Result //將保存異或運(yùn)算結(jié)果的字清零
L B[ AR1,P#1.0] //取ANY指針內(nèi)的數(shù)據(jù)類型(見圖4-31)
L B#16#4
< >I
JC 003 //不是字則返回
L 0
L W[AR1,P#4.0] //取ANY指針內(nèi)的數(shù)據(jù)塊編號(見圖4-31)
==I
JC 001 //不是數(shù)據(jù)塊(編號為0)則跳轉(zhuǎn)
T #DB No //保存數(shù)據(jù)塊編號
OPN DB[#DB_No] //打開ANY指針的數(shù)據(jù)塊
_001:1 W[AR1,P#2.0] //取ANY指針內(nèi)的重復(fù)因子(見圖4-31)
T #Lenth //保存需要累加的字的個(gè)數(shù)
L D[AR1,P#6.0] //取ANY指針內(nèi)數(shù)據(jù)區(qū)的起始地址(見圖4-31)
LAR1 //要異或的數(shù)據(jù)的起始地址送AR1
L #Lenth //取需要累加的字的個(gè)數(shù)(即需要循環(huán)的次數(shù))
_002 :T #Lenth //保存剩余循環(huán)次數(shù)
L W[AR1,P#0.0] //取數(shù)據(jù)字
L #Result //取異或運(yùn)算的中間結(jié)果
XOW //字異或運(yùn)算
T #Result //存放運(yùn)算結(jié)果
+AR1 P#2.0 //AR1指向下一個(gè)字
L #Lenth //取剩余循環(huán)次數(shù)
LOOP _002 //未運(yùn)算完則返回
_003: NOP 0
從這個(gè)例子可以看到寄存器間接尋址的優(yōu)點(diǎn),通過修改地址偏移量,可以方便地讀寫相距任意字節(jié)的地址的數(shù)據(jù)。
3.OB1的程序設(shè)計(jì)與程序運(yùn)行結(jié)果
下面是OB1中調(diào)用FC2的程序,對DB1中的DBW0、DBW2和DBW4作異或運(yùn)算,運(yùn)算結(jié)果送MW4。
CALL FC 2
AnyPoint :=P#DB1. DBX 0.0 WORD 3
Result :=MW4
應(yīng)先定義后使用數(shù)據(jù)塊中的變量,如果使用了數(shù)據(jù)塊中未定義的變量,將會出錯(cuò)。
圖4-32中的變量表給出了程序運(yùn)行的結(jié)果,DB1前3個(gè)字同一位中1的個(gè)數(shù)為奇數(shù)時(shí),異或運(yùn)算后MW4的同一位為1;1的個(gè)數(shù)為偶數(shù)時(shí),MW4的同一位為0。
圖4-32 變量表
西門子S7-1200PLC模塊遼寧代理商