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 | Anmelden