AVR Basic Programm für Buhlmann

Programm: TAUCHCOMPUTER.BAS

‘ – Allgemeine Berechnung Der Gewebesaettigung
‘ – Berechnung Der Flugverbotszeit
‘ – Berechnung Der Entsaettigungszeit
‘ – Berechnung Eines Aufstiegsprofiles

‘ ***************************************************************************
‘ Konstanten
‘ ***************************************************************************

Const P_0 = 1.013 ‘ ( * Luftdruck In Meereshoehe [bar] * )
Const Konst = -0.0001251 ‘ ( * [m ^( -1)](fuer Barometrische Hoehenformal Benoetigt) * )
Const P_h2o = 0.0627 ‘ ( * Gehalt An Wasserdampf Im Atemgas Bei Einatmung Bei 37 Grad C * )
Const Log2 = 0.69314718056 ‘ ( * Ln(2) * )
Const E_20 = 0.000009 ‘ 1e-20

Const Anzahl_beruecksichtigte_gewebe = 16
Const Tg = 0 ‘ Tauchgang
Const Of = 1 ‘ Oberfläche
Const Nztg = 0
Const Dekotg = 1

Declare Function Getdecostep(byval Metr As Single) As Single
Declare Function Nullzeit(byref N_pig_te As Single , Byval P_nz As Single , Byval Nz_gi As Integer ) As Single
Declare Function Getwaterpr(byval W_tiefe As Single) As Single
Declare Function Gettolambpress(byref Gap_pig_te As Single , Byval Gap_gi As Integer) As Single
Declare Function Gettolig(byref Gtg_p As Single , Byval Gtg_gi As Integer) As Single
Declare Sub Nullzeittab()
Declare Sub Decozeit()

‘ ***************************************************************************
‘ Globale Variablen
‘ ***************************************************************************

Dim A(16) As Single
Dim B(16) As Single
Dim Tchalf(16) As Single ‘ Gewebe Halbwertszeit in Minuten
Dim Tchalfhe(16) As Single ‘ Gewebe Halbwertszeit in Minuten
Dim Pig_te(16) As Single ‘ Inertgasdruck im Gewebe
Dim Pamb_tol(16) As Single ‘ Tolerierter Gew. Überdruck zur Dekostopber.
Dim Piig As Single ‘ Inertgasdruck im Gewebe UW
Dim Dekostop(13) As Single ‘ Dekostops 0-700meter
Dim Dekostop701(13) As Single ‘ Dekostops 701-2000meter
Dim Dekozeit(13) As Single ‘ max Dekozeit auf Dekostufe
Dim Dekohilf As Word ‘ für Ausgabe Integerwerte

Dim M_gi As Integer ‘ über alle Gewebe
Dim Deltat As Single ‘ Delta T 10m/min

‘ ***************************************************************************
‘ Initalisierung der Tabelle
‘ ***************************************************************************

‘ Bühlmann Werte

A(1) = 1.2599 : B(1) = 0.505 : Tchalf(1) = 4.0 : Tchalfhe(1) = 1.51
A(2) = 1.0 : B(2) = 0.6514 : Tchalf(2) = 8 : Tchalfhe(2) = 3.02
A(3) = 0.8618 : B(3) = 0.7222 : Tchalf(3) = 12.5 : Tchalfhe(3) = 4.72
A(4) = 0.7562 : B(4) = 0.7825 : Tchalf(4) = 18.5 : Tchalfhe(4) = 6.99
A(5) = 0.62 : B(5) = 0.8126 : Tchalf(5) = 27 : Tchalfhe(5) = 10.21
A(6) = 0.5043 : B(6) = 0.8434 : Tchalf(6) = 38.3 : Tchalfhe(6) = 14.48
A(7) = 0.4410 : B(7) = 0.8693 : Tchalf(7) = 54.5 : Tchalfhe(7) = 20.53
A(8) = 0.4 : B(8) = 0.8910 : Tchalf(8) = 77 : Tchalfhe(8) = 29.11
A(9) = 0.375 : B(9) = 0.9092 : Tchalf(9) = 109 : Tchalfhe(9) = 41.2
A(10) = 0.35 : B(10) = 0.9222 : Tchalf(10) = 146 : Tchalfhe(10) = 55.19
A(11) = 0.3295 : B(11) = 0.9319 : Tchalf(11) = 187 : Tchalfhe(11) = 70.69
A(12) = 0.3065 : B(12) = 0.9403 : Tchalf(12) = 239 : Tchalfhe(12) = 90.34
A(13) = 0.2835 : B(13) = 0.9477 : Tchalf(13) = 305 : Tchalfhe(13) = 115.29
A(14) = 0.2610 : B(14) = 0.9544 : Tchalf(14) = 390 : Tchalfhe(14) = 147.42
A(15) = 0.2480 : B(15) = 0.9602 : Tchalf(15) = 498 : Tchalfhe(15) = 188.24
A(16) = 0.2327 : B(16) = 0.9653 : Tchalf(16) = 635 : Tchalfhe(16) = 240.03

Dekostop(1) = 0 : Dekostop701(1) = 0
Dekostop(1) = 0 : Dekostop701(2) = 2
Dekostop(2) = 3 : Dekostop701(3) = 4
Dekostop(3) = 6 : Dekostop701(4) = 6
Dekostop(4) = 9 : Dekostop701(5) = 9
Dekostop(5) = 12 : Dekostop701(6) = 12
Dekostop(6) = 15 : Dekostop701(7) = 15
Dekostop(7) = 20 : Dekostop701(8) = 20
Dekostop(8) = 30 : Dekostop701(9) = 30
Dekostop(9) = 40 : Dekostop701(10) = 40
Dekostop(10) = 50 : Dekostop701(11) = 50
Dekostop(11) = 70 : Dekostop701(12) = 70
Dekostop(12) = 90 : Dekostop701(13) = 90

‘ ***************************************************************************
‘ MAIN
‘ ***************************************************************************

Dim I As Integer
Dim Owf_t As Word
Dim Owfgew As Single
Dim M_x As Single
Dim M_y As Single
Dim M_z As Single
Dim Tiefe As Single
Dim M_pig_t0 As Single
Dim Tol_tiefe As Single
Dim Nz As Single
Dim Ntwo As Single
Dim Pamb As Single
Dim Min_nz As Single
Dim I_nz As Word
Dim I_tiefe As Word
Dim Tauchzeit As Single
Dim Zeit As Word
Dim Gew_end As Single
Dim Gew_anf As Single
Dim Gew_int As Word
Dim Zeile2 As String * 20
Dim Zeile2_hilf As String * 20
Dim State As Byte

‘ FORALL (Gewebe Gi) DO
‘ FORALL (Inertgas Ij) DO
‘ setze Druck für Ij in Gi auf den Teildruck Inertgas Ij im aktuellen Atemgas
‘ Bestimme aus den Halbwertszeiten Inertgas Ij die Toleranzkoeff. a und b für Gi
‘ END FORALL
‘ END FORALL

Config Lcd = 20 * 4
Cls

Config Adc = Single , Prescaler = Auto ‘, Reference = Opt

Start Adc

Piig = P_0 – 0.063 ‘ Partialdruck Oberfläche
Piig = Piig * 0.79 ‘ Oberfläche immer 0.79 N2

For I = 1 To 13 ‘ Am Anfang keine Dekozeiten
Dekozeit(i) = 0.0
Next I

For M_gi = 1 To Anzahl_beruecksichtigte_gewebe
Pig_te(m_gi) = Piig ‘ Partialdruck Stickstoff an der Oberfläche
Next M_gi

Gew_anf = Gettolambpress(pig_te(8) , 8)
Gew_end = 0.0

‘ WHILE (Tauchgang noch nicht zu ende) DO
‘ Messe den Umgebungsdruck
‘ Überwache aufstiegsgesw. durch Umgebungsdruckänderung
‘ FORALL (Gewebe Gi) DO
‘ Berechne den neuen Gehalt aller Inertgase Gi
‘ If ( Gewebe nicht dekompressionspflichtig) THEN
‘ Berechne Nullzeit für Gewebe Gi
‘ ELSE
‘ Berechne nächste Decostufe
‘ ENDIF
‘ END FORALL
‘ IF (alle Gewebe in der Null) THEN
‘ Minimum aller Nullzeiten ermitteln
‘ ELSE
‘ Tiefe und Verweildauer auf der Decostufe (tiefste) berechnen
‘ ENDIF
‘ Nächstes Messunginterval, warte delta T
‘ END WHILE

Owf_t = 0
Tauchzeit = 0.0

Do

‘ *****************************************************************************
‘ Lesen der Sensoren
‘ *****************************************************************************

I_tiefe = Getadc(0) ‘ später lesen vom Drucksensor
Tiefe = I_tiefe / 10.0

If Tiefe > 1.0 Then ‘ Tauchgang beginnt
Deltat = 0.5 ‘ 30 sec Intervall
State = Tg
Else
Deltat = 1.0 ‘ Oberfläche im Minutenintervall
State = Of
End If

Ntwo = 0.79 ‘ später lesen vom O2 Sensor !
Pamb = Getwaterpr(tiefe)
Piig = Pamb – 0.063 ‘ Partialdruck UW
Piig = Piig * Ntwo

‘ *****************************************************************************
‘ Berechnung der Sättigung / Entsättigung der Kompartimente, Nullzeit
‘ *****************************************************************************

Min_nz = 999.0 ‘ Nullzeit erstmal sehr gross
For M_gi = 1 To Anzahl_beruecksichtigte_gewebe
M_pig_t0 = Pig_te(m_gi) ‘ Inertgasdruck im Gewebe Anfang
M_x = Deltat * -1
M_y = M_x / Tchalf(m_gi)
M_y = 1 – Exp(m_y) ‘ 1 – exp( K * tE / TChalf(Gi) * ln(e)
M_x = Piig – M_pig_t0
M_z = M_x * M_y ‘ ( Piig – Pig_t0 ) * ( 1 – exp( K * tE / TChalf(Gi) )
Pig_te(m_gi) = M_pig_t0 + M_z
Nz = Nullzeit(pig_te(m_gi) , P_0 , M_gi) ‘ berechne Nullzeit
If Nz >= 0.0 Then
If Nz <= Min_nz Then
Min_nz = Nz
End If
End If

Next M_gi

‘ *****************************************************************************
‘ Aufbereiten der Daten Tauchgang / Oberfläche
‘ *****************************************************************************

I_nz = Min_nz
If State = Tg Then
Owf_t = 0 ‘ Oberflächenzeit ist zuende
Gew_end = Piig
Decozeit
Tauchzeit = Tauchzeit + Deltat
Zeit = Tauchzeit ‘ Tauchzeit im Display ausgeben
Else
Owfgew = Piig * 1.02 ‘ Bestimmendes Gewebe 6 HWZ 0,98% sind OK
Tauchzeit = 0.0 ‘ Tauchzeit ist zuende
Zeit = Owf_t ‘ Oberflächenzeit im Display ausgeben
Incr Owf_t

If Pig_te(8) <= Owfgew Then
Zeile2 = “Gew8 ok”
Gew_end = 0.0
End If
End If

‘ *****************************************************************************
‘ Anzeige der Gew. Sättigung / Entsättigung als Balken
‘ *****************************************************************************
If Gew_end = 0.0 Then
Gew_end = Gettolambpress(pig_te(8) , 8)
Else
M_x = Gew_end – Gew_anf
M_y = Gettolambpress(pig_te(8) , 8)
M_y = M_y – Gew_anf
M_x = M_y / M_x
M_x = M_x * 19
Gew_int = M_x

If Gew_int > 19 Then Gew_int = 19
If Gew_int >= 1 Then
Zeile2_hilf = String(gew_int , “*”)
End If

Gew_int = M_x
If Gew_int > 19 Then
Zeile2 = Zeile2_hilf + “>”
Else
Zeile2 = Zeile2_hilf
End If
End If

‘ *****************************************************************************
‘ Ausgabe der Werte auf Display
‘ *****************************************************************************
Cls
Locate 1 , 1
Lcd I_nz ; ” : ” ; Fusing(tiefe , “##.#”) ; ” : ” ; Zeit
Locate 2 , 1
Lcd Zeile2
Zeile2 = “”

‘ *****************************************************************************
‘ Aufbereiten Anzeig der Dekostops
‘ *****************************************************************************

If State = Tg Then
For I = 13 To 1 Step -1 ‘ Ermittle ob ein Dekostop überschritten wurde
If Dekozeit(i) > 0.0 Then
Locate 3 , 1
If Tiefe < Dekostop(i) Then ‘ Dekostop übersprucngen Warning
Lcd “**** DECOSTOP WARNING ****”
Else
Dekohilf = Dekostop(i)
Lcd “Stop: ” ; Str(dekohilf) ; “m – ” ; Fusing(dekozeit(i) , “##.#”)

M_x = Tiefe – 2
If M_x < Dekostop(i) Then
Dekozeit(i) = Dekozeit(i) – Deltat
End If
Exit For
End If
End If
Next I
End If

Loop ‘ Next I

Nullzeittab
End

‘ *****************************************************************************
‘ Gebe neue Nullzeiten aus
‘ *****************************************************************************
Sub Nullzeittab()
Local Nzt_i As Word
Local Nzt_gi As Integer

For Nzt_i = 6 To 11
Min_nz = 999.0
Pamb = Getwaterpr(dekostop(nzt_i))
Piig = Pamb – 0.063 ‘ Partialdruck UW
Piig = Piig * Ntwo

‘ *****************************************************************************
‘ Simulation Sättigung für Tiefentabelle
‘ *****************************************************************************
For Nzt_gi = 1 To Anzahl_beruecksichtigte_gewebe

M_pig_t0 = Pig_te(nzt_gi) ‘ Inertgasdruck im Gewebe Anfang
M_x = -0.1 ‘ Sofort abtauchen 0.1 Minuten
M_y = M_x / Tchalf(nzt_gi)
M_y = 1 – Exp(m_y) ‘ 1 – exp( K * tE / TChalf(Gi) * ln(e)
M_x = Piig – M_pig_t0
M_z = M_x * M_y ‘ ( Piig – Pig_t0 ) * ( 1 – exp( K * tE / TChalf(Gi) )
M_pig_t0 = M_pig_t0 + M_z
Nz = Nullzeit(m_pig_t0 , P_0 , Nzt_gi)
If Nz <= Min_nz Then Min_nz = Nz
Next Nzt_gi

Print “Nullzeit für ” ; Dekostop(nzt_i) ; ” = ” ; Min_nz
Next Nzt_i
End Sub

‘ *****************************************************************************
‘ N_pig_te Inertgasdruck
‘ P_nz Umgebungsdruck
‘ erg: Nullzeit für Tiefe (Umgebungsdruck)
‘ Global: Piig, A(), B(), TChalf()

Function Nullzeit(byref N_pig_te As Single , Byval P_nz As Single , Byval Nz_gi As Integer) As Single
Local Nz_x As Single
Local Nz_y As Single
Local Nz_z As Single

‘ Nullzeit = -TChalf * log [ ( Piig – (( P_0 / b ) + a)) / ( Piig – Pig_t0 ) ]
Nz_x = P_nz / B(nz_gi) ‘ ( P_0 / b )
Nz_y = Nz_x + A(nz_gi) ‘ ( P_0 / b ) + a
Nz_x = Piig – Nz_y
Nz_y = Piig – N_pig_te
If Nz_y = 0.0 Then Nz_y = E_20
Nz_z = Nz_x / Nz_y
If Nz_z > 0.0 Then
Nz_x = Tchalf(nz_gi) * -1
Nullzeit = Nz_x * Log(nz_z)
Else
Nullzeit = 999.0 ‘ maximalwert für Anzeige ist 999min
End If

End Function

‘ *****************************************************************************
‘ *****************************************************************************
‘ D_tiefe Decostoptiefe
‘ erg: Dekozeit

Sub Decozeit()
Local D_max_pamb_tol As Single
Local D_gi As Integer
Local Index As Integer
Local Dt_deko As Single
Local D_x As Single
Local D_y As Single
Local D_p As Single
Local D_tol_tiefe As Single
Local D_tiefe As Single

‘ *****************************************************************************
‘ für alle Gewebe den zulässigen Druck ermitteln
‘ *****************************************************************************

For D_gi = 1 To Anzahl_beruecksichtigte_gewebe
Pamb_tol(d_gi) = Gettolambpress(pig_te(d_gi) , D_gi)
Next D_gi

‘ *****************************************************************************
‘ nun simulation starten, ermittle Führungsgewebe : index
‘ *****************************************************************************

Index = 1
D_max_pamb_tol = Pamb_tol(index)
For D_gi = 2 To Anzahl_beruecksichtigte_gewebe
If D_max_pamb_tol < Pamb_tol(d_gi) Then
D_max_pamb_tol = Pamb_tol(d_gi)
Index = D_gi
End If
Next D_gi

‘ *****************************************************************************
‘ passende Dekostufe ermitteln
‘ *****************************************************************************

D_tol_tiefe = D_max_pamb_tol – P_0 ‘ P_0 Druck auf Meereshöhe
D_tol_tiefe = D_tol_tiefe * 10.0
D_gi = 1

While D_tol_tiefe > Dekostop(d_gi)
Incr D_gi
Wend

D_tiefe = Dekostop(d_gi)

D_p = Getwaterpr(d_tiefe) ‘ Druck in der Dekostufe
Piig = D_p – 0.063 ‘ Partialdruck UW
Piig = Piig * Ntwo ‘ für N2
Decr D_gi
D_p = Getwaterpr(dekostop(d_gi)) ‘ Druck in der nächsten Dekostufe
Incr D_gi
D_x = Gettolig(d_p , Index)
D_x = Piig – D_x
D_y = Piig – Pig_te(index)

‘ *****************************************************************************
‘ Dekozeit berechnen
‘ *****************************************************************************

If D_y = 0.0 Then D_y = E_20
D_y = D_x / D_y
If D_y > 0.0 Then
D_x = Log(d_y)
D_y = Tchalf(index) * -1
Dt_deko = D_y * D_x
Dt_deko = Dt_deko + 1
Else
Dt_deko = -1 ‘ unendliche Dekozeit -> Fehler
End If

If Dt_deko > Dekozeit(d_gi) Then
Dekozeit(d_gi) = Round(dt_deko)
End If

If Dekostop(d_gi) = 0 Then
If Dekozeit(d_gi) > 0.0 Then
Index = D_gi
Incr Index

Dekozeit(index) = Dekozeit(index) + Dekozeit(d_gi)
Dekozeit(d_gi) = 0.0

End If

End If

End Sub

‘ *****************************************************************************
‘ W_tiefe Wassertiefe
‘ erg: Umgebungsdruck

Function Getwaterpr(byval W_tiefe As Single) As Single
Local Gwp_x As Single

Gwp_x = W_tiefe / 10 ‘ (UWTiefe / 10) + (Luftdruck / 1000)
Getwaterpr = Gwp_x + P_0

End Function

‘ *****************************************************************************
‘ Gap_Pig_te Inertgasdruck im Gewebe
‘ Gi Gewebe
‘ erg: Gewebedruck ohne Blasen

Function Gettolambpress(byref Gap_pig_te As Single , Byval Gap_gi As Integer) As Single
Local Gap_x As Single

Gap_x = Gap_pig_te – A(gap_gi)
Gettolambpress = Gap_x * B(gap_gi)

End Function

‘ *****************************************************************************
‘ Gap_P Umgebungsdruck
‘ Gi Gewebe
‘ erg: Umgebungsdruck ohne Blasen

Function Gettolig(byref Gtg_p As Single , Byval Gtg_gi As Integer) As Single
Local Gtg_x As Single

Gtg_x = Gtg_p / B(gtg_gi)
Gettolig = Gtg_x + A(gtg_gi)

End Function

Kategorie: , Aktualisiert am 3. November 2016 von tauchcomputer | Log in