NAME: '7SJ6x' FAMILY: 'FEP_EGY' VERSION: '1.0' AUTHOR: 'AJRR' //KNOW_HOW_PROTECT (*********************************** These function Block was designated for communication with 7SJ61..64 Protection Relay Series. Standar Mapping 3-5 is been used for reception of the Event List, related to the Event Log in the device. Inputs of the FB are outputs of the PLC to the SIPROTEC, and viceversa. IMPORTANT: These block takes in account the standar mapping commands and signals , if you want to eliminate for example a double command and add another, be careful mapping the return signal in the po sition of the return signal of the eliminated command. ************************* It doesn't exist REMOTE mode commanded from the SCADA or the inputs of the Block . THe Local or remote mode is indicated by the Siprotec. The Option available to put REMOTE mode in the Siprotect momentaneously is comma nded by one indication bit in the relay. PROFIBUS Master needs REMOTE Mode activated or enable REMOTE UNLOCKED for sendin g commands. This enables the control via profibus for the Siprotec. The commands via Profibus to the relay can hava a data source from its Digital I nputs or via data from Scada. INPUTS******************* 8 Double indications (Each 2 bit) 12 Trip indications (Each 1 bit) 10 Alarms (Each 1 bit) 6 External signals (Each 1 bit) 4 Internal signals for indicate active group (Each 1 bit) 18 Diagnosis signals (Each 1 bit) 6 Measurement failure (Each 1 bit) 8 Single Indication (Each 1 bit) 15 Measured values (Each 8 bit) 1 Operative hours indication (Each 32 bit) 6 Metered Measurands (Each 32 bit) 1 Control_I for event List (1 Byte. Its analized in the Function Block) 3 Entries of the Event List (Each 80 bits) OUTPUTS****************** 1 Control_O for Event List (1 Byte. This is not a Interface Input of the Block , the programmed logic of the block enables the getting procedure for Event List) 8 Double Commands (each 2 bits) 4 Internal Commands for setting groups (each 2 bits) 12 Simple Commands (each 2 bits) ************************************) { S7_tasklist:='OB100'; S7_m_c:='true'; S7_blockview:='big' } VAR_INPUT LIOP_SEL {S7_dynamic:='true';S7_visible:='false'} : BOOL := FALSE; // 0=C mds from HMI ; 1=Cmds from Inputs of the Block L_REMOTE {S7_dynamic:='true';S7_visible:='true'} : BOOL := FALSE; // Ena ble Remote Unlocked Mode L_CABLELING {S7_dynamic:='true';S7_visible:='true'} : BOOL := FALSE; // Ena ble Commands since DInput of the PLC IN_ST_ADDRESS {S7_dynamic:='true';S7_visible:='true'} : WORD := W#16#100; //I nitial direction for input OUT_ST_ADDRESS {S7_dynamic:='true';S7_visible:='true'} : WORD := W#16#100; //I nitial direction for output CYCLE_TIME {S7_dynamic:='true';S7_visible:='false'} : TIME := T#25ms; //Tim e cycle of the Profibus Network CMD_SENDER {S7_m_c:='true';S7_visible:='true'}: BOOL := FALSE; //Tru e=Scada sends commands to Siprotec SAMPLE_T {S7_sampletime:='true';S7_link:='false'} : REAL := 0.0; // Sampl e Time KVn {S7_link:='false';S7_visible:='true'} : REAL := 11.0; //No minal Voltage In {S7_link:='false';S7_visible:='true'} : REAL := 500.0; //No minal Current
// Message blocks MSG_EVID { S7_visible :='false'; S7_link :='false'; S7_param :='false'; S7_server :='alarm_archiv'; S7_a_type :='alarm_8p'}: DWORD :=0; //---Double commands DC_0 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_1 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_2 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_3 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_4 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_5 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_6 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; DC_7 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; //---Internal Commands (They can be treated as simple commands) INT_0 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; INT_1 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; INT_2 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; INT_3 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := TRUE; //0=DC/SP without fee dback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; //---Simple commands SC_0 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_1 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_2 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_3 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_4 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_5 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_6 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_7 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_8 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_9 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_10 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; SC_11 {S7_dynamic := 'true'; S7_visible := 'true'; S7_m_c := 'true'}: STRUCT OFF: BOOL := FALSE; ON: BOOL := FALSE; PULSE:BOOL := FALSE; //0=Constant Output; 1=PulseOutput TYPES:BOOL := FALSE; //0=DC/SP without fe edback;1=DC with DP feedback D_TIME:TIME := T#25ms; //Time of the pulse F_TIME:TIME := T#30ms; //Time waiting for t he feedback (DC Commands) END_STRUCT; END_VAR VAR_IN_OUT OP_DWCmd0 {S7_m_c := 'true';S7_visible := 'false'} : DWORD :=DW#16#0; //F or general commands OP_DWCmd1 {S7_m_c := 'true';S7_visible := 'false'} : DWORD :=DW#16#0; //0 to 3 double commands 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 s tate byte-wise QabState AT QDWState : ARRAY [0..31] OF BOOL; QDWCmd0 {S7_dynamic:='true'; S7_m_c:='true' ; S7_visible:='false'}: DWORD :=DW#16#0; //Cmd State to enable each command QByCmd0 AT QDWCmd0 : ARRAY [0..3] OF BYTE; // Look at comand to bit wise QbCmd0 AT QDWCmd0 : ARRAY [0..31] OF BOOL; QDWCmd1 {S7_dynamic:='true'; S7_m_c:='true' ; S7_visible:='false'}: DWORD :=DW#16#0; //Cmd State to enable each command QByCmd1 AT QDWCmd1 : ARRAY [0..3] OF BYTE; // Look at comand to bit wise QbCmd1 AT QDWCmd1 : ARRAY [0..31] OF BOOL; IN_DATAS {S7_visible := 'false'}: STRUCT //Data to be available in SC ADA // Type Description BYTE_0: BYTE := B#16#0; BYTE_1: BYTE := B#16#0; BYTE_2: BYTE := B#16#0; BYTE_3: BYTE := B#16#0; BYTE_4: BYTE := B#16#0; BYTE_5: BYTE := B#16#0; BYTE_6: BYTE := B#16#0; BYTE_7: BYTE := B#16#0; BYTE_8: BYTE := B#16#0; BYTE_9: BYTE := B#16#0; MES0: INT; MES1: INT; MES2: INT; MES3 : INT; MES4: INT; MES5: INT; MES6: INT; MES7 : INT; MES8: INT; MES9: INT; MES10: INT; MES1 1: INT; MES12: INT; MES13: INT; MES14: INT;
CONTROL_I: BYTE; SPARE: BYTE; MESS1: STRUCT IDEN: BYTE; VALUE: BYTE; MSEC: WORD; //0..59999 miliseconds HOURS: BYTE; // MINUTES: BYTE; // MONTH: BYTE; DAY: BYTE; CLOCK_STATUS: BYTE; YEAR: BYTE; END_STRUCT; MESS2: STRUCT IDEN: BYTE; VALUE: BYTE; MSEC: WORD; //0..59999 miliseconds HOURS: BYTE; // MINUTES: BYTE; // MONTH: BYTE; DAY: BYTE; CLOCK_STATUS: BYTE; YEAR: BYTE; END_STRUCT; MESS3: STRUCT IDEN: BYTE; VALUE: BYTE; MSEC: WORD; //0..59999 miliseconds HOURS: BYTE; // MINUTES: BYTE; // MONTH: BYTE; DAY: BYTE; CLOCK_STATUS: BYTE; YEAR: BYTE; END_STRUCT; END_STRUCT; OUT_DATAS {S7_visible := 'false'}: STRUCT //Data of Siprotec to be available in SCADA CONTROL_O: BYTE; SPARE: BYTE; BYTE2: BYTE; BYTE3: BYTE; BYTE4: BYTE; BYTE5: BYTE; BYTE6: BYTE; BYTE7: BYTE; END_STRUCT; //-----------Visible outputs for WinCC of EVENT LIST------------------- IDEN0{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE0{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP0{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN1{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE1{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP1{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN2{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE2{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP2{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN3{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE3{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP3{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN4{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE4{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP4{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN5{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE5{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP5{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN6{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE6{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP6{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN7{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE7{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP7{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN8{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE8{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP8{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN9{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE9{S7_m_c:='true';S7_visibl e:='false'}:BYTE; TIMESTAMP9{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN10{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE10{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP10{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN11{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE11{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP11{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN12{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE12{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP12{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN13{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE13{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP13{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN14{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE14{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP14{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN15{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE15{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP15{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN16{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE16{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP16{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN17{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE17{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP17{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN18{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE18{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP18{S7_m_c:='true';S7_visible:='false'}:STRING[21]; IDEN19{S7_m_c:='true';S7_visible:='false'}:BYTE; VALUE19{S7_m_c:='true';S7_visib le:='false'}:BYTE; TIMESTAMP19{S7_m_c:='true';S7_visible:='false'}:STRING[21]; //-----------To visible inputs for the WinCC--------------------------- IN_DATAB0{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE0 AT IN_DATAB0: ARRAY [0..7] OF BOOL; IN_DATAB1{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE1 AT IN_DATAB1: ARRAY [0..7] OF BOOL; IN_DATAB2{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE2 AT IN_DATAB2: ARRAY [0..7] OF BOOL; IN_DATAB3{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE3 AT IN_DATAB3: ARRAY [0..7] OF BOOL; IN_DATAB4{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE4 AT IN_DATAB4: ARRAY [0..7] OF BOOL; IN_DATAB5{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE5 AT IN_DATAB5: ARRAY [0..7] OF BOOL; IN_DATAB6{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE6 AT IN_DATAB6: ARRAY [0..7] OF BOOL; IN_DATAB7{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE7 AT IN_DATAB7: ARRAY [0..7] OF BOOL; IN_DATAB8{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE8 AT IN_DATAB8: ARRAY [0..7] OF BOOL; IN_DATAB9{S7_m_c:='true';S7_visible:='false'}: BYTE; IN_DATABYTE9 AT IN_DATAB9: ARRAY [0..7] OF BOOL; //-----------------Visible Measurements and Metered Values for WinCC------------ -------------- MEAS0 {S7_m_c:='true';S7_visible:='true';S7_archive:='shortterm';S7_unit:='A'}: REAL; MEAS1 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_unit :='A'}: REAL; MEAS2 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_unit:='A'}: REAL; MEAS3 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_unit :='A'}: REAL; MEAS4 {S7_m_c:='true';S7_visible:='true';S7_archive:='shortterm';S7_unit:='V'}: REAL; MEAS5 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_uni t:='V'}: REAL; MEAS6 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_unit:='V'}: REAL; MEAS7 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_uni t:='V'}: REAL; MEAS8 {S7_m_c:='true';S7_visible:='true';S7_archive:='shortterm';S7_unit:='MW'}: REAL; MEAS9 {S7_m_c:='true';S7_visible:='true';S7_archive:='shortterm';S7_unit :='VAr'}: REAL; MEAS10 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_unit:='VA' }: REAL; MEAS11 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7 _unit:='Hz'}: REAL; MEAS12 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm';S7_unit:='Fp' }: REAL; MEAS13 {S7_m_c:='true';S7_visible:='false';S7_unit:='nn'}: REAL; MEAS14 {S7_m_c:='true';S7_visible:='false';S7_unit:='nn'}: REAL; METER0 {S7_m_c:='true';S7_visible:='false'}: REAL; METER1 {S7_m_c:='true';S7_vi sible:='false'}: REAL; METER2 {S7_m_c:='true';S7_visible:='false'}: REAL; METER3 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm'}: REAL; METE R4 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm'}: REAL; METER5 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm'}: REAL; METER6 {S7_m_c:='true';S7_visible:='false';S7_archive:='shortterm'}: REAL; QHRS_DOWN {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; //Counts the effective HOURs Down QMINS {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; QSECS {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; //QMILIS {S7_visible:='true';S7_m_c := 'true'} : INT := 0; QREMOTE {S7_dynamic:='true';S7_visible := 'true'} : BOOL := FALSE; // 0=Local 1=Remote QSCADA {S7_dynamic:='true';S7_visible := 'false'} : BOOL := FALSE; // 0=Interface 1=SCADA QTRIP {S7_dynamic:='true';S7_m_c := 'true'} : BOOL := FALSE; // 0=No trip 1=TRIP Indication QPICKUP {S7_dynamic:='true';S7_m_c := 'true'} : BOOL := FALSE; // 0=No trip 1=PICKUP Indication QOPEN {S7_dynamic:='true';S7_m_c := 'true'} : BOOL := FALSE; // 1=Opened QCLOSE {S7_dynamic:='true';S7_m_c := 'true'} : BOOL := FALSE; // 1=Closed QMOTON {S7_visible:='false';S7_m_c := 'true'} : BOOL := FALSE; // 1=Motor is ON QMOTOFF {S7_visible:='false';S7_m_c := 'true'} : BOOL := FALSE; // 1=Motor is OFF QDS_CON {S7_visible:='false';S7_m_c := 'true'} : BOOL := FALSE; // 1=Discon Switch is CONNECTED QDS_DISCON {S7_visible:='false';S7_m_c := 'true'} : BOOL := FALSE; // 1=Discon Switch is DISCONNECTED //-----Added 15/01/2014-------- QHRS_UP {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /Counts the effective Hours Up QHRSUP_0 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /Last data of UP hours QHRSUP_1 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /2nd Last data of UP hours QHRSDWN_0 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /Last data of DOWN hours QMINS_0 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /Last data of DOWN minutes QSECS_0 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /Last data of DOWN seconds QHRSDWN_1 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /2nd Last data of DOWN hours QMINS_1 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /2nd Last data of DOWN minutes QSECS_1 {S7_visible:='true';S7_m_c := 'true'} : REAL := 0.0; / /2nd Last data of DOWN seconds Q0_DWNDT {S7_visible := 'true'} : DATE_AND_TIME; / /Last DT moment of the OPEN event Q0_DWNSTRING {S7_m_c := 'true'} : STRING[21]; / /Last DT moment of the OPEN event Q1_DWNDT {S7_visible := 'true'} : DATE_AND_TIME; / /2nd Last DT moment of the OPEN event Q1_DWNSTRING {S7_m_c := 'true'} : STRING[21]; / /Last DT moment of the OPEN event Q0_UPDT {S7_visible := 'true'} : DATE_AND_TIME; / /Last DT moment of the CLOSE event Q0_UPSTRING {S7_m_c := 'true'} : STRING[21]; / /Last DT moment of the OPEN event Q1_UPDT {S7_visible := 'true'} : DATE_AND_TIME; / /2nd Last DT moment of the CLOSE event Q1_UPSTRING {S7_m_c := 'true'} : STRING[21]; / /Last DT moment of the OPEN event QDATA_UP {S7_visible:='true';S7_m_c := 'true'} : BOOL; // Data of DT and duration of CLOSE (UP) state is Available QDATA_DWN {S7_visible:='true';S7_m_c := 'true'} : BOOL; // Data of DT and duration of OPEN (DOWN) state is Available QDATA_EVLIST{S7_visible:='true';S7_m_c := 'true'} : BOOL; //-------Time UP------------- //QMILIS2 {S7_visible:='true';S7_m_c := 'true'}: INT := 0; //QSECS2 {S7_visible:='true';S7_m_c := 'true'}: INT := 0; //QMINS2 {S7_visible:='true';S7_m_c := 'true'}: INT := 0; END_VAR VAR OP_DWCmd0C : DWORD :=DW#16#0; //For general commands OP_ByCmd0 AT OP_DWCmd0C : ARRAY [0..3] OF BYTE; OP_DWCmd1C : DWORD :=DW#16#0; //0 to 3 double commands OP_ByCmd1 AT OP_DWCmd1C : ARRAY [0..3] OF BYTE; QDWCmdPLC0: DWORD := DW#16#0; QByCmdPLC0 AT QDWCmdPLC0: ARRAY [0..3] OF BYTE; QbCmdPLC0 AT QDWCmdPLC0: ARRAY [0..31] OF BOOL; QDWCmdPLC1: DWORD := DW#16#0; QByCmdPLC1 AT QDWCmdPLC1: ARRAY [0..3] OF BYTE; QbCmdPLC1 AT QDWCmdPLC1: ARRAY [0..31] OF BOOL; REGISTER_SGN : ARRAY [0..19] OF STRUCT //EVENT LIST IDEN: BYTE; VALUE: BYTE; //For b#01=SP: b#01=Incom ing b#0=Outgoing //TYPES: BOOL; //For b#10=DP: b#10=Incom ing 01=Outgoing ; 00,11 = Intermediate position TIME_STAMP: DT; CLOCK_STATUS: BYTE; END_STRUCT; COUNTER1 : INT := 0; //It function is BLOQUES : INT := 0; //Help to know how many message blocks chang es their content MESSBLOCK_OLD : BYTE; MESSAGES : ARRAY [0..2] OF STRUCT //Help variable to sort message blocks IDEN: BYTE; VALUE: BYTE; MSEC: WORD; //0..59999 miliseconds HOURS: BYTE; // MINUTES: BYTE; // MONTH: BYTE; DAY: BYTE; CLOCK_STATUS: BYTE; YEAR: BYTE; END_STRUCT; A8P: ALARM_8P; DC0: SEND_CMD; DC1: SEND_CMD; DC2: SEND_CMD; DC3: SEND_CMD; DC4: SEND_CMD; DC5: SEND_CMD; DC6: SEND_CMD; DC7: SEND_CMD; INTE0: SEND_CMD; INTE1: SEND_CMD; INTE2: SEND_CMD; INTE3: SEND_CMD; SC0: SEND_CMD; SC1: SEND_CMD; SC2: SEND_CMD; SC3: SEND_CMD; SC4: SEND_CMD; SC5: SEND_CMD; SC6: SEND_CMD; SC7: SEND_CMD; SC8: SEND_CMD; SC9: SEND_CMD; SC10: SEND_CMD; SC11: SEND_CMD; QTRIP_OLD: BOOL; QPICKUP_OLD: BOOL; QOPEN_OLD: BOOL; QCLOSE_OLD: BOOL; QMOTON_OLD: BOOL; QMOTOFF_OLD: BOOL; QDS_DISCON_OLD: BOOL; QDS_CON_OLD: BOOL; //-------Added 15/01/2014---------- HOURS_DWN_CTR : REAL := 0.0; HOURS_UP_CTR : REAL := 0.0; TIMER0 : TOF; TIMER1 : TOF; TIMER2 : TOF; END_VAR VAR_TEMP OUT_DATAB2: BYTE; OUT_DATABYTE2 AT OUT_DATAB2: ARRAY [0..7] OF BOOL; OUT_DATAB3: BYTE; OUT_DATABYTE3 AT OUT_DATAB3: ARRAY [0..7] OF BOOL; OUT_DATAB4: BYTE; OUT_DATABYTE4 AT OUT_DATAB4: ARRAY [0..7] OF BOOL; OUT_DATAB5: BYTE; OUT_DATABYTE5 AT OUT_DATAB5: ARRAY [0..7] OF BOOL; OUT_DATAB6: BYTE; OUT_DATABYTE6 AT OUT_DATAB6: ARRAY [0..7] OF BOOL; OUT_DATAB7: BYTE; OUT_DATABYTE7 AT OUT_DATAB7: ARRAY [0..7] OF BOOL; AUX_DT: DT; //Aux to copy later to Event List TIME S TAMP DTBy AT AUX_DT: STRUCT YEAR: BYTE; MONTH: BYTE; DAY: BYTE; HOUR: BYTE; MINUTE: BYTE; SECOND: BYTE; MSH: BYTE; DAYOFW: BYTE; END_STRUCT; READED_DT: DT; //Aux Var to keep the day of week from S FC1 READEDDTBy AT READED_DT: STRUCT YEAR: BYTE; MONTH: BYTE; DAY: BYTE; HOUR: BYTE; MINUTE: BYTE; SECOND: BYTE; MSH: BYTE; DAYOFW: BYTE; END_STRUCT; 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; CONTROL_I_AUX: BYTE; IDEN_HNIBBLE: BYTE; IDEN_LNIBBLE: BYTE; AUX_TYPES: BYTE; AUX_YEAR: INT; AUX_YEAR1: INT; AUX_SEC: INT; AUX_SEC1: INT; AUX_RETURN: INT; AUXS_HMSEC: WORD; AUX_LMSEC: BYTE; AUX_ALARMS : ARRAY [0..7] OF BOOL; QDWAux : DWORD; QByAux AT QDWAux : ARRAY [0..3] OF BYTE; DWAlm : DWORD; ByAlm AT DWAlm: ARRAY [0..3] OF BYTE; bAlm AT DWAlm: ARRAY [0..31] OF BOOL; //------Added 15/01/2014------------- RETURNS0: ARRAY [0..3] OF INT; END_VAR (******************************************************************************* *************) BEGIN iRet := SFC6 (TOP_SI:= TOP_SI, START_UP_SI:= START_UP_SI); IF (TOP_SI.NUM = 35) THEN
//-----Copy of the OPWCmd data from Scada to a Static variable ---------- OP_DWCmd0C := OP_DWCmd0; OP_DWCmd1C := OP_DWCmd1; //---- To manage per bit in the function block logic -------- QByCmdPLC0[0] := OP_ByCmd0[3]; QByCmdPLC0[1] := OP_ByCmd0[2]; QByCmdPLC0[2] := OP_ByCmd0[1]; QByCmdPLC0[3] := OP_ByCmd0[0]; QByCmdPLC1[0] := OP_ByCmd1[3]; QByCmdPLC1[1] := OP_ByCmd1[2]; QByCmdPLC1[2] := OP_ByCmd1[1]; QByCmdPLC1[3] := OP_ByCmd1[0]; //DATA READ FROM THE INPUTS ======================================== DP_PIPQ(INI_ADDRESS := IN_ST_ADDRESS,OUT_ADDRESS := OUT_ST_ADDRESS,DATA_SRC_OUTS := OUT_DATAS,EN_INPUTS:=TRUE,EN_OUTPUTS:=FALSE,NUM_INS:=100,NUM_OUTS :=8,DATA_DE S_INPUTS:=IN_DATAS); // VOID
// COPY OF THE INPUTS =============================================== //This copy is made to hace the inputs at bit-wise. IN_DATAB0 := IN_DATAS.BYTE_0; IN_DATAB1 := IN_DATAS.BYTE_1; IN_DATAB2 := IN_DATAS.BYTE_2; IN_DATAB3 := IN_DATAS.BYTE_3; IN_DATAB4 := IN_DATAS.BYTE_4; IN_DATAB5 := IN_DATAS.BYTE_5; IN_DATAB6 := IN_DATAS.BYTE_6; IN_DATAB7 := IN_DATAS.BYTE_7; IN_DATAB8 := IN_DATAS.BYTE_8; IN_DATAB9 := IN_DATAS.BYTE_9; // SCADA / CABLELING Operation ========================================= //IF (L_CABLELING AND LIOP_SEL) OR (QbCmdPLC1[2] AND NOT LIOP_SEL) THEN // QSCADA := FALSE; //ELSIF (NOT L_CABLELING AND LIOP_SEL) OR (QbCmdPLC1[3] AND NOT LIOP_SEL) TH EN // QSCADA := TRUE; //END_IF; QSCADA := TRUE; (* // COMMAND SEND - DOUBLE COMMAND 0 ======================================== IF (DC_0.ON AND QSCADA) OR (QbCmdPLC0[25] AND QSCADA) THEN QbCmd0[25] := TRUE; ELSE QbCmd0[25] := FALSE; END_IF; IF (DC_0.OFF AND QSCADA) OR (QbCmdPLC0[24] AND QSCADA) THEN QbCmd0[24] := TRUE; ELSE QbCmd0[24] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 1 ======================================== IF (DC_1.ON AND QSCADA) OR (QbCmdPLC0[27] AND QSCADA) THEN QbCmd0[27] := TRUE; ELSE QbCmd0[27] := FALSE; END_IF; IF (DC_1.OFF AND QSCADA) OR (QbCmdPLC0[26] AND QSCADA) THEN QbCmd0[26] := TRUE; ELSE QbCmd0[26] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 2 ======================================== IF (DC_2.ON AND QSCADA) OR (QbCmdPLC0[29] AND QSCADA) THEN QbCmd0[29] := TRUE; ELSE QbCmd0[29] := FALSE; END_IF; IF (DC_2.OFF AND QSCADA) OR (QbCmdPLC0[28] AND QSCADA) THEN QbCmd0[28] := TRUE; ELSE QbCmd0[28] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 3 ======================================== IF (DC_3.ON AND QSCADA) OR (QbCmdPLC0[31] AND QSCADA) THEN QbCmd0[31] := TRUE; ELSE QbCmd0[31] := FALSE; END_IF; IF (DC_3.OFF AND QSCADA) OR (QbCmdPLC0[30] AND QSCADA) THEN QbCmd0[30] := TRUE; ELSE QbCmd0[30] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 4 ======================================== IF (DC_4.ON AND QSCADA) OR (QbCmdPLC0[17] AND QSCADA) THEN QbCmd0[17] := TRUE; ELSE QbCmd0[17] := FALSE; END_IF; IF (DC_4.OFF AND QSCADA) OR (QbCmdPLC0[16] AND QSCADA) THEN QbCmd0[16] := TRUE; ELSE QbCmd0[16] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 5 ======================================== IF (DC_5.ON AND QSCADA) OR (QbCmdPLC0[19] AND QSCADA) THEN QbCmd0[19] := TRUE; ELSE QbCmd0[19] := FALSE; END_IF; IF (DC_5.OFF AND QSCADA) OR (QbCmdPLC0[18] AND QSCADA) THEN QbCmd0[18] := TRUE; ELSE QbCmd0[18] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 6 ======================================== IF (DC_6.ON AND QSCADA) OR (QbCmdPLC0[21] AND QSCADA) THEN QbCmd0[21] := TRUE; ELSE QbCmd0[21] := FALSE; END_IF; IF (DC_6.OFF AND QSCADA) OR (QbCmdPLC0[20] AND QSCADA) THEN QbCmd0[20] := TRUE; ELSE QbCmd0[20] := FALSE; END_IF; // COMMAND SEND - DOUBLE COMMAND 7 ======================================== IF (DC_7.ON AND QSCADA) OR (QbCmdPLC0[23] AND QSCADA) THEN QbCmd0[23] := TRUE; ELSE QbCmd0[23] := FALSE; END_IF; IF (DC_7.OFF AND QSCADA) OR (QbCmdPLC0[22] AND QSCADA) THEN QbCmd0[22] := TRUE; ELSE QbCmd0[22] := FALSE; END_IF; // COMMAND SEND - INTERNAL COMMAND 0 ======================================== IF (INT_0.ON AND QSCADA) OR (QbCmdPLC0[9] AND QSCADA) THEN QbCmd0[9] := TRUE; ELSE QbCmd0[9] := FALSE; END_IF; IF (INT_0.OFF AND QSCADA) OR (QbCmdPLC0[8] AND QSCADA) THEN QbCmd0[8] := TRUE; ELSE QbCmd0[8] := FALSE; END_IF; // COMMAND SEND - INTERNAL COMMAND 1 ======================================== IF (INT_1.ON AND QSCADA) OR (QbCmdPLC0[11] AND QSCADA) THEN QbCmd0[11] := TRUE; ELSE QbCmd0[11] := FALSE; END_IF; IF (INT_1.OFF AND QSCADA) OR (QbCmdPLC0[10] AND QSCADA) THEN QbCmd0[10] := TRUE; ELSE QbCmd0[10] := FALSE; END_IF; // COMMAND SEND - INTERNAL COMMAND 2 ======================================== IF (INT_2.ON AND QSCADA) OR (QbCmdPLC0[13] AND QSCADA) THEN QbCmd0[13] := TRUE; ELSE QbCmd0[13] := FALSE; END_IF; IF (INT_2.OFF AND QSCADA) OR (QbCmdPLC0[12] AND QSCADA) THEN QbCmd0[12] := TRUE; ELSE QbCmd0[12] := FALSE; END_IF; // COMMAND SEND - INTERNAL COMMAND 3 ======================================== IF (INT_3.ON AND QSCADA) OR (QbCmdPLC0[15] AND QSCADA) THEN QbCmd0[15] := TRUE; ELSE QbCmd0[15] := FALSE; END_IF; IF (INT_3.OFF AND QSCADA) OR (QbCmdPLC0[14] AND QSCADA) THEN QbCmd0[14] := TRUE; ELSE QbCmd0[14] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 0 ======================================== IF (SC_0.ON AND QSCADA) OR (QbCmdPLC0[1] AND QSCADA) THEN QbCmd0[1] := TRUE; ELSE QbCmd0[1] := FALSE; END_IF; IF (SC_0.OFF AND QSCADA) OR (QbCmdPLC0[0] AND QSCADA) THEN QbCmd0[0] := TRUE; ELSE QbCmd0[0] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 1 ======================================== IF (SC_1.ON AND QSCADA) OR (QbCmdPLC0[3] AND QSCADA) THEN QbCmd0[3] := TRUE; ELSE QbCmd0[3] := FALSE; END_IF; IF (SC_1.OFF AND QSCADA) OR (QbCmdPLC0[2] AND QSCADA) THEN QbCmd0[2] := TRUE; ELSE QbCmd0[2] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 2 ======================================== IF (SC_2.ON AND QSCADA) OR (QbCmdPLC0[5] AND QSCADA) THEN QbCmd0[5] := TRUE; ELSE QbCmd0[5] := FALSE; END_IF; IF (SC_2.OFF AND QSCADA) OR (QbCmdPLC0[4] AND QSCADA) THEN QbCmd0[4] := TRUE; ELSE QbCmd0[4] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 3 ======================================== IF (SC_3.ON AND QSCADA) OR (QbCmdPLC0[7] AND QSCADA) THEN QbCmd0[7] := TRUE; ELSE QbCmd0[7] := FALSE; END_IF; IF (SC_3.OFF AND QSCADA) OR (QbCmdPLC0[6] AND QSCADA) THEN QbCmd0[6] := TRUE; ELSE QbCmd0[6] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 4 ======================================== IF (SC_4.ON AND QSCADA) OR (QbCmdPLC1[25] AND QSCADA) THEN QbCmd1[25] := TRUE; ELSE QbCmd1[25] := FALSE; END_IF; IF (SC_4.OFF AND QSCADA) OR (QbCmdPLC1[24] AND QSCADA) THEN QbCmd1[24] := TRUE; ELSE QbCmd1[24] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 5 ======================================== IF (SC_5.ON AND QSCADA) OR (QbCmdPLC1[27] AND QSCADA) THEN QbCmd1[27] := TRUE; ELSE QbCmd1[27] := FALSE; END_IF; IF (SC_5.OFF AND QSCADA) OR (QbCmdPLC1[26] AND QSCADA) THEN QbCmd1[26] := TRUE; ELSE QbCmd1[26] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 6 ======================================== IF (SC_6.ON AND QSCADA) OR (QbCmdPLC1[29] AND QSCADA) THEN QbCmd1[29] := TRUE; ELSE QbCmd1[29] := FALSE; END_IF; IF (SC_6.OFF AND QSCADA) OR (QbCmdPLC1[28] AND QSCADA) THEN QbCmd1[28] := TRUE; ELSE QbCmd1[28] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 7 ======================================== IF (SC_7.ON AND QSCADA) OR (QbCmdPLC1[31] AND QSCADA) THEN QbCmd1[31] := TRUE; ELSE QbCmd1[31] := FALSE; END_IF; IF (SC_7.OFF AND QSCADA) OR (QbCmdPLC1[30] AND QSCADA) THEN QbCmd1[30] := TRUE; ELSE QbCmd1[30] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 8 ======================================== IF (SC_8.ON AND QSCADA) OR (QbCmdPLC1[17] AND QSCADA) THEN QbCmd1[17] := TRUE; ELSE QbCmd1[17] := FALSE; END_IF; IF (SC_8.OFF AND QSCADA) OR (QbCmdPLC1[16] AND QSCADA) THEN QbCmd1[16] := TRUE; ELSE QbCmd1[16] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 9 ======================================== IF (SC_9.ON AND QSCADA) OR (QbCmdPLC1[19] AND QSCADA) THEN QbCmd1[19] := TRUE; ELSE QbCmd1[19] := FALSE; END_IF; IF (SC_9.OFF AND QSCADA) OR (QbCmdPLC1[18] AND QSCADA) THEN QbCmd1[18] := TRUE; ELSE QbCmd1[18] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 10 ======================================== IF (SC_10.ON AND QSCADA) OR (QbCmdPLC1[21] AND QSCADA) THEN QbCmd1[21] := TRUE; ELSE QbCmd1[21] := FALSE; END_IF; IF (SC_10.OFF AND QSCADA) OR (QbCmdPLC1[20] AND QSCADA) THEN QbCmd1[20] := TRUE; ELSE QbCmd1[20] := FALSE; END_IF; // COMMAND SEND - SINGLE COMMAND 11 ======================================== IF (SC_11.ON AND QSCADA) OR (QbCmdPLC1[23] AND QSCADA) THEN QbCmd1[23] := TRUE; ELSE QbCmd1[23] := FALSE; END_IF; IF (SC_11.OFF AND QSCADA) OR (QbCmdPLC1[22] AND QSCADA) THEN QbCmd1[22] := TRUE; ELSE QbCmd1[22] := FALSE; END_IF; (************************* COMMAND PULSE OR CONSTANT *************************** ***) DC0(IN_OFF:=QbCmd0[24],IN_ON:=QbCmd0[25],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_0. D_TIME,FEDS_OFF:=IN_DATABYTE0[0],FEDS_ON:=IN_DATABYTE0[1],FED_TIME:=DC_0.F_TIME) ; OUT_DATABYTE2[1] := DC0.Q_ON; OUT_DATABYTE2[0] := DC0.Q_OFF; DC1(IN_OFF:=QbCmd0[26],IN_ON:=QbCmd0[27],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_1. D_TIME,FEDS_OFF:=IN_DATABYTE0[2],FEDS_ON:=IN_DATABYTE0[3],FED_TIME:=DC_1.F_TIME) ; OUT_DATABYTE2[3] := DC1.Q_ON; OUT_DATABYTE2[2] := DC1.Q_OFF; DC2(IN_OFF:=QbCmd0[28],IN_ON:=QbCmd0[29],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_2. D_TIME,FEDS_OFF:=IN_DATABYTE0[4],FEDS_ON:=IN_DATABYTE0[5],FED_TIME:=DC_2.F_TIME) ; OUT_DATABYTE2[5] := DC2.Q_ON; OUT_DATABYTE2[4] := DC2.Q_OFF; DC3(IN_OFF:=QbCmd0[30],IN_ON:=QbCmd0[31],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_3. D_TIME,FEDS_OFF:=IN_DATABYTE0[6],FEDS_ON:=IN_DATABYTE0[7],FED_TIME:=DC_3.F_TIME) ; OUT_DATABYTE2[7] := DC3.Q_ON; OUT_DATABYTE2[6] := DC3.Q_OFF; DC4(IN_OFF:=QbCmd0[16],IN_ON:=QbCmd0[17],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_4. D_TIME,FEDS_OFF:=IN_DATABYTE1[0],FEDS_ON:=IN_DATABYTE1[1],FED_TIME:=DC_4.F_TIME) ; OUT_DATABYTE3[1] := DC4.Q_ON; OUT_DATABYTE3[0] := DC4.Q_OFF; DC5(IN_OFF:=QbCmd0[18],IN_ON:=QbCmd0[19],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_5. D_TIME,FEDS_OFF:=IN_DATABYTE1[2],FEDS_ON:=IN_DATABYTE1[3],FED_TIME:=DC_5.F_TIME) ; OUT_DATABYTE3[3] := DC5.Q_ON; OUT_DATABYTE3[2] := DC5.Q_OFF; DC6(IN_OFF:=QbCmd0[20],IN_ON:=QbCmd0[21],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_6. D_TIME,FEDS_OFF:=IN_DATABYTE1[4],FEDS_ON:=IN_DATABYTE1[5],FED_TIME:=DC_6.F_TIME) ; OUT_DATABYTE3[5] := DC6.Q_ON; OUT_DATABYTE3[4] := DC6.Q_OFF; DC7(IN_OFF:=QbCmd0[22],IN_ON:=QbCmd0[23],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=DC_7. D_TIME,FEDS_OFF:=IN_DATABYTE1[6],FEDS_ON:=IN_DATABYTE1[7],FED_TIME:=DC_7.F_TIME) ; OUT_DATABYTE3[7] := DC7.Q_ON; OUT_DATABYTE3[6] := DC7.Q_OFF; INTE0(IN_OFF:=QbCmd0[8],IN_ON:=QbCmd0[9],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=INT_0 .D_TIME); OUT_DATABYTE4[1] := INTE0.Q_ON; OUT_DATABYTE4[0] := INTE0.Q_OFF; INTE1(IN_OFF:=QbCmd0[10],IN_ON:=QbCmd0[11],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=INT _1.D_TIME); OUT_DATABYTE4[3] := INTE1.Q_ON; OUT_DATABYTE4[2] := INTE1.Q_OFF; INTE2(IN_OFF:=QbCmd0[12],IN_ON:=QbCmd0[13],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=INT _2.D_TIME); OUT_DATABYTE4[5] := INTE2.Q_ON; OUT_DATABYTE4[4] := INTE2.Q_OFF; INTE3(IN_OFF:=QbCmd0[14],IN_ON:=QbCmd0[15],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=INT _3.D_TIME); OUT_DATABYTE4[7] := INTE3.Q_ON; OUT_DATABYTE4[6] := INTE3.Q_OFF; SC0(IN_OFF:=QbCmd0[0],IN_ON:=QbCmd0[1],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_0.D_ TIME); OUT_DATABYTE5[1] := SC0.Q_ON; OUT_DATABYTE5[0] := SC0.Q_OFF; SC1(IN_OFF:=QbCmd0[2],IN_ON:=QbCmd0[3],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_1.D_ TIME); OUT_DATABYTE5[3] := SC1.Q_ON; OUT_DATABYTE5[2] := SC1.Q_OFF; SC2(IN_OFF:=QbCmd0[4],IN_ON:=QbCmd0[5],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_2.D_ TIME); OUT_DATABYTE5[5] := SC2.Q_ON; OUT_DATABYTE5[4] := SC2.Q_OFF; SC3(IN_OFF:=QbCmd0[6],IN_ON:=QbCmd0[7],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_3.D_ TIME); OUT_DATABYTE5[7] := SC3.Q_ON; OUT_DATABYTE5[6] := SC3.Q_OFF; SC4(IN_OFF:=QbCmd1[24],IN_ON:=QbCmd0[25],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_4. D_TIME); OUT_DATABYTE6[1] := SC4.Q_ON; OUT_DATABYTE6[0] := SC4.Q_OFF; SC5(IN_OFF:=QbCmd1[26],IN_ON:=QbCmd0[27],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_5. D_TIME); OUT_DATABYTE6[3] := SC5.Q_ON; OUT_DATABYTE6[2] := SC5.Q_OFF; SC6(IN_OFF:=QbCmd1[28],IN_ON:=QbCmd0[29],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_6. D_TIME); OUT_DATABYTE6[5] := SC6.Q_ON; OUT_DATABYTE6[4] := SC6.Q_OFF; SC7(IN_OFF:=QbCmd1[30],IN_ON:=QbCmd0[31],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_7. D_TIME); OUT_DATABYTE6[7] := SC7.Q_ON; OUT_DATABYTE6[6] := SC7.Q_OFF; SC8(IN_OFF:=QbCmd1[16],IN_ON:=QbCmd0[17],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_8. D_TIME); OUT_DATABYTE7[1] := SC8.Q_ON; OUT_DATABYTE7[0] := SC8.Q_OFF; SC9(IN_OFF:=QbCmd1[18],IN_ON:=QbCmd0[19],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_9. D_TIME); OUT_DATABYTE7[3] := SC9.Q_ON; OUT_DATABYTE7[2] := SC9.Q_OFF; SC10(IN_OFF:=QbCmd1[20],IN_ON:=QbCmd0[21],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_1 0.D_TIME); OUT_DATABYTE7[5] := SC10.Q_ON; OUT_DATABYTE7[4] := SC10.Q_OFF; SC11(IN_OFF:=QbCmd1[22],IN_ON:=QbCmd0[23],PULSE:=FALSE,TYPES:=FALSE,D_TIME:=SC_1 1.D_TIME); OUT_DATABYTE7[7] := SC11.Q_ON; OUT_DATABYTE7[6] := SC11.Q_OFF; *) //------------------- Logic for the Event List verification--------------------- ---------------------------- CONTROL_I_AUX := SHR(IN:=IN_DATAS.CONTROL_I,N:=4); //Ge tting the value of the message number IF (CONTROL_I_AUX <> MESSBLOCK_OLD) AND (CONTROL_I_AUX <> B#16#0) THEN //If there are a change in the value of the message Block
TIMER2.IN := TRUE; //Para indicar llegada de nuevos mensajes
IF (IN_DATAS.MESS1.MONTH <> B#16#0) AND (IN_DATAS.MESS2.MONTH <> B#16#0) AND (IN_DATAS.MESS3.MONTH <> B#16#0) THEN BLOQUES := 2; //Block Messages number-1 END_IF; IF (IN_DATAS.MESS1.MONTH <> B#16#0) AND (IN_DATAS.MESS2.MONTH <> B#16#0) AND (IN_DATAS.MESS3.MONTH = B#16#0) THEN BLOQUES := 1; END_IF; IF (IN_DATAS.MESS1.MONTH <> B#16#0) AND (IN_DATAS.MESS2.MONTH = B#16#0) AND (IN_DATAS.MESS3.MONTH = B#16#0) THEN BLOQUES := 0; END_IF; MESSAGES[0] := IN_DATAS.MESS1; MESSAGES[1] := IN_DATAS.MESS2; MESSAGES[2] := IN_DATAS.MESS3;
//--------- Getting the value of IDEN (Exactly Location of Byte and Bit) --- IDEN_HNIBBLE := (MESSAGES[COUNTER1].IDEN AND B#16#F8); IDEN_LNIBBLE := (MESSAGES[COUNTER1].IDEN AND B#16#07);
REGISTER_SGN[0].IDEN := IDEN_LNIBBLE OR (SHL(IN:=IDEN_HNIBBLE,N:=1)) ; //Indicates Byte and LSb of the signal
//--------- Getting the value of VALUE--- REGISTER_SGN[0].VALUE := MESSAGES[COUNTER1].VALUE;// AND B#16#0F;
//--------- Getting the value of TYPES--- //AUX_TYPES := MESSAGES[COUNTER1].VALUE AND B#16#F0; //AUX_TYPES := SHR(IN:=AUX_TYPES,N:=4);
IF (AUX_YEAR1 <= 89) THEN //For year 1900 to 1 989 AUX_YEAR := 90; //Sends 1990 END_IF; IF (AUX_YEAR1 > 90) AND (AUX_YEAR1 <= 99) THEN //For Year 1990 to 1 999 AUX_YEAR := AUX_YEAR1; //Sends the Year END_IF; IF (AUX_YEAR1 >= 100) THEN //For year 2000 and forward AUX_YEAR := AUX_YEAR1 - 100; //Sends the year END_IF;
//----Detects the DATE AND TIME of the OPEN relay event------ Q1_DWNDT := Q0_DWNDT; Q1_UPDT := Q0_UPDT; RETURNS0[0] := READ_CLK(CDT := Q0_DWNDT);
QHRS_DOWN := 0.0; HOURS_DWN_CTR := 0.0; QMINS := 0.0; QSECS := 0.0; END_IF; IF QOPEN OR QMOTOFF THEN HOURS_DWN_CTR := HOURS_DWN_CTR + SAMPLE_T; //Counts in seconds QSECS := HOURS_DWN_CTR; IF HOURS_DWN_CTR >= 59.0 THEN //Reaches 1 minut QMINS := QMINS + 1.0; HOURS_DWN_CTR := 0.0; END_IF;
IF QMINS >= 59.0 THEN //Reaches 1 hour QHRS_DOWN := QHRS_DOWN + 1.0; QMINS := 0.0; END_IF;
QHRSDWN_0 := QHRS_DOWN; //Show in real time time i n off state elapsed QMINS_0 := QMINS; //Show in real time time i n off state elapsed QSECS_0 := QSECS; //Show in real time time i n off state elapsed END_IF; IF (QOPEN_OLD AND NOT QOPEN) OR (QMOTOFF_OLD AND NOT QMOTOFF) THEN //Relay chang es to CLOSED //QHRSDWN_1 := QHRSDWN_0; //Moves Buffer Downwards //QHRSDWN_0 := QHRS_DOWN; //Get the quantity of hours down TIMER0.IN := TRUE; //Indicates that data is ready for the Ignit ion! ELSE TIMER0.IN := FALSE; END_IF; DT_TO_STRING(DT_IN := Q0_DWNDT,DTString := Q0_DWNSTRING); //Converts DT to STRIN G for WinCC/Ignition! DT_TO_STRING(DT_IN := Q1_DWNDT,DTString := Q1_DWNSTRING); //Converts DT to STRIN G for WinCC/Ignition! //-------------COUNTING HOURS UP (CLOSED)--------------------------------------- ---------- IF (QOPEN_OLD AND NOT QOPEN) OR (QMOTOFF_OLD AND NOT QMOTOFF) THEN //Relay chang es to CLOSED QHRSUP_1 := QHRSUP_0; //Moves Buffer Downwards
//----Detects the DATE AND TIME of the OPEN relay event------ //Q1_UPDT := Q0_UPDT; RETURNS0[0] := READ_CLK(CDT := Q0_UPDT);
QHRS_UP := 0; HOURS_UP_CTR := 0; END_IF; IF NOT QOPEN AND NOT QMOTOFF THEN HOURS_UP_CTR := HOURS_UP_CTR + SAMPLE_T; //Counts in seconds QHRS_UP := HOURS_UP_CTR/60.0; //Establish the time in MINU TES QHRSUP_0 := QHRS_UP; //Show the time elapsed as a real timer END_IF; IF (QOPEN AND NOT QOPEN_OLD) OR (QMOTOFF AND NOT QMOTOFF_OLD) THEN //Relay chang es to OPEN //QHRSUP_1 := QHRSUP_0; //Moves Buffer Downwards //QHRSUP_0 := QHRS_UP; //Get the quantity of hours down TIMER1.IN := TRUE; ELSE TIMER1.IN := FALSE; END_IF; DT_TO_STRING(DT_IN := Q0_UPDT,DTString := Q0_UPSTRING); //Converts DT to STRING for WinCC/Ignition! DT_TO_STRING(DT_IN := Q1_UPDT,DTString := Q1_UPSTRING); //Converts DT to STRING for WinCC/Ignition! //-------- Indicating to IGNITION! the presence of new data ---------------- TIMER0(PT :=T#5S); QDATA_DWN := TIMER0.Q; TIMER1(PT :=T#5S); QDATA_UP := TIMER1.Q; TIMER2(PT :=T#5S); QDATA_EVLIST := TIMER2.Q; //-------- Reinitialization or EDGE detection------------------------------- OP_dwCmd0 := DW#16#0; OP_dwCmd1 := DW#16#0; MESSBLOCK_OLD := CONTROL_I_AUX; QTRIP_OLD := QTRIP; QPICKUP_OLD := QPICKUP; QOPEN_OLD := QOPEN; QCLOSE_OLD := QCLOSE; QMOTON_OLD := QMOTON; QMOTOFF_OLD := QMOTOFF; END_IF; END_FUNCTION_BLOCK