You are on page 1of 27

FUNCTION_BLOCK Sip7SJx_3_5

//----------- HEADER ------------------------------------


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;

MET0: DINT; MET1: DINT; MET2: DINT; MET3
: DINT;
MET4: DINT; MET5: DINT; MET6: DINT;

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;

FOR COUNTER1 := 0 TO BLOQUES BY 1 DO
//--------- Shifting down the register of Event List---
//REGISTER_SGN[29] := REGISTER_SGN[28];
//REGISTER_SGN[25] := REGISTER_SGN[24]; REGISTER_SGN[26] := REGISTER_S
GN[25]; REGISTER_SGN[27] := REGISTER_SGN[26]; REGISTER_SGN[28] := REGISTER_
SGN[27];
//REGISTER_SGN[21] := REGISTER_SGN[20]; REGISTER_SGN[22] := REGISTER_S
GN[21]; REGISTER_SGN[23] := REGISTER_SGN[22]; REGISTER_SGN[24] := REGISTER_
SGN[23];
REGISTER_SGN[17] := REGISTER_SGN[16]; REGISTER_SGN[18] := REGISTER_SGN
[17]; REGISTER_SGN[19] := REGISTER_SGN[18]; //REGISTER_SGN[20] := REGISTER_
SGN[19];
REGISTER_SGN[13] := REGISTER_SGN[12]; REGISTER_SGN[14] := REGISTER_SGN
[13]; REGISTER_SGN[15] := REGISTER_SGN[14]; REGISTER_SGN[16] := REGISTER_SG
N[15];
REGISTER_SGN[9] := REGISTER_SGN[8]; REGISTER_SGN[10] := REGISTER_SGN
[9]; REGISTER_SGN[11] := REGISTER_SGN[10]; REGISTER_SGN[12] := REGISTER_SG
N[11];
REGISTER_SGN[5] := REGISTER_SGN[4]; REGISTER_SGN[6] := REGISTER_SGN
[5]; REGISTER_SGN[7] := REGISTER_SGN[6]; REGISTER_SGN[8] := REGISTER_SG
N[7];
REGISTER_SGN[1] := REGISTER_SGN[0]; REGISTER_SGN[2] := REGISTER_SGN
[1]; REGISTER_SGN[3] := REGISTER_SGN[2]; REGISTER_SGN[4] := REGISTER_SG
N[3];

//--------- 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_TYPES = B#16#10 THEN
// REGISTER_SGN[0].TYPES := TRUE;
//ELSE
// REGISTER_SGN[0].TYPES := FALSE;
//END_IF;

//--------- Getting the value of TIMESTAMP IN BCD Format ---
DTBy.MONTH := WORD_TO_BYTE(INT_TO_BCD(BYTE_TO_INT(MESSAGES[COUNTER1].M
ONTH)));
DTBy.DAY := WORD_TO_BYTE(INT_TO_BCD(BYTE_TO_INT(MESSAGES[COUNTER1].D
AY)));
DTBy.HOUR := WORD_TO_BYTE(INT_TO_BCD(BYTE_TO_INT(MESSAGES[COUNTER1].H
OURS)));
DTBy.MINUTE := WORD_TO_BYTE(INT_TO_BCD(BYTE_TO_INT(MESSAGES[COUNTER1].M
INUTES)));

AUX_YEAR1 := BYTE_TO_INT(MESSAGES[COUNTER1].YEAR);

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;

DTBy.YEAR := WORD_TO_BYTE(INT_TO_BCD(AUX_YEAR));

AUX_SEC := WORD_TO_INT(MESSAGES[COUNTER1].MSEC)/1000;
DTBy.SECOND := WORD_TO_BYTE(INT_TO_BCD(AUX_SEC));

AUXS_HMSEC := INT_TO_BCD(WORD_TO_INT(MESSAGES[COUNTER1].MSEC) - (AUX_S
EC * 1000));
DTBy.MSH := WORD_TO_BYTE(SHR(IN:=AUXS_HMSEC,N:=4));

AUX_RETURN := READ_CLK(CDT := READED_DT);
AUX_LMSEC := (WORD_TO_BYTE(AUXS_HMSEC AND W#16#000F));
AUX_LMSEC := SHL(IN:=AUX_LMSEC,N:=4);
DTBy.DAYOFW := (AUX_LMSEC OR (READEDDTBy.DAYOFW AND B#16#0F));

REGISTER_SGN[0].TIME_STAMP := AUX_DT; //

//--------- Getting the value of CLOCKSTATUS---
REGISTER_SGN[0].CLOCK_STATUS := MESSAGES[COUNTER1].CLOCK_STATUS; /
/
END_FOR;
OUT_DATAS.CONTROL_O := (IN_DATAS.CONTROL_I AND B#16#F0); //Acknow
ledge to the OUT_CONTROL
ELSE
TIMER2.IN := FALSE;
END_IF;
//------------ ACONDITIONING THE EVENT LIST --------------------------
IDEN0:=REGISTER_SGN[0].IDEN; VALUE0:=REGISTER_SGN[0].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[0].TIME_STAMP,DTString := TIMESTAMP0);
IDEN1:=REGISTER_SGN[1].IDEN; VALUE1:=REGISTER_SGN[1].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[1].TIME_STAMP,DTString := TIMESTAMP1);
IDEN2:=REGISTER_SGN[2].IDEN; VALUE2:=REGISTER_SGN[2].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[2].TIME_STAMP,DTString := TIMESTAMP2);
IDEN3:=REGISTER_SGN[3].IDEN; VALUE3:=REGISTER_SGN[3].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[3].TIME_STAMP,DTString := TIMESTAMP3);
IDEN4:=REGISTER_SGN[4].IDEN; VALUE4:=REGISTER_SGN[4].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[4].TIME_STAMP,DTString := TIMESTAMP4);
IDEN5:=REGISTER_SGN[5].IDEN; VALUE5:=REGISTER_SGN[5].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[5].TIME_STAMP,DTString := TIMESTAMP5);
IDEN6:=REGISTER_SGN[6].IDEN; VALUE6:=REGISTER_SGN[6].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[6].TIME_STAMP,DTString := TIMESTAMP6);
IDEN7:=REGISTER_SGN[7].IDEN; VALUE7:=REGISTER_SGN[7].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[7].TIME_STAMP,DTString := TIMESTAMP7);
IDEN8:=REGISTER_SGN[8].IDEN; VALUE8:=REGISTER_SGN[8].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[8].TIME_STAMP,DTString := TIMESTAMP8);
IDEN9:=REGISTER_SGN[9].IDEN; VALUE9:=REGISTER_SGN[9].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[9].TIME_STAMP,DTString := TIMESTAMP9);
IDEN10:=REGISTER_SGN[10].IDEN; VALUE10:=REGISTER_SGN[10].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[10].TIME_STAMP,DTString := TIMESTAMP10);
IDEN11:=REGISTER_SGN[11].IDEN; VALUE11:=REGISTER_SGN[11].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[11].TIME_STAMP,DTString := TIMESTAMP11);
IDEN12:=REGISTER_SGN[12].IDEN; VALUE12:=REGISTER_SGN[12].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[12].TIME_STAMP,DTString := TIMESTAMP12);
IDEN13:=REGISTER_SGN[13].IDEN; VALUE13:=REGISTER_SGN[13].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[13].TIME_STAMP,DTString := TIMESTAMP13);
IDEN14:=REGISTER_SGN[14].IDEN; VALUE14:=REGISTER_SGN[14].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[14].TIME_STAMP,DTString := TIMESTAMP14);
IDEN15:=REGISTER_SGN[15].IDEN; VALUE15:=REGISTER_SGN[15].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[15].TIME_STAMP,DTString := TIMESTAMP15);
IDEN16:=REGISTER_SGN[16].IDEN; VALUE16:=REGISTER_SGN[16].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[16].TIME_STAMP,DTString := TIMESTAMP16);
IDEN17:=REGISTER_SGN[17].IDEN; VALUE17:=REGISTER_SGN[17].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[17].TIME_STAMP,DTString := TIMESTAMP17);
IDEN18:=REGISTER_SGN[18].IDEN; VALUE18:=REGISTER_SGN[18].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[18].TIME_STAMP,DTString := TIMESTAMP18);
IDEN19:=REGISTER_SGN[19].IDEN; VALUE19:=REGISTER_SGN[19].VALUE; DT_TO_STRING(DT
_IN := REGISTER_SGN[19].TIME_STAMP,DTString := TIMESTAMP19);
//------------- CONDITIONING METERED VALUES --------------------------------
MEAS0 := INT_TO_REAL(IN_DATAS.MES0)/10.0; MEAS1 := INT_TO_REAL(IN_DATAS.MES1)/1
0.0; MEAS2 := INT_TO_REAL(IN_DATAS.MES2)/10.0; MEAS3 := INT_TO_REAL(IN_DATAS.M
ES3)/10.0; MEAS4 := INT_TO_REAL(IN_DATAS.MES4)/100.0;
MEAS5 := INT_TO_REAL(IN_DATAS.MES5)/100.0; MEAS6 := INT_TO_REAL(IN_DATAS.MES6)/
100.0; MEAS7 := INT_TO_REAL(IN_DATAS.MES7)/100.0; MEAS8 := INT_TO_REAL(IN_DATA
S.MES8)/100.0; MEAS9 := INT_TO_REAL(IN_DATAS.MES9)/100.0;
MEAS10:= INT_TO_REAL(IN_DATAS.MES10)/100.0; MEAS11 := INT_TO_REAL(IN_DATAS.MES11
)/100.0; MEAS12 := INT_TO_REAL(IN_DATAS.MES12)/10000.0; MEAS13 := INT_TO_REAL(IN
_DATAS.MES13)/10.0; MEAS14 := INT_TO_REAL(IN_DATAS.MES14)/10.0;
//MEAS0 := IN_DATAS.MES0; MEAS1 := IN_DATAS.MES1; MEAS2 := IN_DATAS.MES2; MEA
S3 := IN_DATAS.MES3; MEAS4 := IN_DATAS.MES4;
//MEAS5 := IN_DATAS.MES5; MEAS6 := IN_DATAS.MES6; MEAS7 := IN_DATAS.MES7; MEA
S8 := IN_DATAS.MES8; MEAS9 := IN_DATAS.MES9;
//MEAS10:= IN_DATAS.MES10; MEAS11 := IN_DATAS.MES11; MEAS12 := IN_DATAS.MES12; M
EAS13 := IN_DATAS.MES13; MEAS14 := IN_DATAS.MES14;
METER0 := DINT_TO_REAL(IN_DATAS.MET0);
METER1 := DINT_TO_REAL(IN_DATAS.MET1);
METER2 := DINT_TO_REAL(IN_DATAS.MET2);
METER3 := ((DINT_TO_REAL(IN_DATAS.MET3)/60000.0)*KVn*In*1.73205)/1000.0; //Pa
ra que muestre el dato en MWh...
METER4 := ((DINT_TO_REAL(IN_DATAS.MET4)/60000.0)*KVn*In*1.73205)/1000.0;
METER5 := ((DINT_TO_REAL(IN_DATAS.MET5)/60000.0)*KVn*In*1.73205)/1000.0;
METER6 := ((DINT_TO_REAL(IN_DATAS.MET6)/60000.0)*KVn*In*1.73205)/1000.0;
//------------ IDENTIFY THE TRIP, OPEN, CLOSE, COMMAND ---------------------
QTRIP := IN_DATABYTE6[6];
QPICKUP := IN_DATABYTE6[5];
QOPEN := IN_DATABYTE9[1] OR (IN_DATABYTE1[1] AND NOT IN_DATABYTE1[0]);
QCLOSE := IN_DATABYTE9[0] OR (NOT IN_DATABYTE1[1] AND IN_DATABYTE1[0]);
QMOTON := IN_DATABYTE9[5];
QMOTOFF := IN_DATABYTE9[4];
QDS_CON := IN_DATABYTE1[3] AND NOT IN_DATABYTE1[2];
QDS_DISCON := NOT IN_DATABYTE1[3] AND IN_DATABYTE1[2];
//------------- SEND DATA TO THE OUTPUTS -----------------------------------
OUT_DATAS.BYTE2 := OUT_DATAB2; OUT_DATAS.BYTE3 := OUT_DATAB3;
OUT_DATAS.BYTE4 := OUT_DATAB4; OUT_DATAS.BYTE5 := OUT_DATAB5;
OUT_DATAS.BYTE6 := OUT_DATAB6; OUT_DATAS.BYTE7 := OUT_DATAB7;
DP_PIPQ(INI_ADDRESS := IN_ST_ADDRESS,OUT_ADDRESS := OUT_ST_ADDRESS,DATA_SRC_OUTS
:= OUT_DATAS,EN_INPUTS:=FALSE,EN_OUTPUTS:=TRUE,NUM_INS:=100,NUM_OUTS :=8,DATA_DE
S_INPUTS:=IN_DATAS); // VOID
//-------- Event and states of the Siprotec---------------------------------
A8P( EN_R :=TRUE
,SIG_1 :=QTRIP AND NOT QTRIP_OLD
,SIG_2 :=QPICKUP AND NOT QPICKUP_OLD
,SIG_3 :=QOPEN AND NOT QOPEN_OLD
,SIG_4 :=QCLOSE AND NOT QCLOSE_OLD
,SIG_5 :=QMOTON AND NOT QMOTON_OLD
,SIG_6 :=QMOTOFF AND NOT QMOTOFF_OLD
,SIG_7 :=QDS_CON
,SIG_8 :=QDS_DISCON
,ID := W#16#EEEE
,EV_ID := MSG_EVID
,SEVERITY := W#16#40
);
//-------Values for the QDWState-----------------------------------
bAlm [0] := QTRIP; bAlm [8] := FALSE; bAlm [16] := FALSE;
bAlm [24] := FALSE;
bAlm [1] := QPICKUP; bAlm [9] := FALSE; bAlm [17] := FALSE;
bAlm [25] := FALSE;
bAlm [2] := QOPEN; bAlm [10] := FALSE; bAlm [18] := FALSE;
bAlm [26] := FALSE;
bAlm [3] := QCLOSE; bAlm [11] := FALSE; bAlm [19] := FALSE;
bAlm [27] := FALSE;
bAlm [4] := QMOTON; bAlm [12] := FALSE; bAlm [20] := FALSE;
bAlm [28] := FALSE;
bAlm [5] := QMOTOFF; bAlm [13] := FALSE; bAlm [21] := FALSE;
bAlm [29] := FALSE;
bAlm [6] := QDS_CON; bAlm [14] := FALSE; bAlm [22] := FALSE;
bAlm [30] := FALSE;
bAlm [7] := QDS_DISCON; bAlm [15] := FALSE; bAlm [23] := FALSE;
bAlm [31] := FALSE;
QByAux[3] := ByAlm [0];
QByAux[2] := ByAlm [1];
QByAux[1] := ByAlm [2];
QByAux[0] := ByAlm [3];
QDWState := QDWAux;
//-------- COUNTING HOURS DOWN (OPENED)-----------------------------------------
---------
IF (QOPEN AND NOT QOPEN_OLD) OR (QMOTOFF AND NOT QMOTOFF_OLD) THEN //Relay chang
es to OPENED
QHRSDWN_1 := QHRSDWN_0; //Moves Buffer Downwards of Hours down
QMINS_1 := QMINS_0;
QSECS_1 := QSECS_0;

//----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

You might also like