公司新聞
流量累計計算--西門子FB塊的封裝-SCL語言
發布時間: 2024-09-01 21:43 更新時間: 2024-11-22 08:00
觀看流量累計計算--西門子FB塊的封裝-SCL語言視頻
目前,具有眾多不同品牌流量積算儀用來測量工業現場液體或者固體的瞬時流量,然后通過4-20mA信號傳遞給PLC,作為控制或監控的數據標準。PLC根據瞬時流量積算一定時間內的累積流量,對于流程工業控制領域液體或固體流量的數據分析和產量計算應用具有重要的意義。在西門子PLC中實現流量累計計算是一個常見的需求,尤其是在處理流體物料的應用中。下面我將提供一個基本的指導流程和一些關鍵步驟,以幫助您在西門子S7-1200 PLC上實現流量累計計算。一、基礎原理
IF #run = FALSE THEN #relay := 0; #initial := 0;END_IF;
#flow_VAL_1 := #flow_VAL / 36000; //采集的是M3/H 轉換成 M3/S IF #initial = 1 AND #relay = 1 THEN //初始化完成后采集 FOR #i := 1 TO #Filter_Length BY 1 DO #FLOW_DATA[#i] := #flow_VAL_1; END_FOR; END_IF; IF #initial = 0 AND #relay = 1 THEN //初始流量采集 FOR #i := 1 TO #Array_length BY 1 DO #FLOW_DATA[#i] := #flow_VAL_1; END_FOR; #initial := 1; END_IF; #FLOW_DATA_MAX := 0; //Zui大值濾波 FOR #i := 1 TO #Array_length BY 1 DO IF #FLOW_DATA_MAX < #FLOW_DATA[#i] THEN #FLOW_DATA_MAX := #FLOW_DATA[#i]; END_IF; END_FOR; #FLOW_DATA_MIN := #FLOW_DATA_MAX; //Zui小值濾波 FOR #i := 1 TO #Array_length BY 1 DO IF #FLOW_DATA_MIN > #FLOW_DATA[#i] THEN #FLOW_DATA_MIN := #FLOW_DATA[#i]; END_IF; END_FOR; #FLOW_DATA_SUM := 0; //數據求和求平均部分 FOR #i := 1 TO #Array_length BY 1 DO #FLOW_DATA_SUM := #FLOW_DATA[#i] + #FLOW_DATA_SUM; END_FOR; #FLOW_DATA_Average := (#FLOW_DATA_SUM - #FLOW_DATA_MIN - #FLOW_DATA_MAX) / (#Array_length - 2); FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO #FLOW_DATA_1[#i] := #FLOW_DATA[#i]; END_FOR; FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO #FLOW_DATA[#i + #Filter_Length] := #FLOW_DATA_1[#i]; END_FOR; //數字濾波強度計算 IF #Array_length >= 10 THEN IF #Filter_strength > 3 THEN #Filter_strength := 3; END_IF; #Filter_Length := (#Array_length / 10) * 2 * #Filter_strength; END_IF; IF #Array_length < 10 THEN IF #Filter_strength > 2 THEN #Filter_strength := 2; END_IF; #Filter_Length := 2 * #Filter_strength; END_IF; #IEC_Timer_0_Instance(IN := NOT #IEC_Timer_0_Instance.Q, PT := #Cycle_ms); IF #IEC_Timer_0_Instance.Q THEN #time_data := TIME_TO_DINT(#Cycle_ms); #Cycle_Real := DINT_TO_REAL(#time_data); #Accum := (#Last_Value + #flow_VAL_1) * #Cycle_Real / 2 + #Accum; #flow_out_put := #Accum; #Last_Value := #flow_VAL_1; END_IF; IF #Reset THEN #Last_Value := 0.000000E000; #Accum := 0.000000E000; #flow_out_put := 0.000000E000; END_IF;四、結論對只有瞬時流量輸出的流量計,才考慮在PLC中進行流量累積加法運算。在PLC內做流量累積的時候,不應使用定時器來做,因為定時器受到PLC掃描周期的影響,沒法做到十分jingque,累加出來數據的誤差很大。在實際應用中吧此程序放到循環中斷里即可。
流量累計通常涉及瞬時流量的測量,并將其轉換為累計流量。瞬時流量可以是通過模擬量輸入(如4-20mA電流信號)或數字量輸入(如脈沖信號)獲得的。
二、實現步驟確定輸入類型:
如果是模擬量輸入,需要配置相應的模擬量輸入模塊(如SM1231),并確保正確設置了量程和單位。
如果是脈沖輸入,則需要配置高速計數器(HSC)來讀取脈沖頻率,并計算瞬時流量。
瞬時流量計算:
對于模擬量輸入,PLC會自動將輸入信號轉換為工程單位(如L/min或m3/h)。
對于脈沖輸入,需要根據脈沖頻率和脈沖系數來計算瞬時流量。
流量累計:
使用定時中斷(如OB30)來定期更新累計流量或者也可以用定時器來觸發本次主要是以定時器為例來介紹。
將得到的體積流量累加到累計流量寄存器中。
三、FB塊的封裝引腳介紹、源碼展示
(一)FB塊的封裝
run:BOOL; //運行時間
flow_VAL:REAL; //瞬時流量輸入m3/H
Reset:BOOL; //流量清零
Cycle_ms:TIME; //采樣時間
flow_out_put:REAL; //累計流量輸出
Array_length:INT; //數組長度
Filter_strength:INT; //濾波強度
(二)源碼展示
IF #run = TRUE THEN #relay := 1;END_IF;IF #run = FALSE THEN #relay := 0; #initial := 0;END_IF;
#flow_VAL_1 := #flow_VAL / 36000; //采集的是M3/H 轉換成 M3/S IF #initial = 1 AND #relay = 1 THEN //初始化完成后采集 FOR #i := 1 TO #Filter_Length BY 1 DO #FLOW_DATA[#i] := #flow_VAL_1; END_FOR; END_IF; IF #initial = 0 AND #relay = 1 THEN //初始流量采集 FOR #i := 1 TO #Array_length BY 1 DO #FLOW_DATA[#i] := #flow_VAL_1; END_FOR; #initial := 1; END_IF; #FLOW_DATA_MAX := 0; //Zui大值濾波 FOR #i := 1 TO #Array_length BY 1 DO IF #FLOW_DATA_MAX < #FLOW_DATA[#i] THEN #FLOW_DATA_MAX := #FLOW_DATA[#i]; END_IF; END_FOR; #FLOW_DATA_MIN := #FLOW_DATA_MAX; //Zui小值濾波 FOR #i := 1 TO #Array_length BY 1 DO IF #FLOW_DATA_MIN > #FLOW_DATA[#i] THEN #FLOW_DATA_MIN := #FLOW_DATA[#i]; END_IF; END_FOR; #FLOW_DATA_SUM := 0; //數據求和求平均部分 FOR #i := 1 TO #Array_length BY 1 DO #FLOW_DATA_SUM := #FLOW_DATA[#i] + #FLOW_DATA_SUM; END_FOR; #FLOW_DATA_Average := (#FLOW_DATA_SUM - #FLOW_DATA_MIN - #FLOW_DATA_MAX) / (#Array_length - 2); FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO #FLOW_DATA_1[#i] := #FLOW_DATA[#i]; END_FOR; FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO #FLOW_DATA[#i + #Filter_Length] := #FLOW_DATA_1[#i]; END_FOR; //數字濾波強度計算 IF #Array_length >= 10 THEN IF #Filter_strength > 3 THEN #Filter_strength := 3; END_IF; #Filter_Length := (#Array_length / 10) * 2 * #Filter_strength; END_IF; IF #Array_length < 10 THEN IF #Filter_strength > 2 THEN #Filter_strength := 2; END_IF; #Filter_Length := 2 * #Filter_strength; END_IF; #IEC_Timer_0_Instance(IN := NOT #IEC_Timer_0_Instance.Q, PT := #Cycle_ms); IF #IEC_Timer_0_Instance.Q THEN #time_data := TIME_TO_DINT(#Cycle_ms); #Cycle_Real := DINT_TO_REAL(#time_data); #Accum := (#Last_Value + #flow_VAL_1) * #Cycle_Real / 2 + #Accum; #flow_out_put := #Accum; #Last_Value := #flow_VAL_1; END_IF; IF #Reset THEN #Last_Value := 0.000000E000; #Accum := 0.000000E000; #flow_out_put := 0.000000E000; END_IF;四、結論對只有瞬時流量輸出的流量計,才考慮在PLC中進行流量累積加法運算。在PLC內做流量累積的時候,不應使用定時器來做,因為定時器受到PLC掃描周期的影響,沒法做到十分jingque,累加出來數據的誤差很大。在實際應用中吧此程序放到循環中斷里即可。
其他新聞
- PID調節算法自封FB塊西門子1200——帶輸入濾波 2024-11-22
- 西門子PROFINET通訊(1200和200smart)——PID溫度控制 2024-11-22
- 西門子WINCC8.0帶確認的輸入/輸出域 2024-11-22
- 西門子博途WINCC公共彈窗 2024-11-22
- 西門子WinCC冗余項目使用 2024-11-22
- 西門子S7-1500作為智能設備共享功能 2024-11-22
- 西門子PLC如何通過編程判斷程序是否發生過改動 2024-11-22
- 西門子精簡面板和精智面板與S7-1200/1500PLC時間同步功能 2024-11-22
- 西門子TIA博途SCL編程學習7_計算N天后的日期 2024-11-22
- 西門子TIA博途S7-1200/1500學習7間接尋址指令PEEK的使用 2024-11-22
- 西門子TIA博途SCL編程學習2 2024-11-22
- 西門子PLC用TIA博途SCL語言寫的一個產生隨機實數的指令塊 2024-11-22
- 自動語音播報西門子WinCC報警消息 2024-11-22
- 西門子WinCC V7.5典型架構及選型指南 2024-11-22
- 通過Web Service與西門子WinCC交互數據 2024-11-22
產品分類
聯系方式
- 電 話:13510737515
- 聯系人:董海波
- 手 機:13185520415
- 微 信:13185520415