国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

[基本使用] s7-300 plc流量累計程序源碼

[復(fù)制鏈接]
樓主
問題多多 發(fā)表于 2019-9-9 18:27:59 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
廠商
廠商: 西門子

s7-300流量累計源碼.zip (211.95 KB, 售價: 2 E幣)

建立一個FB塊

IN中建立

名稱 VALUE  數(shù)據(jù)類型 real

名稱 Interval  數(shù)據(jù)類型  time     計量單位的時間例如:30M3/H  則輸入 T#1H

名稱 Cycle     數(shù)據(jù)類型  time     掃描循環(huán)的時間 放在OB35中則是T#100ms OB36則是T#50ms

名稱 Com_RST   數(shù)據(jù)類型  bool     復(fù)位開關(guān),ON時清零,需要在掃描時間內(nèi),需要將此位置位時間大于

//////////////////////////////////OB35的中斷掃描時間。

OUT中建立

名稱 TOTAL     數(shù)據(jù)類型  real     累計值

Stat中建立

名稱 Accum     數(shù)據(jù)類型  real

Temp中建立

名稱 tInterval 數(shù)據(jù)類型  real

名稱 tCycle    數(shù)據(jù)類型  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值。直接讀取上來的值需要經(jīng)過fc105的轉(zhuǎn)換后或自行轉(zhuǎn)換為32位浮點數(shù)后再使用。


應(yīng)用實例:

s7-300 plc流量累計程序源碼 20151012092847199_min.png

s7-300 plc流量累計程序源碼 20151012092847308_min.png


你覺得有用,幫忙頂一下。


上面的例子在累計數(shù)特別大時,容易出現(xiàn)計數(shù)不準,偏差比較大。下面的程序更改后比較好點。

代碼如下:

文字的上傳不上來。用圖片粘貼吧。


s7-300 plc流量累計程序源碼 20160215172604376_min.png

s7-300 plc流量累計程序源碼 20160215172605063_min.png

提供一個工程附件。累計塊為FC1001.
附件內(nèi)包含源程序,以及簡易的模擬量轉(zhuǎn)換源碼。以及自己編寫的一點邏輯程序源碼。


1200&1500代碼


FUNCTION_BLOCK "TOT"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Tyfixn
VERSION : 0.1
   VAR_INPUT
      _Hi : Real;   // 現(xiàn)場流量計,上限量程。
      _InterVal : Time;   // 此時間為量程中標定的時間。例如30m3/h則為1h,30L/m則為60s,
      _Cycle : Time;   // 次時間為循環(huán)掃描時間,例如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;   // 復(fù)位操作端。此端口置1后自動復(fù)位。
   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));           //將時間數(shù)據(jù)轉(zhuǎn)換為實數(shù)。
#_t_InterVal := DINT_TO_REAL(TIME_TO_DINT(#_InterVal));      //將時間數(shù)據(jù)轉(zhuǎn)換為實數(shù)。
//#_var1 := SCALE(IN := #_inPV, HI_LIM := #_Hi, LO_LIM := 0, BIPOLAR := 0, OUT => #_t_Value);

//復(fù)位清零操作
IF #_Com_RST THEN
     #_TOTAL_H := 0;
     #_TOTAL_L := 0;
     #_Com_RST := FALSE;
END_IF;

//切除小信號,當?shù)陀谇谐禃r,將累積信號置0;
IF #_inPV > #_inLoQC THEN
     #_var1 := 0;
ELSE
     #_var1 := #_inPV;
END_IF;

//當輸入啟動信號到達后,立即開啟累積計數(shù),當啟動信號停止(結(jié)束)后,判斷信號值是否到0,到0后立即停止累積計數(shù)。

//下面這節(jié)是根據(jù)實際工況改寫的一節(jié)延時計量,
//

// IF #_Start_Stop THEN
//     #_start_Temp := 1;
// ELSIF #_var1 = 0 THEN
//     #_start_Temp := 0;
// END_IF;
//


//正常使用下面這一節(jié)

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;

//消除極大數(shù)加極小數(shù)的累加錯誤
IF #_TOTAL_L > 1000.0 THEN
     #_TOTAL_H := #_TOTAL_H + 1;
     #_TOTAL_L := #_TOTAL_L - 1000.0;
END_IF;

//輸出結(jié)果
#_TOT_value :=( #_TOTAL_H * 1000)+ #_TOTAL_L;
END_FUNCTION_BLOCK



沙發(fā)
xyl35 發(fā)表于 2019-9-22 10:30:49 | 只看該作者
謝謝樓主分享經(jīng)驗,想問下在scl中 FUNCTION_BLOCK "TOT" 函數(shù)定義后面的“TOT” 是什么意思。有時候會是"INT" VOID. 沒有找到相關(guān)資料查閱,還希望能解釋一下
板凳
zly518ff 發(fā)表于 2019-9-25 16:03:33 | 只看該作者
謝謝樓主分享經(jīng)驗,新人學習了。:lol
地板
493034296 發(fā)表于 2020-1-7 16:12:59 | 只看該作者
感謝分享,下下來看看~
5#
kenneth0906 發(fā)表于 2020-2-24 12:53:09 | 只看該作者
學習了,感謝分享!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

手機版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 08:03

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表