Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 5

#1234567890#

# 121106 - added when testing against part flights #


IF (varTDSecs <= 0)
{
# this flight has no t/d #
ABORT();
}

IF ((varTDSecs - FLIGHTOFFSETSECS()) <= 0.5)


{
binSig.ADD(prmSignature.OPT());
}

# we have to load up to 15 min of data prior to t/d so we can assess the appr type
#
# but we don't want to start running this script until the actual t/d point #
IF (FLIGHTOFFSETSECS() < varTDSecs)
{
varTemp = ABS(FEETUSEDRWYARR(FLIGHTOFFSETSECS()));
IF (varTemp < varThrClosest)
{
varThrClosest = varTemp;
ptThreshold.SETHI();
}

CONTINUE();
}

# store heading so that we can detect turn-off later on #


IF (prmHdgM.ISMAPPED() = 1)
{
varInitialHdg = prmHdgM;
}
ELSE
{
varInitialHdg = prmHdgT;
}

ptMainDown.SETEARLIEST();

varUsedFt = FEETUSEDRWYARR(varTDSecs);
binDistFromThresholdFeetTD.ADD(varUsedFt);
varUsedFtGPS = FEETUSEDRWYARRGPS(varTDSecs);

IF (ABS(varUsedFtGPS) < 20000)


{
binDistFromThresholdFeetTDGPS.ADD(varUsedFtGPS);
binDistDiffDerivedVsGPS.ADD(ABS(varUsedFt - varUsedFtGPS));
}

# calculate rwy required for avg braking of 0.2G to standstill #


# from v2 = u2 + 2as => s = (v2 - u2) / 2a => s = v2 / 2a #
# various constants to optimise conversion kt to m/sec and m to ft #
IF (prmGndSpd.ISMAPPED() = 1)
{
varGndSpdMsec = prmGndSpd * 0.5144;
varDistReqdFt = (varGndSpdMsec * varGndSpdMsec) * 0.8361;
binDistReqdFeetat02G.ADD(varDistReqdFt);
varDistRemainingAtTD = FEETTOGORWYARR(varTDSecs);
binDistRemainingAtTD.ADD(varDistRemainingAtTD);
binDistToSpareFeetAtTD.ADD(varDistRemainingAtTD - varDistReqdFt);

# calculate G reqd to stop in remaining distance #


# a = v2 / 2s #
varGReqdTD = (varGndSpdMsec * varGndSpdMsec) / (0.61 * varDistRemainingAtTD);
varGReqdTD = varGReqdTD / 9.81;
binGReqdTD.ADD(varGReqdTD);

# require 10% more to allow for delay in start of braking #


varGReqdTD = -1.1 * varGReqdTD;

# calc G for perfect landing (1000 ft in from threshold) #


varDistRemainingM = (TDRWYLENGTHFT() - 1000) * 0.3048;
varGReqdNow = (varGndSpdMsec * varGndSpdMsec) / (2 * varDistRemainingM);
varGReqdNow = varGReqdNow / 9.81;
binGReqdPerfectTD.ADD(varGReqdNow);
}

# added for TFL-specific SOP #


varTFLRwyLengthFt = TDRWYLENGTHFT();
varTFLRwyUsedFt = FEETUSEDRWYARR(0);

IF ((varTFLRwyLengthFt > 0) AND (varTFLRwyUsedFt > 0))


{
IF (varTFLRwyLengthFt < 9000)
{
# should land in first third of rwy - store value in metres #
binDistTFLRwyPct.ADD(0.3048 * (varTFLRwyUsedFt - (varTFLRwyLengthFt / 3)));
}
ELSE
{
# should land in first 3000ft - store value in metres #
binDistTFL3000ft.ADD(0.3048 * (varTFLRwyUsedFt - 3000));
}
}

SETAT(varTDSecs);

<END SCRIPT>binPALT.STORENUM(prmPALT);

# headings may be stored against MAG or TRUE mapping #


IF (prmHdgM.ISMAPPED() = 1)
{
varHdg = prmHdgM;
}
ELSE
{
varHdg = prmHdgT;
}

IF (prmCAS < (conMinCAS + 1))


{
ptCASInactive.SETEARLIEST();
}

# check for nose wheel contact #


IF (varNoseDown = 0)
{
# use nose gear switch if at all possible #
IF ((prmNoseOnGround.ISMAPPED() = 1))
{
# validate this discrete #
IF ((prmNoseOnGround = 1) OR (prmPitch < 0.25))
{
varNoseDown = 1;
ptNoseDown.SETEARLIEST();

# store more accurate heading (excludes any crosswind drift) #


varInitialHdg = varHdg;
}
}
ELSE
{
# this can give false results for very 'flat' landings #
IF (prmPitch < 0.5)
{
varNoseDown = 1;
ptNoseDown.SETEARLIEST();

# store more accurate heading (excludes any crosswind drift) #


varInitialHdg = varHdg;
}
}
}

# check for autoland #


varAP = prmAPL.OPTIONAL() + prmAPC.OPTIONAL() + prmAPR.OPTIONAL();
varAT = prmAT1.OPTIONAL() + prmAT2.OPTIONAL();

# are enough autopilot & autothrottle channels engaged? #


IF ((varAP >= conMinAP) AND (varAT >= conMinAT))
{
binAutoland.STORENUM(1);
}

IF (prmSpdBrk.ISMAPPED() = 1)
{
IF (prmSpdBrk > 30)
{
ptSpdBrkUp.SETEARLIEST();
}

IF ((prmSpdBrk < 15) AND (ptSpdBrkUp.ISACTIVE() = 1))


{
ptSpdBrkDn.SETEARLIEST();
}
}

IF (prmGndSpd.ISMAPPED() = 1)
{
IF (prmLonG < varGReqdTD)
{
ptEffectiveBraking.SETLO();
}
IF (prmGndSpd <= 70)
{
IF (ptGndSpd70.ISACTIVE() = 0)
{
# set point one second earlier to allow for lag in groundspeed #
# which is derived from a GPS or INS source & therefore behind reality
#
ptGndSpd70.SETEARLIESTPLUS(-1);
varDistRemainingFeet70kt = FEETTOGORWYARR(FLIGHTOFFSETSECS());

binDistRemainingFeet70kt.ADD(varDistRemainingFeet70kt);

# constant 0.2G braking from 70kt requires 1084ft #


binDistToSpareFeetAt70kt.ADD(varDistRemainingFeet70kt - 1084);

# calculate G reqd to stop in remaining distance #


varGndSpdMsec = prmGndSpd * 0.5144;
varGReqd70kt = (varGndSpdMsec * varGndSpdMsec) / (0.61 *
varDistRemainingFeet70kt);
varGReqd70kt = varGReqd70kt / 9.81;
binGReqd70kt.ADD(varGReqd70kt);
}
}

IF (pt1000ftToGo.ISACTIVE() = 0)
{
IF (FEETTOGORWYARR(FLIGHTOFFSETSECS()) < 1050)
{
pt1000ftToGo.SETLO();
}
}

# 121018 #
IF (FEETTOGORWYARR(FLIGHTOFFSETSECS()) < 550)
{
pt500ftToGo.SETLO();
}

# 121023 note distance remaining if hard braking in progress #


IF (prmLonG <= -0.25)
{
binDistLeftHardBraking.ADD(FEETTOGORWYARR(FLIGHTOFFSETSECS()));
}
}

binNJEFID.ADD(prmTest1.OPT());
binNJETD.ADD(prmTest2.OPT());

IF (GETTDACCELPEAKSCOUNT() > 0)
{
IF (ptNJEPeakLo.ISACTIVE() = 0)
{
ptNJEPeakLo.SETAT(GETTDACCELPEAKLOSECS());
ptNJEPeakHi.SETAT(GETTDACCELPEAKHISECS());
binNJEPeakCount.NEWSLOTAT(GETTDACCELPEAKLOSECS());
binNJEPeakCount.NEWSLOTADD(GETTDACCELPEAKSCOUNT());
binNJEPeakCount.NEWSLOTAT(GETTDACCELPEAKHISECS());
binNJEPeakCount.NEWSLOTADD(GETTDACCELPEAKSCOUNT());
}
}

IF (prmTest2.OPT() > 0)
{
binNJEDeltaTD.ADD(((varTDSecs * 1000) - prmTest2.OPT()));
}

IF (STATEDURATIONSECS() <= 0.5)


{
binSig.ADD(prmSignature.OPT());
}

<END SCRIPT># look for a heading change of over 20 degrees which should be the
turn-off #
# was 10 deg previously - poss false triggering due to drift on t/d #
varDeltaHdg = varHdg - varInitialHdg;

# correct for wrap between 359 and 001 degs #


# eg. 002 - 358 = -356 but delta is actually +4 #
IF (varDeltaHdg < -180)
{
varDeltaHdg = varDeltaHdg + 360;
}

IF (varDeltaHdg > 180)


{
varDeltaHdg = varDeltaHdg - 360;
}

IF (ABS(varHdg - varInitialHdg) > 20)


{
IF (prmGndSpd.ISMAPPED() = 1)
{
# was 80 kts previously #
IF (prmGndSpd < 50)
{
SETNOW();
}
}
ELSE
{
IF (prmCAS < (conMinCAS + 1))
{
SETNOW();
}
}
}

# end after a sensible period of time so we don't start seeing noisy data #
IF (STATEDURATIONSECS() > 90)
{
SETNOW();
}

You might also like