之前自己写的程序有偏差,300 的累计程序看参考下面的,仅供参考!
流量累计的SCL代码-技术论坛-工业支持中心-西门子中国 (siemens.com.cn);
FUNCTION_BLOCK Integr
TITLE = 'Integr'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR: Author
NAME: Name
FAMILY: Family
// Block Parameters
VAR_INPUT
In{S7_dynamic:='true'}:REAL; // Analog Input Value
OutHiLim{S7_dynamic:='true';S7_edit:='para'}:REAL:=999999999;// Out High Limit
OutLoLim{S7_dynamic:='true';S7_edit:='para'}:REAL:=0;// Out Low Limit
Ti{S7_dynamic:='true';S7_edit:='para'}:REAL:=1;// Integral Time Constant [s]
SampleTime{S7_link:='false';S7_param:='false';S7_sampletime:='true';S7_visible:='false'}:REAL:=0.1;// Sampling Time [s]
Hold{S7_dynamic:='true';S7_visible:='true'}:bool; // Hold Calculation Process
OutTrkOn{S7_dynamic:='true';S7_visible:='true'}:bool; // Tracking Out
OutTrk{S7_dynamic:='true';S7_visible:='true'}:REAL; // Tracking Value
InHyst{S7_dynamic:='true';S7_edit:='para';S7_visible:='true'}:REAL;// Hysteresis
END_VAR
VAR_IN_OUT
// I/O Parameters
END_VAR
VAR_OUTPUT
Out{S7_dynamic:='true'}:real; // Analog Output Value
OutHiAct{S7_dynamic:='true'} :BOOL;// OutHiAct
OutLoAct{S7_dynamic:='true'}:bool; // OutLoAct
ErrorNum{S7_dynamic:='true';S7_visible:='false'}:INT:=-1;//NumErrorNum
END_VAR
VAR_TEMP
xOut : REAL ; //Varialble for Out.
xTITemp : REAL ;//varialble for TI calculation.
xTI : REAL ; //Varialble fro TI.
END_VAR
VAR
SxInLastCycle : REAL ; //Varialble for LastCycle calculation of In
SxOutLastCycle : REAL ; //Varialble for LastCycle calculation of out
SxPrevOutLastCycle : REAL ; //Varialble for previous LastCycle calculation of out
END_VAR
BEGIN
// OutHiLim
IF Out < OutloLim + InHyst THEN
OutLoAct := true ;
ELSE
OutLoAct := false ;
END_IF;
// OutHiLim
IF Out >= OutHiLim - InHyst THEN
OutHiAct := true ;
ELSE
OutHiAct := false ;
END_IF;
xOut := Out;
xTI := TI;
IF NOT OutTrkOn THEN
IF NOT Hold THEN
xOut := SampleTime*(IN + SxInLastCycle)*0.5/xTI + SxOutLastCycle ;
xTITemp := xOut + SxPrevOutLastCycle;
SxOutLastCycle := SxPrevOutLastCycle - xTITemp + xOut;
xOut := xTITemp;
ELSE
;
END_IF;
ELSE
xOut:=OutTrk;
END_IF;
SxPrevOutLastCycle := xOut;
SxInLastCycle := In;
Out := xOut;
END_FUNCTION_BLOCK
v