s7-300流量累計源碼.zip
(211.95 KB, 售價: 2 E幣)
建立一個FB塊
IN中建立
名稱 VALUE 數據類型 real
名稱 Interval 數據類型 time 計量單位的時間例如:30M3/H 則輸入 T#1H
名稱 Cycle 數據類型 time 掃描循環的時間 放在OB35中則是T#100ms OB36則是T#50ms
名稱 Com_RST 數據類型 bool 復位開關,ON時清零,需要在掃描時間內,需要將此位置位時間大于
//////////////////////////////////OB35的中斷掃描時間。
OUT中建立
名稱 TOTAL 數據類型 real 累計值
Stat中建立
名稱 Accum 數據類型 real
Temp中建立
名稱 tInterval 數據類型 real
名稱 tCycle 數據類型 real
程序段1中輸入
A #COM_RST
JCN NW2
L 0.0
T #ACCUM
T #TOTAL
SET
SAVE
BEU
程序段2中輸入
NW2: NOP 0
L #INTERVAL
DTR
T #tINTERVAL
L #CYCLE
DTR
T #tCYCLE
程序段3中輸入
L #VALUE
L #tCYCLE
*R
L #tINTERVAL
/R
L #ACCUM
+R
T #ACCUM
T #TOTAL
程序段4中輸入
SET
SAVE
BEU
保存為FB功能塊
說明:次功能塊只能接受real值。直接讀取上來的值需要經過fc105的轉換后或自行轉換為32位浮點數后再使用。
應用實例:
你覺得有用,幫忙頂一下。
上面的例子在累計數特別大時,容易出現計數不準,偏差比較大。下面的程序更改后比較好點。
代碼如下:
文字的上傳不上來。用圖片粘貼吧。
提供一個工程附件。累計塊為FC1001.
附件內包含源程序,以及簡易的模擬量轉換源碼。以及自己編寫的一點邏輯程序源碼。
1200&1500代碼
FUNCTION_BLOCK "TOT"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
VAR_INPUT
_Hi : Real; // 現場流量計,上限量程。
_InterVal : Time; // 此時間為量程中標定的時間。例如30m3/h則為1h,30L/m則為60s,
_Cycle : Time; // 次時間為循環掃描時間,例如OB35則為100ms,OB32則為1s
_inPV : Real; // 實際輸入值。
_inLoQC : Real; // 小信號切除值。
END_VAR
VAR_OUTPUT
_TOT_value : Real; // 累計值
END_VAR
VAR_IN_OUT
_Start_Stop : Bool; // 啟動停止累計操作端。
_Com_RST : Bool; // 復位操作端。此端口置1后自動復位。
END_VAR
VAR
_TOTAL_L : Real; // 流量累計輸出值,低位。
_TOTAL_H : Real; // 流量累計輸出值,高位。
_start_Temp : Bool;
END_VAR
VAR_TEMP
_t_Value : Real;
_t_Cycle : Real;
_t_InterVal : Real;
_var1 : Real;
END_VAR
BEGIN
#_t_Cycle := DINT_TO_REAL(TIME_TO_DINT(#_Cycle)); //將時間數據轉換為實數。
#_t_InterVal := DINT_TO_REAL(TIME_TO_DINT(#_InterVal)); //將時間數據轉換為實數。
//#_var1 := SCALE(IN := #_inPV, HI_LIM := #_Hi, LO_LIM := 0, BIPOLAR := 0, OUT => #_t_Value);
//復位清零操作
IF #_Com_RST THEN
#_TOTAL_H := 0;
#_TOTAL_L := 0;
#_Com_RST := FALSE;
END_IF;
//切除小信號,當低于切除值時,將累積信號置0;
IF #_inPV > #_inLoQC THEN
#_var1 := 0;
ELSE
#_var1 := #_inPV;
END_IF;
//當輸入啟動信號到達后,立即開啟累積計數,當啟動信號停止(結束)后,判斷信號值是否到0,到0后立即停止累積計數。
//下面這節是根據實際工況改寫的一節延時計量,
//
// IF #_Start_Stop THEN
// #_start_Temp := 1;
// ELSIF #_var1 = 0 THEN
// #_start_Temp := 0;
// END_IF;
//
//正常使用下面這一節
IF #_Start_Stop THEN
#_start_Temp := 1;
ELSE
#_start_Temp := 0;
END_IF;
//開始累積
IF #_start_Temp THEN
#_TOTAL_L := #_var1 * #_t_Cycle / #_t_InterVal + #_TOTAL_L;
END_IF;
//消除極大數加極小數的累加錯誤
IF #_TOTAL_L > 1000.0 THEN
#_TOTAL_H := #_TOTAL_H + 1;
#_TOTAL_L := #_TOTAL_L - 1000.0;
END_IF;
//輸出結果
#_TOT_value :=( #_TOTAL_H * 1000)+ #_TOTAL_L;
END_FUNCTION_BLOCK
| 歡迎光臨 ELEOK (http://m.afoofa.cn/) | Powered by Discuz! X5.0 |