当前位置:文档之家› SCL结构化编程语言编写(C语言)的PLC滤波程序

SCL结构化编程语言编写(C语言)的PLC滤波程序

// @(#) $Header:: L:/PCS7/PCS7LibV51.SW/TechBlocks/VCS/Algorithm/meas_mon.csv$
//Copyright (C) Siemens AG 1995. All Rights Reserved. Confidential
// PCS 7 Library Vx.x
// Function: Meas.value monitoring block
// Label Version 3.0
// Macro Version :V0.92

FUNCTION_BLOCK fb1
TITLE = 'Meas.value monitoring block'
//
{
S7_tasklist:= 'OB100';
S7_alarm_ui:= '1';
S7_m_c:= 'true'
}
AUTHOR: TECHN61
NAME: MEAS_MON
VERSION: '3.0'
FAMILY: CONTROL
KNOW_HOW_PROTECT
VAR_INPUT
HI_LIM {S7_m_c:='true'} : REAL := 300.0; //High Limt
LO_LIM {S7_m_c:='true'} : REAL := 0.0; //Low Limt
PVIN {S7_m_c:='true'} : INT := 0; // Analog Input (激光液位计)
vpv_in:INT:=0; //Analog Input (气动阀位反馈)
motor_vpv_in: INT :=0; //Analog Input(电动阀位反馈)
END_VAR

VAR_OUTPUT
IV{S7_m_c:='true'} : REAL; // PV OUTPUT (0~100)
PV{S7_m_c:='true'} : REAL ; // PV OUTPUT (LO_LIM~HI_LIM)
vpv_out:REAL:=0.0; //气动阀位反馈output
motor_vpv_out:REAL:=0.0; //电动阀位反馈output
block_en:BOOL:=0; //程序执行结束
END_VAR

CONST
ArrayNo:=30; //NO of Filtering Array
END_CONST
// Static Variables
VAR
DATA:ARRAY[1..ArrayNo+2] OF INT;// Static Variables
INDEX:INT :=1;
MAXValue:INT :=0;
MINValue:INT :=0;
Total:REAL :=0;
END_VAR
// Temporary Variables
VAR_TEMP
temp1:INT;//save last value
PVtemp:INT;
n:INT;
K1:REAL;
K2:REAL;
END_VAR
BEGIN
//Filtering
MAXValue:=0;
MINValue:=32767;
temp1:=DATA[INDEX];
DATA[INDEX]:=PVIN;
FOR n:=1 TO ArrayNo+2 BY 1 DO
IF (DATA[n] >= MAXValue) THEN
MAXValue := DATA[n]; //求最大值
END_IF;

IF (DATA[n] <= MINValue) THEN
MINValue := DATA[n] ; //求最小值
END_IF;
END_FOR;
Total := Total+DATA[INDEX]-temp1;
PVtemp := REAL_TO_INT((Total-MAXValue-MINValue)/ArrayNo);//剔除最大值、最小值

INDEX := INDEX+1;
IF (INDEX > (ArrayNO+2)) THEN
INDEX:=1;
END_IF;
//**************************************************//

//***************************************************//
//The Scale function takes an integer value(IN) and converts it to a real value in engineering unit scaled between a low and a high limit
// (LO_LIM and HI_LIM).The result is written in OUT.
K1:=0.0;
K2:=32767.0;
IF (PVtemp > K2) THEN
PV:=HI_LIM;
IV:=100.0;
ELSIF (PVtemp < K1) THEN
PV:=LO_LIM;
IV:=0.0;
ELSE
PV:=(PVtemp-K1)*(HI_LIM-LO_LIM)/(K2-K1)+LO_LIM;
IV:=(PVtemp-K1)*100.0/(K2-K1);
END_IF;
//*****************************************************//
IF (vpv_in > K2) THEN
vpv_out:=100.0;
ELSIF (vpv_in < K1) THEN
vpv_out:=0.0;
ELSE
vpv_out:=(vpv_in-K1)*(100.0-0.0)/(K2-K1)+0.0;
END_IF;
IF (motor_vpv_in > K2) THEN
mo

tor_vpv_out:=100.0;
ELSIF (motor_vpv_in < K1) THEN
motor_vpv_out:=0.0;
ELSE
motor_vpv_out:=(motor_vpv_in-K1)*(100.0-0.0)/(K2-K1)+0.0;
END_IF;
block_en:=1;
END_FUNCTION_BLOCK



相关主题
文本预览
相关文档 最新文档