Issue
Implementing a pre-entry access card anti-passback using Plain English program
Product Line
Andover Continuum
Environment
- Continuum Net Controller II
- Continuum ACX 2 Controller
- Continuum ACX 4 Controller
Cause
The anti-passback implementation in Continuum engages when the credential holder enters the area as detected by the door switch/contact. (if no door switch is configured, then the credential holder is considered to have entered the area immediately after access has been granted by the system)
When doors are located in close proximity to each other, as is the case with a bank of turnstiles, for example, the built-in anti-passback scheme is easily defeated as a cardholder is able to unlock multiple nearby turnstiles before triggering the door contact and engaging the built-in anti-passback functionality.
Resolution
The simplest solution to the issue described above is to configure the door objects WITHOUT a door switch/contact, this, however, is not always possible depending on on-site requirements.
A second solution is to take control of the doors using Plain English.
The solution presented here is for a bank of three turnstiles, (A, B, and C), it uses a PE program per turnstile. The solution can easily be adapted for a bank of less or more turnstiles.
NOTE:
The PE programming here is provided as a sample, for guideline purposes only, the programs are not intended as a complete solution, significant modifications may be required for site deployment.
Program code for door/turnstile A
'This program implements a pre-entry antipassback strategy to prevent a credentail holder
'from granting access at multiple access points (i.e turnstiles) that are physically located in close proximity to each other.
'| |
' __/-\_______/-\_______/-\___
' | |
' | Main Lobby |
' | Turnstiles |
' | |
' |_____X______X______X______ |
' ^ ^ ^
' A B C
'OPERATION
'Upon detecting a Valid Attempt at say turnstile A, the program will deny access to the card used at turnstiles B and C
'until one of following two conditions takes place:
'1-The person attempting access goes thru turnstile A as detected by the door contact. (this activates the regular
' built-in antipassback functionality if engaged)
'2-The door strike time at turnstile A expires, and the system re-locks turnstile A
'
'Each turnstile requires its own program, the programs will be identical except for the 'initialization line which specifies which objects the program uses
'Program written for 3 turnstiles, can be easily modified for 2 or for more than 3
'
'11/30/2020 v1.0 SE PSS 101010111110 **THIS PROGRAM PROVIDED FOR SAMPLE AND GUIDELINES PURPOSES ONLY**
'Program is LOOPING/AUTOSTART
'
'OBJECTS USED
'DOORs
'*** All the doors are configured with Door Output Channel set to ZERO
Object thisTurnstile, theTurnstileB, theTurnstileC
'OUTPUT
'*** Output wired to door striker to lock/unlock the door
Object thisDrOutput
'NUMERICs
Object thisLastCard, theLastCard_B, theLastCard_C, thisAlarmPoint
'DATETIMEs
Object thisLastCrdTime, theLastCrdTime_B, theLastCrdTime_C
Line SETUP
'ENTER THE PATH TO THE 3 DOORS HERE
thisTurnstile = Turnstile_A
theTurnstileB = Turnstile_B
theTurnstileC = Turnstile_C
'ENTER THE PATH TO THE INFINITYOUTPUT HERE
thisDrOutput = Trnstl_A_Striker
'ENTER THE PATH TO THE INFINITYNUMERICs HERE
thisLastCard = Trnstle_A_CrdNum
theLastCard_B = Trnstle_B_CrdNum
theLastCard_C = Trnstle_C_CrdNum
thisAlarmPoint = TurnstileA_ALM
'ENTER THE PATH TO THE INFINITYDATETIMEs HERE
thisLastCrdTime = Trnstle_A_EvntTm
theLastCrdTime_B = Trnstle_B_EvntTm
theLastCrdTime_C = Trnstle_C_EvntTm
Goto MONITORING
Line MONITORING
thisDrOutput Value = 0 'LOCK THE DOOR
If thisTurnstile ValidAttempt then
'ACCESS HAS BEEN GRANTED AT THIS DOOR...
thisLastCard = thisTurnstile EntryLastCard 'RECORD THE CARD # USED...
thisLastCrdTime = (Date + 0) 'AND THE TIME OF THE TRANSACTION
Goto VALID_ATTEMPT
Endif
Line VALID_ATTEMPT
'IF SAME CARD USED AT ANY OF THE OTHER 2 DOORS WHILE THE CURRENT TRANSATION IS IN PROGRESS DENY ACCESS
If (thisLastCard Value = theLastCard_B Value) and (Date - theLastCrdTime_B Value) < theTurnstileB DoorStrikeTime then Goto PASSBACK
If (thisLastCard Value = theLastCard_C Value) and (Date - theLastCrdTime_C Value) < theTurnstileC DoorStrikeTime then Goto PASSBACK
thisDrOutput = thisTurnstile DoorStrikeTime 'UNLOCK THE DOOR
If thisTurnstile DoorSwitch = Opened then Goto PROCESSENTRY 'PERSON HAS OPENED THE DOOR
If TS > thisTurnstile DoorStrikeTime then Goto MONITORING 'VALID ACCESS NO ENTRY
Line PROCESSENTRY
'VALID ACCESS WITH ENTRY
If TS > 0 then thisDrOutput = Off 'RELOCK THE DOOR
Goto MONITORING 'GO WAIT FOR NEXT ACCESS ATTEMPT
Line PASSBACK
'ANTI PASSBACK VIOLATION
thisDrOutput Value = 0 'LOCK THE DOOR
TurnstileA_ALM = TurnstileA_ALM + 1 'SEND ALARM
'------------------------------------------------------------------------------------------
Goto MONITORING
Line E
If TS > 10 then Goto MONITORING
Program code for door/turnstile B
'This program implements a pre-entry antipassback strategy to prevent a credentail holder
'from granting access at multiple access points (i.e turnstiles) that are physically located in close proximity to each other.
'| |
' __/-\_______/-\_______/-\___
' | |
' | Main Lobby |
' | Turnstiles |
' | |
' | ______X______X______X____ |
' ^ ^ ^
' A B C
'OPERATION
'Upon detecting a Valid Attempt at say turnstile A, the program will deny access to the card used at turnstiles B and C
'until one of the following two conditions takes place:
'1-The person attempting access goes thru turnstile A as detected by the door contact. (this activates the regular
' built-in antipassback functionality if engaged)
'2-The door strike time at turnstile A expires, and the system re-locks turnstile A
'
'Each turnstile requires its own program, the programs will be identical except for the initialization line which specifies
'which objects the program uses
'Program written for 3 turnstiles, can be easily modified for 2 or for more than 3
'
'11/30/2020 v1.0 SE PSS 101010111110 **THIS PROGRAM PROVIDED FOR SAMPLE AND GUIDELINES PURPOSES ONLY**
'Program is LOOPING/AUTOSTART
'
'OBJECTS USED
'DOORs
'*** All the doors are configured with Door Output Channel set to ZERO
Object thisTurnstile, theTurnstileA, theTurnstileC
'OUTPUT
'*** Output wired to door striker to lock/unlock the door
Object thisDrOutput
'NUMERICs
Object thisLastCard, theLastCard_A, theLastCard_C, thisAlarmPoint
'DATETIMEs
Object thisLastCrdTime, theLastCrdTime_A, theLastCrdTime_C
'------------------------------------------------------------------------------------------
Line SETUP
'ENTER THE PATH TO THE 3 DOORS HERE
thisTurnstile = Turnstile_B
theTurnstileA = Turnstile_A
theTurnstileC = Turnstile_C
'ENTER THE PATH TO THE INFINITYOUTPUT HERE
thisDrOutput = Trnstl_B_Striker
'ENTER THE PATH TO THE INFINITYNUMERICs HERE
thisLastCard = Trnstle_B_CrdNum
theLastCard_A = Trnstle_A_CrdNum
theLastCard_C = Trnstle_C_CrdNum
thisAlarmPoint = TurnstileB_ALM
'ENTER THE PATH TO THE INFINITYDATETIMEs HERE
thisLastCrdTime = Trnstle_B_EvntTm
theLastCrdTime_A = Trnstle_A_EvntTm
theLastCrdTime_C = Trnstle_C_EvntTm
'------------------------------------------------------------------------------------------
Goto MONITORING
Line MONITORING
thisDrOutput Value = 0 'LOCK THE DOOR
If thisTurnstile ValidAttempt then
'ACCESS HAS BEEN GRANTED AT THIS DOOR...
thisLastCard = thisTurnstile EntryLastCard 'RECORD THE CARD # USED...
thisLastCrdTime = (Date + 0) 'AND THE TIME OF THE TRANSACTION
Goto VALID_ATTEMPT
Endif
Line VALID_ATTEMPT
'IF SAME CARD USED AT ANY OF THE OTHER 2 DOORS WHILE THE CURRENT TRANSATION IS IN PROGRESS DENY ACCESS
If (thisLastCard Value = theLastCard_A Value) and (Date - theLastCrdTime_A Value) < theTurnstileA DoorStrikeTime then Goto PASSBACK
If (thisLastCard Value = theLastCard_C Value) and (Date - theLastCrdTime_C Value) < theTurnstileC DoorStrikeTime then Goto PASSBACK
thisDrOutput = thisTurnstile DoorStrikeTime 'UNLOCK THE DOOR
If thisTurnstile DoorSwitch = Opened then Goto PROCESSENTRY 'PERSON HAS OPENED THE DOOR
If TS > thisTurnstile DoorStrikeTime then Goto MONITORING 'VALID ACCESS NO ENTRY
Line PROCESSENTRY
'VALID ACCESS WITH ENTRY
If TS > 0 then thisDrOutput = Off 'RELOCK THE DOOR
Goto MONITORING 'GO WAIT FOR NEXT ACCESS ATTEMPT
Line PASSBACK
'ANTI PASSBACK VIOLATION
thisDrOutput Value = 0 'LOCK THE DOOR
TurnstileA_ALM = TurnstileA_ALM + 1 'SEND ALARM
Goto MONITORING
Line E
If TS > 10 then Goto MONITORING
Program code for door/turnstile C