发一个以前做项目用SCL编写的阀门块。
FUNCTION_BLOCK Z_VALVE_300//FB530
NAME:VALVE
FAMILY:WR
AUTHOR:ZYG
//VERSION:'0.1'
//FB 530
//date:2014/5/28
// Typical-Attribute
{
S7_tasklist:='OB100';
S7_m_c:='true';
S7_blockview:='big'
}
// Parameterattribute
// S7_visible sichtbar/unsichtbar (default='true')
// S7_m_c WinCC - Tag (default='false')
// S7_dynamic Testmodus (default='false')
VAR_INPUT
AUTO {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
MAN {S7_dynamic:='true'} : BOOL := FALSE; // External Error
LOCAL {S7_dynamic:='true'} : BOOL := FALSE; // 0=DCS 1=LocalLinking
M_OPEN {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Manual
A_OPEN {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Automatic
L_OPEN {S7_dynamic:='true'} : BOOL := FALSE; //
M_CLOSE {S7_dynamic:='true'} : BOOL := FALSE; // 1=Reset Error Peripherie
A_CLOSE {S7_dynamic:='true'} : BOOL := FALSE; //
L_CLOSE {S7_dynamic:='true'} : BOOL := FALSE; //
RESET {S7_dynamic:='true'} : BOOL := FALSE; //
FB_OPEN {S7_dynamic:='true'} : BOOL := FALSE; // Feedback VALVE open
FB_CLOSE {S7_dynamic:='true'} : BOOL := TRUE; // Feedback VALVE close
L_MON {S7_dynamic:='true'} : BOOL := TRUE; // 1=Monitoring Feedback OPEN
MON_T {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 10.0; // Monitoring Time
L_SIM {S7_dynamic:='true'} : BOOL := FALSE; // 0=Normal 1=Simulation
//LOCK {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
IL_LIM {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
IL_ABS {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
//ERR_EXTERN {S7_dynamic:='true'} : BOOL := FALSE; // External Error
//LIOP_SEL {S7_dynamic:='true'} : BOOL := FALSE; // 0=Operator 1=Linking
// L_AUT {S7_dynamic:='true'} : BOOL := FALSE; // 0=Manual 1=Automatic
//L_REMOTE {S7_dynamic:='true'} : BOOL := FALSE; // 0=Lokal 1=Remote
//L_SIM {S7_dynamic:='true'} : BOOL := FALSE; // 0=Normal 1=Simulation
//L_RESET {S7_dynamic:='true'} : BOOL := FALSE; // 1=Reset Error Peripherie
//AUT_OP {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Automatic
//MAN_OP {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Manual
//SIM_OP {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Simulation
//FB_OPEN {S7_dynamic:='true'} : BOOL := FALSE; // Feedback VALVE open
//FB_CLOSE {S7_dynamic:='true'} : BOOL := TRUE; // Feedback VALVE close
//L_MON {S7_dynamic:='true'} : BOOL := TRUE; // 1=Monitoring Feedback OPEN
//MON_T {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 10.0; // Monitoring Time
SAMPLE_T {S7_sampletime:='true'} : REAL := 0.1; // Sample Time
END_VAR
VAR_OUTPUT
QdwState {S7_dynamic:='true'; S7_m_c:='true'}: DWORD:=0; // status wincc
QabyState AT QdwState : ARRAY [0..3] OF BYTE; // look at state byte-wise
QwState {S7_dynamic:='true'}: WORD:= 0; //0=close, 1=opening, 2=open, 3=closing
Q_AUTO {S7_dynamic:='true'} : BOOL := FALSE; // 1=Automatic
Q_MAN {S7_dynamic:='true'} : BOOL := FALSE; // 1=Man
Q_LOCAL {S7_dynamic:='true'} : BOOL := FALSE; // 1=LOCAL
QCMD_OPEN {S7_dynamic:='true'} : BOOL := FALSE; // 0=Close 1=Open
QERR_OPEN {S7_dynamic:='true'} : BOOL := FALSE; // 1=ERR
QERR_CLOSE {S7_dynamic:='true'} : BOOL := FALSE; // 1=ERR
QMON {S7_dynamic:='true'} : BOOL := FALSE; // 1=Monitoring Feedback
QMON_ERR {S7_dynamic:='true'} : BOOL := FALSE; // 1=Monitoring Error
QMON_T1 {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 0.0; // Current Monitoring Time Feedback
QMON_T2 {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 0.0; // Current Monitoring Time Feedback
// QSIM {S7_dynamic:='true'} : BOOL := FALSE; // 1=Simulaition is active
QCLOSE {S7_dynamic:='true'} : BOOL := FALSE; // 1=Closed
QOPENING {S7_dynamic:='true'} : BOOL := FALSE; // 1=Opening
QOPEN {S7_dynamic:='true'} : BOOL := FALSE; // 1=Open
QCLOSING {S7_dynamic:='true'} : BOOL := FALSE; // 1=Closing
QLOCK {S7_dynamic:='true'} : BOOL := FALSE; // 1=Lock is active
// QERR {S7_dynamic:='true'} : BOOL := FALSE; // 1=ERROR
// QERR_EXT {S7_dynamic:='true'} : BOOL := FALSE; // 1=External ERROR
// QwAlarm {S7_dynamic:='true'; S7_m_c := 'true'} : WORD := 16#0; // Bit Alarm Procedure
// QabyAlarm AT QwAlarm : ARRAY [0..1] OF BYTE; // look at QwAlarm byte-wise
END_VAR
VAR_IN_OUT
OP_dwCmd {S7_dynamic := 'true'; S7_m_c := 'true'} : DWORD :=0; // control word wincc
END_VAR
VAR
OPdwCmdHMI : DWORD := 16#0; // Operator Commands in HMI format
OPabyCmdHMI AT OPdwCmdHMI : ARRAY [0..3] OF BYTE; // look at HMI command byte-wise
OPdwCmdPLC : DWORD := 16#0; // Operator Commands in PLC format
OPabyCmdPLC AT OPdwCmdPLC : ARRAY [0..3] OF BYTE; // look at plc command byte-wise
OPabCmdPLC AT OPdwCmdPLC : ARRAY [0..31] OF BOOL; // look at plc command bit-wise
QdwStatePLC : DWORD := 16#0; // State word in PLC format
QabyStatePLC AT QdwStatePLC : ARRAY [0..3] OF BYTE; // look at state byte-wise
QabStatePLC AT QdwStatePLC : ARRAY [0..31] OF BOOL; // look at state bit-wise
QwAlarmPLC : WORD := 16#0; // Alarm Tag PLC Format
QabyAlarmPLC AT QwAlarmPLC : ARRAY [0..1] OF BYTE; // look at Alarm byte-wise
QabAlarmPLC AT QwAlarmPLC : ARRAY [0..15] OF BOOL; // look at Alarm bit-wise
// TAGS for Operation?
OP_RESET : BOOL := FALSE;
// TAGS for Edge detect
AUTO_OLD : BOOL := FALSE;
MAN_OLD : BOOL := FALSE;
SR1_Q : BOOL :=FALSE;
//阀门开关定义变量
M_OPEN_OLD : BOOL := FALSE;
M_CLOSE_OLD : BOOL := FALSE;
RS2_Q : BOOL :=FALSE;
RS2_S : BOOL :=FALSE;
RS2_R : BOOL :=FALSE;
FB_OPEN_TMP:BOOL:=FALSE;
FB_CLOSE_TMP:BOOL:=FALSE;
TON1_EN : BOOL :=FALSE;
TON2_EN : BOOL :=FALSE;
FB_OPEN_RS_Q:BOOL:=FALSE;
FB_CLOSE_RS_Q:BOOL:=FALSE;
L_RESET_OLD : BOOL := FALSE;
AUT_OP_OLD : BOOL := FALSE;
MAN_OP_OLD : BOOL := FALSE;
QOPENING_OLD : BOOL := FALSE;
QCLOSING_OLD : BOOL := FALSE;
// TAGS for Simulation
FB_SIM_OPEN : BOOL := FALSE;
FB_SIM_CLOSE : BOOL := TRUE;
SIM_T : REAL := 5.0;
QCMD_SIM : BOOL := FALSE;
QREMOTE : BOOL := FALSE; // 0=Local 1=Remote
END_VAR
VAR_TEMP
TOP_SI: STRUCT
EV_CLASS : BYTE;
EV_NUM : BYTE;
PRIORITY : BYTE;
NUM : BYTE;
TYP2_3 : BYTE;
TYP1 : BYTE;
ZI1 : WORD;
ZI2_3 : DWORD;
END_STRUCT;
START_UP_SI: STRUCT
EV_CLASS : BYTE;
EV_NUM : BYTE;
PRIORITY : BYTE;
NUM : BYTE;
TYP2_3 : BYTE;
TYP1 : BYTE;
ZI1 : WORD;
ZI2_3 : DWORD;
END_STRUCT;
iRet : INT;
END_VAR
BEGIN
// START UP =====================================================================
iRet := SFC6 (TOP_SI:= TOP_SI, START_UP_SI:= START_UP_SI);
IF (TOP_SI.NUM = 100) THEN
QCMD_OPEN := FALSE;
QCLOSE := TRUE;
QOPENING := FALSE;
QOPEN := FALSE;
QCLOSING := FALSE;
QwState := 0;
iRet := 0;
END_IF;
// END STARTUP ==================================================================
// HMI发来的命令字节高低为转换==============
OPdwCmdHMI := OP_dwCmd;
OPabyCmdPLC[0] := OPabyCmdHMI[3];
OPabyCmdPLC[1] := OPabyCmdHMI[2];
OPabyCmdPLC[2] := OPabyCmdHMI[1];
OPabyCmdPLC[3] := OPabyCmdHMI[0];
//手动、自动、Local处理
IF (MAN AND NOT MAN_OLD) OR OPabCmdPLC[16] THEN
SR1_Q:=FALSE;
END_IF;
IF (AUTO AND NOT AUTO_OLD) OR OPabCmdPLC[17] THEN
SR1_Q:=TRUE;
END_IF;
Q_LOCAL:=LOCAL; //1=LOCAL,0=DCS;
Q_AUTO:=SR1_Q AND (NOT LOCAL); //1=自动
Q_MAN:=(NOT SR1_Q) AND (NOT LOCAL); //1=手动
//阀门打开或关闭处理======================================================
RS2_S:=(Q_MAN AND M_OPEN AND NOT M_OPEN_OLD) //手动状态且手动输入为上升沿
OR (Q_AUTO AND A_OPEN) //自动状态下自动输入
OR (LOCAL AND L_OPEN) //Local状态且L_open输入
OR (Q_MAN AND OPabCmdPLC[1]); //HMI打开
RS2_R:=(Q_MAN AND M_CLOSE AND NOT M_CLOSE_OLD)
OR (Q_AUTO AND A_CLOSE)
OR (Q_AUTO AND IL_LIM)
OR (LOCAL AND L_CLOSE)
OR IL_ABS
//OR RESET
OR (Q_MAN AND OPabCmdPLC[0]); //HMI关闭
IF RS2_S AND NOT RS2_R THEN
RS2_Q:=TRUE;
END_IF;
IF RS2_R THEN
RS2_Q:=FALSE;
END_IF;
QCMD_OPEN:=RS2_Q ; //阀门开输出命令
//-----------------------------------------------------------------
FB_OPEN_TMP:=(FB_OPEN AND NOT L_SIM) OR (QCMD_OPEN AND L_SIM);
FB_CLOSE_TMP:=(FB_CLOSE AND NOT L_SIM) OR (QCMD_OPEN AND L_SIM);
TON1_EN:=(NOT FB_OPEN_TMP OR FB_CLOSE_TMP) AND QCMD_OPEN ;
TON2_EN:=(FB_OPEN_TMP OR NOT FB_CLOSE_TMP) AND NOT QCMD_OPEN ;
IF TON1_EN THEN // *** Process Mode ****
IF QMON_T1 < MON_T THEN
QMON_T1 := QMON_T1 + SAMPLE_T;
END_IF;
ELSE
QMON_T1 :=0.0;
END_IF;
IF (QMON_T1 >= MON_T)AND NOT (RESET OR OPabCmdPLC[7])THEN
FB_OPEN_RS_Q := TRUE;
ELSE
FB_OPEN_RS_Q := FALSE;
END_IF;
IF TON2_EN THEN // *** Process Mode ****
IF QMON_T2 < MON_T THEN
QMON_T2 := QMON_T2 + SAMPLE_T;
END_IF;
ELSE
QMON_T2 :=0.0;
END_IF;
IF (QMON_T2 >= MON_T)AND NOT (RESET OR OPabCmdPLC[7])THEN
FB_CLOSE_RS_Q := TRUE;
ELSE
FB_CLOSE_RS_Q := FALSE;
END_IF;
QERR_OPEN:=FB_OPEN_RS_Q;
QERR_CLOSE:=FB_CLOSE_RS_Q;
QMON_ERR:=QERR_OPEN OR QERR_CLOSE;
//=================================
// QwState
//0 = Close
//1 = Opening
//2 = Open
//3 = Closing
//=================================
//--------------------------
//QwState = 0; CLOSE
//--------------------------
IF (NOT QCMD_OPEN AND QwState=3 AND NOT QMON_ERR AND FB_CLOSE)
// OR (NOT QCMD_OPEN AND QwState=3 AND NOT QMON)
THEN
QCLOSE := TRUE;
QOPENING := FALSE;
QOPEN := FALSE;
QCLOSING := FALSE;
QwState := 0;
END_IF;
//--------------------------
//QwState = 1; OPENING
//--------------------------
IF (QCMD_OPEN AND (QwState = 0 OR QwState = 3)) THEN
QCLOSE := FALSE;
QOPENING := TRUE;
QOPEN := FALSE;
QCLOSING := FALSE;
QwState := 1;
END_IF;
//--------------------------
//QwState = 2; OPEN
//--------------------------
IF
(QCMD_OPEN AND QwState=1 AND NOT QMON_ERR AND FB_OPEN)
//OR (QCMD_OPEN AND QwState=1 AND NOT QMON)
THEN
QCLOSE := FALSE;
QOPENING := FALSE;
QOPEN := TRUE;
QCLOSING := FALSE;
QwState := 2;
END_IF;
//--------------------------
//QwState = 3; CLOSING
//--------------------------
IF (NOT QCMD_OPEN AND (QwState = 1 OR QwState = 2)) THEN
QCLOSE := FALSE;
QOPENING := FALSE;
QOPEN := FALSE;
QCLOSING := TRUE;
QwState := 3;
END_IF;
QLOCK:=IL_LIM OR IL_ABS;
// Set State for HMI ===================================================
QabStatePLC[0] := QCLOSE; // 1=Close
QabStatePLC[1] := QOPENING; // 1=Opening
QabStatePLC[2] := QOPEN; // 1=Open
QabStatePLC[3] := QCLOSING; // 1=Closing
QabStatePLC[4] := 0;
QabStatePLC[5] := 0;
QabStatePLC[6] := 0;
QabStatePLC[7] := 0;
QabStatePLC[8] := 1;//QMON; // 1=Feedback Monitoring ON
QabStatePLC[9] := QMON_ERR; // 1=Error Feedback Monitoring
QabStatePLC[10] := 0;
QabStatePLC[11] := 0;
QabStatePLC[12] := 0;
QabStatePLC[13] := 0;
QabStatePLC[14] := 0;
QabStatePLC[15] := 0;
QabStatePLC[16] := Q_AUTO; // 0=Manual 1=Automatic
QabStatePLC[17] := NOT LOCAL;//QREMOTE; // 0=Local 1=Remote
QabStatePLC[18] := L_SIM; // 0=Process 1=Simulation
QabStatePLC[19] := 0;
QabStatePLC[20] := 0;
QabStatePLC[21] := 0;
QabStatePLC[22] := 0;
QabStatePLC[23] := 0;
QabStatePLC[24] := QMON_ERR; // 1=Error
QabStatePLC[25] := 0;//QERR_EXT; // 1=External Error
QabStatePLC[26] := QLOCK; // 1=Block Locked
QabStatePLC[27] := QLOCK; // 1=INTERLOCK
QabStatePLC[28] := FB_OPEN; //阀门开到位
QabStatePLC[29] := FB_close; //阀门关到位
QabStatePLC[30] := 0;
QabStatePLC[31] := 0;
QabyState[0] :=QabyStatePLC[3];
QabyState[1] :=QabyStatePLC[2];
QabyState[2] :=QabyStatePLC[1];
QabyState[3] :=QabyStatePLC[0];
// TAGS for Edge detect==========================================
AUTO_OLD := AUTO;
MAN_OLD := MAN;
M_OPEN_OLD:=M_OPEN;
M_CLOSE_OLD:=M_CLOSE;
//reset commands ================================================
OP_dwCmd := 16#0;
END_FUNCTION_BLOCK