EFB0412MD
下面的例子解釋了系統(tǒng)功能塊SFC50“RD_LGADR”(讀模塊邏輯地址)內(nèi)參數(shù)的確定。例如,為功能塊FB1編程可分為下面幾個(gè)步驟:
臺(tái)達(dá)風(fēng)扇代理
程先生 139 188 64473 qq:937926739
?聲明一個(gè)IN變量“test”和一個(gè)TEMP變量“test2”,類型都為ANY(圖1)。
?將SFC50的參數(shù)“PEADDR”傳送到變量“test2”。
?通過(guò)為ANY指針“test”賦值,將數(shù)據(jù)傳送到臨時(shí)變量“test2”中。
語(yǔ)句L P##test首先將地址裝載到Accu1,然后通過(guò)LAR1語(yǔ)句裝載到地址寄存器AR1中(可能是LAR1 P##test的簡(jiǎn)化格式)。通過(guò)寄存器間接尋址將ANY指針(10 字節(jié)長(zhǎng))中的地址信息讀出:
代碼注釋

0 L W[AR1,P#0.0] 讀出當(dāng)前Accu1中參數(shù)數(shù)據(jù)類型的代碼。
2 L W[AR1,P#2.0] 讀出Accu1中的重復(fù)因數(shù)。重復(fù)因數(shù)表明通過(guò)參數(shù)類型ANY傳遞的數(shù)據(jù)類型的大小。
4 L W[AR1,P#4.0] 讀數(shù)據(jù)塊的號(hào)或者從ANY指針中讀出“0”(這個(gè)對(duì)應(yīng)于ANY指針的第 4 到第 5 字節(jié))。
6 L D[AR1, P#6.0] 將區(qū)域指針讀入Accu1。
每次讀地址寄存器AR1之后,數(shù)據(jù)被保存或者緩存(如T LW 0)在臨時(shí)變量“test2”中(ANY指針)。按照Network 1中的語(yǔ)句順序,傳送到功能塊FB1 的ANY指針被復(fù)制到臨時(shí)變量“test2”中。
137:怎樣通過(guò)交叉區(qū)域寄存器間接尋址訪問(wèn)功能塊的本地?cái)?shù)據(jù)或者功能?
這里必須預(yù)先定義本地?cái)?shù)據(jù)。您可以使用下列語(yǔ)句訪問(wèn)FB或FC的本地?cái)?shù)據(jù):
對(duì)于存儲(chǔ)器間接指針尋址,本地變量必須聲明為臨時(shí)變量(temp):
L P##Lokalvariable
LAR1
L W[AR1,P#X.x]
此處不能使用變量類型“Input”、“Output”和“In_Out”,將被語(yǔ)法檢查視為非法。
138:怎樣編程間接訪問(wèn)一個(gè)ARRAY類型變量的元素?
一個(gè)位、字節(jié)或者字符域的尺寸是按照字節(jié)限制排列的——在所有其它情況下是按照字對(duì)齊的。表T6-1中給出了一個(gè)域的存儲(chǔ)示例。操作系統(tǒng)計(jì)算域中單個(gè)元素末端位置的位地址。域被分配到從下一個(gè)字地址(或字節(jié)地址)。下一個(gè)數(shù)據(jù)類型從下一個(gè)整字開始(或者整字節(jié)).
聲明部分:
在聲明部分,必須定義一個(gè)與將被間接尋址的ARRAY有著同一結(jié)構(gòu)的ARRAY。不一定非要將ARRAY聲明為IN-OUT變量;也可以聲明為TEMP、IN或OUT變量。
網(wǎng)絡(luò):
域?qū)挾?OFFSET)在網(wǎng)絡(luò)中定義。ARRAY中的單個(gè)元素的*小常規(guī)數(shù)據(jù)寬度是一個(gè)字節(jié);即使在兩個(gè)變量之間定義一個(gè)BOOL。有必要確定相關(guān)的域的寬度和確定下一個(gè)期望域的起始地址??墒褂孟旅娴乃惴ǎ?br />
地址(指數(shù)):b = 元素長(zhǎng)度*(指數(shù) - 1)
創(chuàng)建具有不同數(shù)據(jù)類型的結(jié)構(gòu)時(shí),必須注意,在特定的環(huán)境下可能會(huì)自動(dòng)插入填充字節(jié)。
保存ARRAY數(shù)據(jù)類型:
示例:ARRAY [1..2,1..3] OF 整數(shù)將生成下列域:
多維域是按照順序保存的。在本例中整數(shù) [1,1]后面是整數(shù) [1,2],整數(shù) [1,3]后面是整數(shù)[2,1]。
139:STEP 7 以哪種格式存儲(chǔ)POINTER參數(shù)類型?
STEP 7以 6 個(gè)字節(jié)保存POINTER參數(shù)。表4-1顯示了用于保存POINTER參數(shù)類型的內(nèi)存區(qū)域以及每個(gè)字節(jié)中保存的數(shù)據(jù)。i POINTER參數(shù)類型保存了下列信息:
DB號(hào)(如果DB中沒(méi)有保存任何數(shù)據(jù)時(shí)為0)。
CPU中的內(nèi)存區(qū)域(表格中列出了不同內(nèi)存區(qū)域的十六進(jìn)制代碼)。
數(shù)據(jù)的地址(按照Byte.Bit格式)。
如果將形式參數(shù)聲明為POINTER參數(shù)類型,則只需要指定內(nèi)存區(qū)域和地址。STEP 7自動(dòng)將輸入項(xiàng)目的格式轉(zhuǎn)換為指針格式。
140:如何間接訪問(wèn)I/O地址區(qū)域?
下面演示了一個(gè)間接訪問(wèn)PA區(qū)域的例子。您具有對(duì)輸出模塊只寫訪問(wèn)和對(duì)輸入模塊只讀訪問(wèn)的權(quán)利
FUNCTION_BLOCK FB 2
TITLE =
VERSION : 0.1
VAR_INPUT
TargetAddress : DWORD := DW#16#FF; //Target address by PA address range
OutputValue : DWORD ; //Output value
P_Typ : BOOL ; //1=PE range, 0=PA range
END_VAR
VAR_OUTPUT
InputValue : DWORD ; //Input value
END_VAR
VAR_TEMP
TargetTmp : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =
U #P_Typ;
SPB PEA;
L #TargetAddress;
T #TargetTmp; //Load target address in the tempor鋜e store
SLD 3; //Calculate the formate of pointer Byte.Bit
T #TargetTmp; //Initialisation of temp variable with target address in L-Stack
L #OutputValue; //Load output value
T PAD [#TargetTmp]; //Transfere output value to target address
SPA End;
PEA: L #TargetAddress;
T #TargetTmp; //Load target address in the tempor鋜e store
SLD 3; //Calculate the formate of pointer Byte.Bit
T #TargetTmp; //Initialisation of temp variable with target address in L-Stack
L PED [#TargetTmp]; //Load output value
T #OutputValue; //Transfere output value to target address
End: CLR ;
END_FUNCTION_BLOCK
141:應(yīng)用軟件冗余當(dāng)一個(gè)長(zhǎng)度錯(cuò)誤出現(xiàn)導(dǎo)致CPU處于STOP模式應(yīng)該作些什么?
當(dāng)在OB100中設(shè)置軟件冗余功能塊FC100時(shí),必須注意下列情況:參數(shù)IEC_NO 的背景數(shù)據(jù)塊必須至少有兩個(gè)字的長(zhǎng)度,同樣應(yīng)用于冗余用戶程序的參數(shù)DB_NO的數(shù)據(jù)塊也必須時(shí)這樣。
142:在S7程序中,有許多FC、FB塊, 我怎樣對(duì)其中的一些塊進(jìn)行保護(hù), 而其它的塊可以是開放的呢?
1) Step7中, 可以先任意打開一塊如OB1, 在"file"中選擇"Generate Source"或快捷方式"Ctrl+T",彈出一個(gè)畫面,填寫"object name"如"tt",然后按OK確認(rèn),就會(huì)再?gòu)棾隽硪粋€(gè)畫面,左邊是你的程序中所有的塊,如果你需要保護(hù)哪些塊, 就把這些塊移到右邊,如FB1、FB2等等, 然后退出所有的程序塊,再進(jìn)入SIMATIC Manager中。
2) 在S7 Program Sources找到文件tt,雙擊tt打開,在第四行中加入"Know_How_Protect", 然后編譯, 無(wú)錯(cuò)后存盤。這樣FB1、FB2就被保護(hù)住,如想去掉保護(hù),在tt中去掉"Know_How_Protect"編譯存盤即可。
注意: 千萬(wàn)不要丟失或刪除源文件(如tt), 否則程序被保護(hù), 用戶可以另存到其它目錄中,或Export Source到硬盤中,再刪除源文件,這樣別人只能看到未保護(hù)的塊。