Copyright (C) 2007, Danny Ho, dannyh-at-spirellis-dot-com FOR PROGRAMMERS: Below is the CHECKTHREAT function in my Visual Basic program, which determines the level of threat, and initiates TCAS action. This is for your general interest, use, and critique. Enjoy! Danny '****************************** Public Function CheckThreat(Index As Integer) As String 'returns TA, RA, PT, NIT, or NA If (Traffic(Index).Ref) = 0 Then CheckThreat = "NA" Exit Function End If CheckThreat = "PT" 'TimeGap = Format(auiTime(3), "00") - Traffic(Index).TempSec(TrendLength) TimeGap = tmrTCAS.Interval / 1000 ' DELAY OF TRANSPONDER TIMER 'Right(TimeString, 2) - Traffic(Index).TempSec(TrendLength) 'MsgBox Second(Now) & " " & TimeGap If TimeGap <= 0 Then TimeGap = 60 + TimeGap End If 'Traffic(Index).HorTau(TrendLength) = (Dist(Index) / (0.0001 + Traffic(Index).Dist(TrendLength) - Dist(Index)) + Traffic(Index).Dist(TrendLength) / (0.0001 + Traffic(Index).Dist(TrendLength - 1) - Traffic(Index).Dist(TrendLength)) + Traffic(Index).Dist(TrendLength - 1) / (0.0001 + Traffic(Index).Dist(TrendLength - 2) - Traffic(Index).Dist(TrendLength - 1))) / TimeGap 'Traffic(Index).HorTau(TrendLength) = Traffic(Index).Dist(TrendLength) / (0.0000001 + ((Traffic(Index).Dist(TrendLength - 8) - Traffic(Index).Dist(TrendLength) + 0.00001) / (TimeGap + 0.0000001))) Traffic(Index).HorTau(TrendLength) = Dist(Index) / (TimeGap * (0.0000001 + Traffic(Index).Dist(TrendLength) - Dist(Index))) If (Traffic(Index).HorTau(TrendLength) < 1) Or (Traffic(Index).HorTau(TrendLength) > 200) Then Traffic(Index).HorTau(TrendLength) = -1 End If tmpAltDiff = (Alt(Index) - osAlt) tmpAltDiffLast = (Traffic(Index).Alt(TrendLength) - Ownship.Alt(TrendLength - 1)) If (Abs(tmpAltDiff) < Abs(tmpAltDiffLast)) And (Abs(tmpAltDiff - tmpAltDiffLast) >= 1) Then Traffic(Index).VerTau(TrendLength) = Abs(tmpAltDiff) / (TimeGap * Abs(tmpAltDiff - tmpAltDiffLast + 0.0001)) Else Traffic(Index).VerTau(TrendLength) = -1 End If Text5.Text = Traffic(Index).HorTau(TrendLength) Text6.Text = Traffic(Index).VerTau(TrendLength) 'Traffic(Index).HorTau(TrendLength) = HorTau 'Traffic(Index).VerTau(TrendLength) = VerTau If (Traffic(Index).HorTau(TrendLength) > 1) And (Traffic(Index).VerTau(TrendLength) > 1) And (osAGL > 100) And (Traffic(Index).HorTau(TrendLength) < 120) Then 'regular threat check If (Traffic(Index).Dist(TrendLength) < TAdmod) And (Abs(Traffic(Index).Alt(TrendLength) - osAlt) < TAalt) Then CheckThreat = "TA" RASense = "NA" End If If (Traffic(Index).Dist(TrendLength) < RAdmod) And (Abs(Traffic(Index).Alt(TrendLength) - osAlt) < RAalt) Then CheckThreat = "RA" End If If (Traffic(Index).HorTau(TrendLength) < TAtau) And (Traffic(Index).VerTau(TrendLength) < TAtau) Then CheckThreat = "TA" RASense = "NA" End If If (Traffic(Index).HorTau(TrendLength) < RAtau) And (Traffic(Index).VerTau(TrendLength) < RAtau) Then CheckThreat = "RA" End If End If If (Traffic(Index).Threat(TrendLength - 2) = "RA" And Traffic(Index).Threat(TrendLength - 1) = "PT" And CheckThreat = "PT" And (Traffic(Index).HorTau(TrendLength) < 0)) Then If lblMsg <> "CLEAR OF CONFLICT" Then lblMsg = "CLEAR OF CONFLICT" RASense = "NA" End If End If '****************** '**** INITIAL RA PSEUDOCODE, osalt, xosalt, alt, xalt, osvs, vs If CheckThreat = "RA" Then If (osAlt) > (Alt(Index)) Then 'ownship is higher If ((Traffic(Index).HorTau(TrendLength) * MaxRate / 60 + osAlt) - (Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index))) > RAalt Then 'cross descend is not necessary RARate = (((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) + RAalt) - osAlt)) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001) 'determine min RA rate If (RARate < 0) And (RARate < osVs) Then 'if RARATE > osvs then CLIMB CLIMB!!! ' If lblMsg <> "DO NOT DESCEND" Then lblMsg = "DO NOT DESCEND" If RARate > osVs And RASense = "UP" Then If lblMsg <> "INCREASE CLIMB" Then lblMsg = "INCREASE CLIMB" Else If RASense = "DOWN" Then If lblMsg <> "CLIMB, CLIMB NOW" Then lblMsg = "CLIMB, CLIMB NOW" Else If lblMsg <> "CLIMB, CLIMB" Then lblMsg = "CLIMB, CLIMB" End If End If Else 'must climb If RARate > osVs And RASense = "UP" Then If lblMsg <> "INCREASE CLIMB" Then lblMsg = "INCREASE CLIMB" Else If RASense = "DOWN" Then If lblMsg <> "CLIMB, CLIMB NOW" Then lblMsg = "CLIMB, CLIMB NOW" Else If lblMsg <> "CLIMB, CLIMB" Then lblMsg = "CLIMB, CLIMB" End If End If End If RASense = "UP" Else 'must cross descend to avoid RARate = ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) - RAalt) - osAlt) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001) If RASense = "DOWN" And RARate < osVs Then If lblMsg <> "INCREASE DESCEND" Then lblMsg = "INCREASE DESCEND" Else If lblMsg <> "CROSSING DESCEND" Then lblMsg = "CROSSING DESCEND" End If RASense = "DOWN" End If Else 'ownship is below threat If ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index)) - (osAlt - Traffic(Index).HorTau(TrendLength) * MaxRate / 60)) > RAalt Then 'cross climb is not necessary RARate = ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) - RAalt) - osAlt) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001) 'determine min RA rate If (RARate > 0) And (RARate > osVs) Then ' If lblMsg <> "DO NOT CLIMB" Then lblMsg = "DO NOT CLIMB" If RARate < osVs And RASense = "DOWN" Then If lblMsg <> "INCREASE DESCEND" Then lblMsg = "INCREASE DESCEND" Else If RASense = "UP" Then If lblMsg <> "DESCEND, DESCEND NOW" Then lblMsg = "DESCEND, DESCEND NOW" Else If lblMsg <> "DESCEND, DESCEND" Then lblMsg = "DESCEND, DESCEND" End If End If Else 'must descend If RARate < osVs And RASense = "DOWN" Then If lblMsg <> "INCREASE DESCEND" Then lblMsg = "INCREASE DESCEND" Else If RASense = "UP" Then If lblMsg <> "DESCEND, DESCEND NOW" Then lblMsg = "DESCEND, DESCEND NOW" Else If lblMsg <> "DESCEND, DESCEND" Then lblMsg = "DESCEND, DESCEND" End If End If End If RASense = "DOWN" Else 'must cross climb to avoid RARate = ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) + RAalt) - osAlt) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001) If RASense = "UP" And RARate > osVs Then If lblMsg <> "INCREASE CLIMB" Then lblMsg = "INCREASE CLIMB" Else If lblMsg <> "CROSSING CLIMB" Then lblMsg = "CROSSING CLIMB" End If RASense = "UP" End If End If '**** END RA SELECTION '********************* End If If (CheckThreat = "TA") And (Traffic(Index).Threat(TrendLength) <> "TA") Then If lblMsg <> "TRAFFIC, TRAFFIC" Then lblMsg = "TRAFFIC, TRAFFIC" RASense = "NA" End If If CheckThreat = "" Then chechthreat = "NA" End If If RASense = "NA" Then Call FillRA(vbBlack, 0, 19) Else Call DrawRA End If End Function