基本和PCS7 Integrator 块差不多了;

FUNCTION_BLOCK Total
TITLE = 'Total'
{
S7_tasklist:= 'OB80,OB100'; // Block is called if there is a time error and at a warm restart
S7_m_c:= 'true'; // Block can be controlled and monitored
S7_alarm_ui:= '1' // Setting for PCS 7 message dialog ('0'=standard message dialog)
}
//
VERSION: '1.0'
AUTHOR:AdvLibM
NAME: Total
FAMILY: AdvLibM
//KNOW_HOW_PROTECT
VAR_INPUT
PV{S7_dynamic:='true';
S7_edit:='para';
S7_m_c:='true';
S7_xm_c:='value,true;';
S7_xqc:='value,true;';
S7_xshortcut:='value,Auxiliary,value1;'
}:STRUCT
value:REAL:=0; //当前流量
ST:BYTE:=16#ff;
END_STRUCT;
UNIT_K{S7_dynamic:='true';S7_edit:='para';S7_m_c:='true';S7_read_back:='true'}:REAL:=1.0;// 单位换算,标准单位为L/S
HOLD{S7_dynamic:='true';S7_edit:='para';S7_m_c:='true';S7_read_back:='true'}:BOOL:=1;//保持当前流量
OutTrkon{S7_dynamic:='true';S7_edit:='para';S7_m_c:='true';S7_read_back:='true'}:BOOL:=0;//强制累计
OutTrk{S7_dynamic:='true';S7_edit:='para';S7_m_c:='true';S7_read_back:='true'}:REAL:=0;// 强制值
END_VAR
VAR_IN_OUT
END_VAR
VAR_OUTPUT
PV_OUT {S7_dynamic:='true';S7_m_c:='true'}:REAL;//流量累计
CycleTime{S7_dynamic:='true';S7_m_c:='true'}:REAL;// 循环诊断扫描周期
END_VAR
VAR_TEMP
// Temporary Variables
END_VAR
VAR
PV_OUT0:REAL:=0;//累计0
PV_OUT1:REAL:=0;//累计1
TM1:TIME:=T#0MS;//循环时间点1 时间
TM0:TIME:=T#0MS;//循环时间点0 时间
FLOW1 :REAL:=0; //循环时间点1 流量
FLOW0 :REAL:=0; //循环时间点1 流量
END_VAR
BEGIN
IF HOLD=0 THEN //保持当前流量
TM1:=TIME_TCK();
TM0:=TIME_TCK();
FLOW0:=PV.value/(UNIT_K*1000);
FLOW1:=PV.value/(UNIT_K*1000);
ELSIF OutTrkon=1 AND HOLD=1 THEN//强制流量累计输出
PV_OUT0:=0.5*OutTrk;
PV_OUT1:=0.5*OutTrk;
PV_OUT:=PV_OUT0+PV_OUT1;
TM1:=TIME_TCK();
TM0:=TIME_TCK();
FLOW0:=PV.value/(UNIT_K*1000);
FLOW1:=PV.value/(UNIT_K*1000);
ELSIF OutTrkon=0 AND HOLD=1 AND TM0-TM1>T#90S THEN//TIME_TCK(最大值为2^31-1)重新计时点流量累计
FLOW0:=PV.value/(UNIT_K*1000);
CycleTime:=0;//2147483647-DINT_TO_REAL(TIME_TO_DINT(TM0-TM1));//扫描时间
PV_OUT0:=PV_OUT0+0.5*(FLOW1+FLOW0)*CycleTime;
PV_OUT:=PV_OUT0+PV_OUT1;
FLOW1:=PV.value/(UNIT_K*1000);
TM1:=TIME_TCK();
ELSIF OutTrkon=0 AND HOLD=1 AND TM0-TM1<T#90S AND TM0>=TM1 THEN//前半段流量累计
FLOW0:=PV.value/(UNIT_K*1000);
CycleTime:=DINT_TO_REAL(TIME_TO_DINT(TM0-TM1));//扫描时间
PV_OUT0:=PV_OUT0+0.5*(FLOW1+FLOW0)*CycleTime;
PV_OUT:=PV_OUT0+PV_OUT1;
TM1:=TIME_TCK();
FLOW1:=PV.value/(UNIT_K*1000);
ELSIF OutTrkon=0 AND HOLD=1 AND TM1-TM0>T#90S THEN//TIME_TCK(最大值为2^31-1)重新计时点流量累计
FLOW1:=PV.value/(UNIT_K*1000);
CycleTime:=0;//2147483647-DINT_TO_REAL(TIME_TO_DINT(TM1-TM0));//扫描时间
PV_OUT1:=PV_OUT1+0.5*(FLOW1+FLOW0)*CycleTime;
PV_OUT:=PV_OUT0+PV_OUT1;
TM0:=TIME_TCK();
FLOW0:=PV.value/(UNIT_K*1000);
ELSIF OutTrkon=0 AND HOLD=1 AND TM0<TM1 AND TM1-TM0<T#90S THEN//后半段流量累计
FLOW1:=PV.value/(UNIT_K*1000);
CycleTime:=DINT_TO_REAL(TIME_TO_DINT(TM1-TM0));//扫描时间
PV_OUT1:=PV_OUT1+0.5*(FLOW1+FLOW0)*CycleTime;
PV_OUT:=PV_OUT0+PV_OUT1;
TM0:=TIME_TCK();
FLOW0:=PV.value/(UNIT_K*1000);
END_IF;
;
END_FUNCTION_BLOCK