//=============================================================================
// New Hoop Check program with inputs.
// With this function max. 5 devices can be switched on by checking the operating hours.
// There are several inputs used to signalize the status of the device, ....
//=============================================================================
//This subroutine will check the selected couples of devices for availability.
//At this state the check includes locked status, manual status, alarm condition,
//switching and hours of the selected devices.
//used bits:
//M xxx.6 -hoop lock
//FC225
FUNCTION "HoopCheck" : VOID
TITLE =Hours of Operation Checker
KNOW_HOW_PROTECT
AUTHOR :RRRbyMB
FAMILY :OH_Ch
NAME :HoopCheck
VERSION :1.0
VAR_INPUT
Activ :INT; // How many devices to check
Active1 :BOOL; // "One" if device is used for OH optimization, "Zero" if not
AutoRdy1 :BOOL; // Auto Ready for Device#1
Running1 :BOOL; // Running signal for Device#1
Hours1 :DINT; // Operating hours for Device#1
Active2 :BOOL; // "One" if device is used for OH optimization, "Zero" if not
AutoRdy2 :BOOL; // Auto Ready for Device#2
Running2 :BOOL; // Running signal for Device#2
Hours2 :DINT; // Operating hours for Device#2
END_VAR
VAR_IN_OUT
DevOn1 :BOOL; // On signal for Device#1
DevOn2 :BOOL; // On signal for Device#2
END_VAR
VAR_TEMP
DeviceNo :WORD;
DeviceMode :BYTE;
MaxDevice :BYTE;
RunDevice :BYTE;
LoopCounter :BYTE;
InLoopCounter :BYTE;
OutLoopCounter :BYTE;
Index :WORD;
DeviceStop :BOOL;
END_VAR
BEGIN
NETWORK
L "DataDB";
T Index;
AUF DB [Index];
L 0; // +++ init array
T LD 210; // LW210-LW237 operating hours device 1-7
T LD 214;
T LD 218;
T LD 222;
T LD 226;
T LD 230;
T LD 234;
T LD 238;
T LD 242;
T LD 246;
T LD 250;
T LW 252;
L #Activ;
T LW 252;
// min. 2 devices to check
U(;
L 1;
L #Activ;
<=I;
)
SPB LFIL;
// 2 devices
U(;
L 2;
L #Activ;
==I;
)
SPBN DEV3;
L #Hours1;
T LD 210;
L 1;
T LW 214;
L #Hours2;
T LD 216;
L 2;
T LW 220;
SPA LFIL;
// 3 devices
DEV3: U(;
L 3;
L #Activ;
==I;
)
SPBN DEV4;
L #Hours1;
T LD 210;
L #Hours2;
T LD 216;
SPA LFIL;
// 4 devices
DEV4: U(;
L 4;
L #Activ;
==I;
)
SPBN DEV5;
L #Hours1;
T LD 210;
L #Hours2;
T LD 216;
SPA LFIL;
// 5 devices
DEV5: U(;
L 5;
L #Activ;
==I;
)
SPBN DEV6;
L #Hours1;
T LD 210;
L #Hours2;
T LD 216;
SPA LFIL;
// 6 devices
DEV6: U(;
L 6;
L #Activ;
==I;
)
SPBN DEV6;
L #Hours1;
T LD 210;
L #Hours2;
T LD 216;
SPA LFIL;
// 7 devices
DEV7: U(;
L 7;
L #Activ;
==I;
)
SPBN LFIL;
L #Hours1;
T LD 210;
L #Hours2;
T LD 216;
SPA LFIL;
// --------------------------------
LFIL:L #Activ; // +++ max aggregate
T #MaxDevice;
// --------------------------------
MEND:L MaxDevice; // max aggregate counter
L 1;
<=I ;
BEB ;
L 0; // +++ check auto/alarm
T RunDevice; // running counter
L MaxDevice;
T LoopCounter;
// Device 1 Check
LCH1:UN #Running1; // Running signal for Device#1
SPB NOR1;
L RunDevice;
INC 1; // running counter
T RunDevice;
L 2147483640; // running
NOR1:U #AutoRdy1 // Auto Ready for Device#1
U DBX 12.7;
SPB NOA1;
L 2147483641; // AutoReady
NOA1:UN #Active1 // "One" if device is used for OH optimization, "Zero" if not
SPB NON1;
L 2147483642; // Not Active
NON1:T LD 210; // hours
// Device 2 Check
LCH2:UN #Running2; // Running signal for Device#1
SPB NOR2;
L RunDevice;
INC 1; // running counter
T RunDevice;
L 2147483640; // running
NOR2:U #AutoRdy2 // Auto Ready for Device#1
U DBX 12.7;
SPB NOA2;
L 2147483641; // AutoReady
NOA2:UN #Active2 // "One" if device is used for OH optimization, "Zero" if not
SPB NON2;
L 2147483642; // Not Active
NON2:T LD 216; // hours
// --------------------------------
L MaxDevice; // +++ sort array
DEC 1;
T OutLoopCounter;
OLOP:L MaxDevice; // +++ outer loop
DEC 1;
T InLoopCounter; // inner loop counter
LAR1 P#204.0; // start -4 (== 1 step)
TAR1 AR2; // hour pointer == array pointer
+AR2 P#6.0; // hour pointer (next place)
ILOP:L 0; // +++ inner loop
L InLoopCounter;
>=I;
SPB IEND;
DEC 1;
T InLoopCounter; // inner loop counter
+AR1 P#6.0;
+AR2 P#6.0;
L LD [AR1, P#0.0]; // pointer
L LD [AR2, P#0.0]; // pointer +1
<=D ;
SPB ILOP;
L LD [AR1,P#0.0]; // +++ change array Operating Hours
L LD [AR2,P#0.0];
T LD [AR1,P#0.0];
TAK;
T LD [AR2,P#0.0];
L LW [AR1,P#4.0]; // +++ change array ID No
L LW [AR2,P#4.0];
T LW [AR1,P#4.0];
TAK;
T LW [AR2,P#4.0];
SPA ILOP;
IEND:L OutLoopCounter; // outer loop counter
DEC 1;
T OutLoopCounter;
L 0;
L OutLoopCounter;
<I;
SPB OLOP;
// --------------------------------
CBEF: LAR1 P#214.0; // +++ lock/unlock aggregate
L LW 252; // active
L RunDevice;
==I; // active = running
L 0;
SPB LLOI;
L 1;
LLOI:T DeviceMode;
L 1; // init loop counter
T LoopCounter;
LLOC:L LoopCounter;
L DeviceMode; // activ aggregate
<=I;
SPB RES;
U(;
LW [AR1,P#0.0];
L 1;
==I;
);
SPBN MOT2;
U "One";
S #DevOn1; // On signal for Device#1
SPA COM;
MOT2: U(;
LW [AR1,P#0.0];
L 2;
==I;
);
SPBN COM;
U "One";
S #DevOn2; // On signal for Device#2
SPA COM;
RES:U(;
LW [AR1,P#0.0];
L 1;
==I;
);
SPB MO12;
U "One";
R #DevOn1; // On signal for Device#1
SPA COM;
MO12: U(;
LW [AR1,P#0.0];
L 2;
==I;
);
SPB COM;
U "One";
R #DevOn2;
COM:+AR1 P#6.0; // inc pointer array
L LoopCounter;
INC 1;
T LoopCounter;
L MaxDevice;
<=I;
SPB LLOC;
END_FUNCTION