恭喜,你发布的帖子
发布于 2016-05-26 19:32:50
1楼
BEGIN;
//S7300/400以及采用CFC编程方式不同,启动程序不一样,S7300启动运行周期递减为
//启动时减负CPU,不调用AlarmSQ功能块
IF RunUpCyc > 0 THEN
RunUpCyc:=RunUpCyc - 1;
END_IF;
//交换操作双字高低字节
// Change lowbyte to highbyte for HMI command word ==================
OPdwCmdHMI := OP_dwCmd;
OPabyCmdPLC[0] := OPabyCmdHMI[3];
OPabyCmdPLC[1] := OPabyCmdHMI[2];
OPabyCmdPLC[2] := OPabyCmdHMI[1];
OPabyCmdPLC[3] := OPabyCmdHMI[0];
// Begin: Operation functions ***************************************************
//面板选择使能消息复选框
IF (OPabCmdPLC[12] ) THEN
HHA_EN := NOT HHA_EN;
END_IF;
IF (OPabCmdPLC[13] ) THEN
HW_EN := NOT HW_EN;
END_IF;
IF (OPabCmdPLC[14] ) THEN
LW_EN := NOT LW_EN;
END_IF;
IF (OPabCmdPLC[15] ) THEN
LLA_EN := NOT LLA_EN;
END_IF;
//仿真操作
IF OPabCmdPLC[10] THEN
SimOn:= TRUE;
ELSIF OPabCmdPLC[11] THEN
SimOn:= FALSE;
END_IF;
// END: Operation functions *****************************************************
//滞后,按百分比计算
QHys := Hys * (PVHR - PVLR) / 100.0;
//过程值的选择(仿真值/过程值)
IF SimOn THEN
PV_OUT:=SimPV;
ELSE
PV_OUT:=PV;
END_IF;
//零点死区,切除小信号
IF ABS(PV_OUT) <= Deadband THEN
PV_OUT:=0.0 ;
END_IF;
//报警以及警告到达上升沿复位计时器
HHLLA_C:= ((PV_OUT >= HHA) AND HHA_EN ) OR
((PV_OUT <= LLA) AND LLA_EN );
HLW_C := ((PV_OUT >= HW ) AND HW_EN ) OR
((PV_OUT <= LW ) AND LW_EN );
HHLLA_G:= ((PV_OUT < (HHA - QHys)) AND HHA_EN ) OR
((PV_OUT > (LLA + QHys)) AND LLA_EN );
HLW_G := ((PV_OUT < (HW - QHys)) AND HW_EN ) OR
((PV_OUT > (LW + QHys)) AND LW_EN );
IF HHLLA_C AND NOT FP_1 THEN ADCT1:=0.0; END_IF;
IF HLW_C AND NOT FP_2 THEN WDCT1:=0.0; END_IF;
IF HHLLA_G AND NOT FP_3 THEN ADGT1:=0.0; END_IF;
IF HLW_G AND NOT FP_4 THEN WDGT1:=0.0; END_IF;
//高高报警的到达以及离开
IF HHA_EN THEN
IF (PV_OUT >= HHA) AND NOT QHHA AND PULSE AND NOT FP_Pulse THEN
ADCT1:=ADCT1+SAMPLE_T;
IF ADCT1 > ADCT THEN
QHHA := TRUE;
ADCT1:= 0.0;
END_IF;
ELSIF (PV_OUT < (HHA - QHys))AND QHHA AND PULSE AND NOT FP_Pulse THEN
ADGT1:=ADGT1+SAMPLE_T;
IF ADGT1 > ADGT THEN
QHHA := FALSE;
ADGT1:= 0.0;
END_IF;
END_IF;
ELSE
QHHA:=FALSE;
END_IF;
//高警告的到达以及离开
IF HW_EN THEN
IF (PV_OUT >= HW) AND NOT QHW AND PULSE AND NOT FP_Pulse THEN
WDCT1:=WDCT1+SAMPLE_T;
IF WDCT1 > WDCT THEN
QHW := TRUE;
WDCT1:=0.0;
END_IF;
ELSIF (PV_OUT < (HW - QHys))AND QHW AND PULSE AND NOT FP_Pulse THEN
WDGT1:=WDGT1+SAMPLE_T;
IF WDGT1 > WDGT THEN
QHW := FALSE;
WDGT1:=0.0;
END_IF;
END_IF;
ELSE
QHW:=FALSE;
END_IF;
//LW ============================================================
IF LW_EN then
IF (PV_OUT <= LW) AND NOT QLW AND PULSE AND NOT FP_Pulse THEN
WDCT1:=WDCT1+SAMPLE_T;
IF WDCT1 > WDCT THEN
QLW := TRUE;
WDCT1:=0.0;
END_IF;
ELSIF (PV_OUT > (LW + QHys))AND QLW AND PULSE AND NOT FP_Pulse THEN
WDGT1:=WDGT1+SAMPLE_T;
IF WDGT1 > WDGT THEN
QLW := FALSE;
WDGT1:=0.0;
END_IF;
END_IF;
ELSE
QLW:=FALSE;
END_IF;
//LLA ============================================================
IF LLA_EN THEN
IF (PV_OUT <= LLA ) AND NOT QLLA AND PULSE AND NOT FP_Pulse THEN
ADCT1:=ADCT1+SAMPLE_T;
IF ADCT1 > ADCT THEN
QLLA := TRUE;
ADCT1:=0.0;
END_IF;
ELSIF (PV_OUT > (LLA + QHys))AND QLLA AND PULSE AND NOT FP_Pulse THEN
ADGT1:=ADGT1+SAMPLE_T;
IF ADGT1 > ADGT THEN
QLLA := FALSE;
ADGT1:=0.0;
END_IF;
END_IF;
ELSE
QLLA:=FALSE;
END_IF;
//操作按钮的权限控制
QabPermPLC[10] := NOT SimOn ;
QabPermPLC[11] := SimOn ;
QabyPerm[0] :=QabyPermPLC[3];
QabyPerm[1] :=QabyPermPLC[2];
QabyPerm[2] :=QabyPermPLC[1];
QabyPerm[3] :=QabyPermPLC[0];
//状态字
QabStatePLC[0] := QHHA; // H Alarm is active
QabStatePLC[1] := QHW; // H Warning is active
QabStatePLC[2] := QLW; // L Warning is active
QabStatePLC[3] := QLLA; // L Alarm is active
QabStatePLC[4] := 0;
QabStatePLC[5] := 0;
QabStatePLC[6] := 0;
QabStatePLC[7] := 0;
QabStatePLC[8] := 0;
QabStatePLC[9] := 0;
QabStatePLC[10] := 0; // Simulation ON
QabStatePLC[11] := 0;
QabStatePLC[12] := HHA_EN; // 1=H Alarm Message enable
QabStatePLC[13] := HW_EN; // 1=H Warning Message enable
QabStatePLC[14] := LW_EN; // 1=L Warning Message enable
QabStatePLC[15] := LLA_EN; // 1=L Alarm Message enable
QabStatePLC[16] := 0;
QabStatePLC[17] := 0;
QabStatePLC[18] := SimOn;
QabStatePLC[19] := 0;
QabStatePLC[20] := 0;
QabStatePLC[21] := 0;
QabStatePLC[22] := 0;
QabStatePLC[23] := 0;
QabStatePLC[24] := 0;
QabStatePLC[25] := 0;
QabStatePLC[26] := 0;
QabStatePLC[27] := 0;
QabStatePLC[28] := 0;
QabStatePLC[29] := 0;
QabStatePLC[30] := 0;
QabStatePLC[31] := 0;
QabyState[0] :=QabyStatePLC[3];
QabyState[1] :=QabyStatePLC[2];
QabyState[2] :=QabyStatePLC[1];
QabyState[3] :=QabyStatePLC[0];
//报警消息处理
MsgEff1[0]:=QHHA;
MsgEff1[1]:=QHW;
MsgEff1[2]:=QLW;
MsgEff1[3]:=QLLA;
MsgEff1[4]:=FALSE;
MsgEff1[5]:=FALSE;
MsgEff1[6]:=FALSE;
MsgEff1[7]:=FALSE;
IF (RunUpCyc = 0) AND (MsgEffOld<>MsgEff)THEN
IF (MsgEff AND 16#01) <> ( MsgEffOld AND 16#01)THEN
iRet1:= ALARM_SQ(SIG := MsgEff1[0] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID1 // IN: DWORD
,SD :=SD1 // IN: ANY
); // INT
END_IF;
IF (MsgEff AND 16#02) <> ( MsgEffOld AND 16#02) THEN
iRet2:= ALARM_SQ(SIG :=MsgEff1[1] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID2 // IN: DWORD
,SD :=SD2 // IN: ANY
); // INT
END_IF;
IF (MsgEff AND 16#04) <> ( MsgEffOld AND 16#04)THEN
iRet3:= ALARM_SQ(SIG :=MsgEff1[2] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID3 // IN: DWORD
,SD :=SD3 // IN: ANY
); // INT
END_IF;
IF (MsgEff AND 16#08) <> ( MsgEffOld AND 16#08)THEN
iRet4:= ALARM_SQ(SIG :=MsgEff1[3] // IN: BOOL
,ID :=W#16#EEEE // IN: WORD
,EV_ID :=MsgEvID4 // IN: DWORD
,SD :=SD4 // IN: ANY
); // INT
END_IF;
END_IF;
MsgEffOld:=MsgEff ;
//上升沿检测
FP_1 := HHLLA_C;
FP_2 := HLW_C;
FP_3 := HHLLA_G;
FP_4 := HLW_G;
FP_Pulse := Pulse;
//复位操作命令
OP_dwCmd := 16#0;
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主