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