聲明部分的結(jié)構(gòu)(Structure of the Declaration Section)
塊中的聲明部分包含以下子域:
常量:在CONST和END_CONST之間。
輸入參數(shù):在VAR_INPUT和END_VAR之間。
輸出參數(shù):在VAR_OUTPUT和END_VAR之間。
靜態(tài)變量:在VAR和END_VAR之間。也包括對EVALUATE塊的本地實例的聲明。
CONST
LIMIT := 7;
QUANTITY := LIMIT + 1;
END_CONST
VAR_INPUT 輸入變量聲明
measval_in :INT ; // 新測量值
newval :BOOL; // 在環(huán)形緩沖區(qū)"measvals"中的測量值
resort :BOOL; // 對測量值進(jìn)行排序
funct_sel :BOOL; // Select calculation square root/square
newsel :BOOL; // 取得輸出地址
selection :WORD; // 輸出地址
END_VAR
VAR_OUTPUT 輸出變量聲明
result_out :INT; // 計算值
measval_out:INT; // 相應(yīng)的測量值
END_VAR
VAR 靜態(tài)變量聲明
measvals:ARRAY[0..LIMIT] OF INT := 8(0);
resultbuffer:ARRAY[0..LIMIT] OF
STRUCT
squareroot:INT;
square:INT;
END_STRUCT;
pointer:INT:= 0;
oldval:BOOL:= TRUE;
oldsort:BOOL:= TRUE;
oldsel:BOOL:= TRUE;
address:INT:= 0; // 轉(zhuǎn)換后的輸出地址
outvalues_instance: EVALUATE;// 定義本地實例
END_VAR
靜態(tài)變量(Static Variables)
因為某些數(shù)據(jù)要保留到下一個程序循環(huán),所以選擇FB塊類型。有些靜態(tài)變量在聲明部分"VAR, END_VAR"中聲明。
靜態(tài)變量是本地變量,其值保留貫穿每個塊處理過程。他們用來保留功能塊的值,且存貯在實例數(shù)據(jù)塊中。
初始化變量(Initializing Variables)
記住當(dāng)塊被初始化時(下載到CPU之后),在變量中鍵入初始值。功能塊EVALUATE的本地實例也在聲明子域"VAR, END_VAR"中聲明。其名字是以后調(diào)用和存取輸出參數(shù)使用的。共享的實例ACQUIRE_DATA用來存貯數(shù)據(jù)。
語句部分的結(jié)構(gòu)(Structure of the Statement Section)
ACQUIRE的語句部分分為三個子部分:
獲取測量值:
如果輸入?yún)?shù)"newval"與"oldval"不同,則讀入一個新測量值到環(huán)形緩沖區(qū)。
啟動排序和計算:
比較輸入?yún)?shù)"resort"和"oldsort",發(fā)生改變時,通過調(diào)用EVALUATE功能塊啟動排充和計算。
求取代碼并準(zhǔn)備輸出:
按字讀取代碼。根據(jù)SIMATIC轉(zhuǎn)換規(guī)則,意思是上開關(guān)組(字節(jié)0)包含輸入字的高8位,下開關(guān)組(字節(jié)1)包含低8位。下圖顯示代碼開關(guān)的位置。
計算地址(Calculating the Address)
下圖顯示如何計算地址:檢測到取碼開關(guān)(位15)一個邊沿,輸入字IW0的12至14位包含了讀入的代碼。用標(biāo)準(zhǔn)函數(shù)SHR右移并用AND屏蔽相應(yīng)的位得到“地址”。
地址用來將數(shù)組元素(計算結(jié)果和對應(yīng)測量值)寫入輸出參數(shù)。是均方根據(jù),還是平方值決定于"funct_sel"。
檢測到取碼開關(guān)的一個邊沿,是因為"newsel"和"oldsel"不同。
邏輯塊的語句部分如下:
BEGIN
(*****************************************************************
第1部分:獲取測量值。
如果"newval"值發(fā)生改變,則輸入了測量值。MOD運算是用來實現(xiàn)測量值用的環(huán)形緩沖區(qū)。
******************************************************************)
IF newval <> oldval THEN
pointer := pointer MOD QUANTITY;
measvals[pointer] := measval_in;
pointer := pointer + 1;
END_IF;
oldval := newval;
(*****************************************************************
第2部分:啟動排序和計算
如果"resort"發(fā)生改變,則啟動對環(huán)形緩沖區(qū)的排序和運行對測量值的計算。
結(jié)果存貯在一個新的叫"calcbuffer"的數(shù)組里。
******************************************************************)
IF resort <> oldsort THEN
pointer := 0; //復(fù)位緩沖區(qū)指針
eval_instance(sortbuffer := measvals); //調(diào)用EVALUATE
END_IF;
oldsort := resort;
resultbuffer := eval_instance.calcbuffer; //平方值和均方根
(*****************************************************************
第3部分:求代碼值和準(zhǔn)備輸出
如果"newsel"發(fā)生改變,則計算用來輸出的數(shù)組元素的尋址代碼:屏蔽"selection"
的相應(yīng)位并轉(zhuǎn)換為整數(shù)。依據(jù)"funct_sel"開關(guān)的設(shè)置,選擇"squareroot"或
"square"用于輸出。
******************************************************************)
IF newsel <> oldsel THEN
address := WORD_TO_INT(SHR(IN := selection, N := 12) AND 16#0007);
END_IF;
oldsel := newsel;
IF funct_sel THEN
result_out := resultbuffer[address].square;
ELSE
result_out := resultbuffer[address].squareroot;
END_IF;
measval_out := measvals[address]; //Measured value display
END_FUNCTION_BLOCK
審核編輯:劉清
-
西門子
+關(guān)注
關(guān)注
94文章
3052瀏覽量
116066 -
VaR
+關(guān)注
關(guān)注
0文章
39瀏覽量
11356 -
SCL
+關(guān)注
關(guān)注
1文章
239瀏覽量
17111
原文標(biāo)題:西門子SCL 建立功能塊ACQUIRE(獲得)
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機(jī)器人及PLC自動化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論