Attribute VB_Name = "modUS2000_Algorithmen" Option Explicit '---Freigabe für Produktion: 04.12.01 - Version 9.1 - Uwe Groß '---Freigabe für Produktion: 14.12.01 - Version 9.3 - Uwe Groß '******************************************************************************************** ' History: Version 4.0: Startup für Meßreferenzsystem ' Version 4.3: Subroutine Justage und Functions Geberkonstante bzw. Offset ' hinzugefügt ' Version 4.7: Function PLZausTemperatur hinzugefügt ' Version 4.8: PLZausTemperatur und Q_H2OausDT entfällt. ' Version 4.9: Änderung Geberkonstante_m3 auf Geberkonstante_m ' Version 4.10: Änderung Geberkonstante_m und Offset_s ' Version 6.0: Function MSP430FloatToDez und DezToFloatMSP430 aus Algorithmus zur Vollständigkeit aufgenommen. ' Version 7.0: wie 6.0 ' Version 8.0: Q_US_lph zur Bestimmung des Durchfluß erweitert auf ' temperaturabängigen Offset und Unlinearitätsausgleich ' Neuer Abgleich mit Geberkonstante_m und Offset_s ' Version 8.5: temperaturabhängige Steilheit für DiffTof_ns hinzugefügt in Function Q_US_lph. ' Subroutine Justage_Execute ' Version 8.11: FloatMSP430 = "00000000" führt zu 0,00 in Function FloatMSP430_To_DEZ(FloatMSP430) ' Version 8.16: Function DEZ_To_FloatMSP430(Dezimal)geändert ' Version 8.17: Function Diff_Tof hinzugefügt incl. Änderung ' Function GibtEinenWertAus(Zeile, Spalte, Blatt_Nr) eingefügt ' Version 8.19: Function Diff_Tof geändert. Sub Justage_Execute geändert. ' Version 9.1: Function Justage_Execute geändert. ' Version 9.7: Neue Function Q_US_Bereich_lph, Function Justage_Execute geändert. ' Version 9.8: Function Diff_Tof geändert. ' Version 9.10: Neue Function Volume_2_DiffTof (...) ' Version 9.13: 22.03.2002 neue Function Checksumme_Master ' neue Function CheckHEX und Aufruf aus FloatMSP430_To_DEZ ' neue Function CheckConfig ' 25.03.2002 Änderung Function Checksumme_Master ' 12.06.2002: Function DEZ_To_FloatMSP430, Q_US_Bereich_lph und Diff_Tof geändert ' 26.06.2002: neue Function ZeroFlowOffset ' 31.07.2002: neue Function ZeroFlowOffset_ErmitteltAusEinerTemperatur ' Version 9.14: Änderung in Function Diff_Tof und Q_US_Bereich_lph ' Version 9.16: Änderung in Function ZeroFlowOffset_ErmitteltAusEinerTemperatur ' Neue Function DiffToffASIC_ZeroFlowOffset ' Version 9.17: Änderung in Function DiffToffASIC_ZeroFlowOffset '******************************************************************************************** '******************************************************************************************** ' ' ' Author: Dirk Pulwer ' Date: 07.01.02 ' Description: Modul-Anpassung / Integration (Option Explicit gesetzt - > Variablendeklaration erzwungen !) ' ' Diese Version wurde in die Prüfstationssoftware eingebunden ' Dazu mussten einige Elemtente, die direkt auf Excel-Zellen zugreifen entfernt werden ' Zusätzlich wurden alle Variablen deklariert und wenn nötig auf "Private" gesetzt ' So sind nach außen nur spezielle Funktionen 'sichtbar' ' Gar nicht verwendete Funktionen wurden der übersichtlichkeit herausgenommen. ' ' Benötig werden nur der JustageParameter_Type, die Prozedur Justage_Execute mit dazugehörigen ' internen Funktionen, FloatMSP430_To_DEZ und DEZ_To_FloatMSP430. ' ' Statt einem String "Error: ..." wird bei Fehlern ein Err.Raise ausgeführt ' '******************************************************************************************** ' Author: Uwe Groß ' Date: 06.08.01 ' Description: Ablauf Justage. ' Die Bereichsumschaltung ist nur wirksam, wenn Unlinearität<>0% gesetzt. ' Bei Nutzung der Bereichsumschaltung muß .Sollfluss1_m3ph bzw. .Istfluss1_m3ph ' die kleinerern Durchflüsse sein. Außerdem ist der Input dieser beiden Werte nach ' Aufruf mit Nutzung der Bereichsjustage zerstört. ' Public Type JustageParameter_Type ' Input: Sollfluss1_m3ph As Double '---Solldurchfluß unterer Bereich (m³/h) Sollfluss2_m3ph As Double '---Solldurchfluß oberer Bereich (m³/h) Istfluss1_m3ph As Double '---Istdurchfluß unterer Bereich (m³/h) Istfluss2_m3ph As Double '---Istdurchfluß oberer Bereich (m³/h) Temperatur1_°C As Double '---Wassertemperatur am Prüfpunkt 1 (°C) Temperatur2_°C As Double '---Wassertemperatur am Prüfpunkt 2 (°C) Bereich_ns As Double '---Trennpunkt für Bereich oben/unten [ns] SteilheitGeber_nsp°C As Double '---Steilheit Zeroflow [ns/°C] OffsetGeber_ns As Double '---Offset Zeroflow [ns] wie im µC Unlinearitaet As Double '---weiterer additiver Unlinearitätsfehler am Trennpunkt [%] ' 0% bedeutet damit alte Einstellung (z.B. 3%) bleibt unverändert Geberkonstante1_IST_m As Double '---Geberkonstante im unteren Bereich[m] Offset1_IST_m3ph As Double '---Offset im unteren Bereich [m³/h] Geberkonstante2_IST_m As Double '---Geberkonstante im oberen Bereich[m] Offset2_IST_m3ph As Double '---Offset im oberen Bereich [m³/h] Offset_Qmin As Double '---Offset Qmin in % Offset_QBereich As Double '---Offset QBereich in % Offset_Qp As Double '---Offset Qp in % SollFehlerDifferenz_Qmin As Double '---Soll-Fehler-Differenz bei Qmin (Spreizung der Heiss- und Kalt Kurven) IstFehler_qmin_50°C As Double ' wird benötigt in Qmin_Temperaturjustage ' Output: Geberkonstante_Neu1_m As Double '---Neue Geberkonstante im unteren Bereich[m] Offset_Neu1_m3ph As Double '---Neuer Offset im unteren Bereich [m³/h] Geberkonstante_Neu2_m As Double '---Neue Geberkonstante im oberen Bereich[m] Offset_Neu2_m3ph As Double '---Neuer Offset im oberen Bereich [m³/h] ' Zusatzinfo: JustageArt As String '---Normal, Bereichsjustage, Nachjustage, Temperaturspreizungsjustage DT1 As Double ' neu RH 5.3.2008 DT2 As Double ' zum analysieren ' neu 2012 OGeber_Roh_Neu_ns As Double 'für das Logfile den neu berechneten O-Geber ohne Offset speichern OGeber As Double Fehler1 As Double Fehler2 As Double DiffTof1_ns As Double DiffTof2_ns As Double OffsetGeber_Neu_ns As Double End Type ' History: 26.11.01 - Version 8.19 - Uwe Groß: Korrektur bei der Justage mit Bereichsumschaltung ' 04.12.01 - Version 9.1 - Uwe Groß: Korrektur bei der Berechnung BUist; FP_OGeber wird *-1 übergeben ' 02.01.02 - Version 9.7 - Uwe Groß: Korrektur bei der Berechnung BUist; FP_Bereich wird ZeroFlow befreit, wie µC '******************************************************************************************* Public gudtUSParameter As JustageParameter_Type '******************************************************************************************** ' Author: Uwe Dehne ' Date: 29.04.03 ' Description: berechnet den neuen SteilheitGeber mit Hilfe des alten Wertes und ' einer Vorprüfung bei 50°C ' ' Input: der Fehler bei einer Vormessung bei qmin und 50°C ' der Fehler bei qmin = Definitionsgemäß Sollfluss1 ' die aktuellen Justagewerte aus der Datenbank ' ' Output: SteilheitGeber_nsp°C, der neue SteilheitGeber Wert ' Istfluss1_m3ph, der neue Durchfluß wegen des neuen SteilheitGeber Wertes ' Public Sub Qmin_Temperaturjustage() ' Zwischengrößen für interne Zwecke Dim dblStg As Double Dim dblFst As Double ' Zuerst einmal muessen wir den tatsächlichen Versatz der Fehlerkurven bei ' qmin errechnen und um den Wunschversatz korrigieren ' dazu: erst einmal aus den 20°C Durchfluessen einen Fehler berechnen dblStg = (gudtUSParameter.Istfluss1_m3ph - gudtUSParameter.Sollfluss1_m3ph) / gudtUSParameter.Sollfluss1_m3ph ' und nach % dblStg = dblStg * 100# DebugMsg "Fehler bei 20°C bei Qmin: " & dblStg & " %" ' nun die Differenz berechnen und korrigieren dblStg = dblStg - gudtUSParameter.IstFehler_qmin_50°C + gudtUSParameter.SollFehlerDifferenz_Qmin DebugMsg "Fehlerdifferenz (FehlerQmin20°C - FehlerQmin50°C + SollSpreizung aus DB) = " & dblStg & " %" ' nun aus der %-Angabe einen echten Durchlfuß berechnen ' Bem.: Der ...fluß1 ist per Definition qmin dblStg = (dblStg / 100) * gudtUSParameter.Sollfluss1_m3ph DebugMsg "entspricht Durchfluss = " & dblStg & " m³/h" ' diesen nun in den Zwischenwert Flächenstrom m²/h dblStg = dblStg / gudtUSParameter.Geberkonstante1_IST_m DebugMsg "Flächenstrom = " & dblStg & " m²/h" ' und daraus nun Sekunden berechnen ' ' Bem.: Die Durchflußermittelung geht so: ' Q_US_lph = (DiffTof_ns + OGeber_ns + Temperatur_°C * STGeber_ns) * 0.000001 _ ' * US_Laufzeit(Temperatur_°C) ^ 2 * KGeber_m * 3600 ' also ergibt sich dann daraus zurück gerechnet: ' dblFst = 0.000001 * 3600 * (US_Laufzeit(50) ^ 2 - US_Laufzeit(US.Temperatur1_°C) ^ 2) ' ACHTUNG: Die Formel oben ergibt ltr/h und wir brauchen m3/h dblFst = 0.000001 * 3600# * 55# * US_Laufzeit(55) ^ 2 dblFst = dblFst - (0.000001 * 3600# * gudtUSParameter.Temperatur1_°C * US_Laufzeit(gudtUSParameter.Temperatur1_°C) ^ 2) ' nun aus dieser Zwischengröße ltr/h über m3/h dann Delta ST_Geber in nSec dblStg = dblStg * 1000# / dblFst DebugMsg " Delta ST_Geber = " & dblStg & " nSec" ' und damit jetzt den alten aktuell eingestellten Wert korrigieren gudtUSParameter.SteilheitGeber_nsp°C = gudtUSParameter.SteilheitGeber_nsp°C + dblStg DebugMsg " neuer ST_Geber = " & gudtUSParameter.SteilheitGeber_nsp°C & " nSec" ' und jetzt noch den gemessenen qmin-Wert korrigieren wegen des neuen SteiheitGeber ' dazu: das resultierende Delta berechnen dblFst = dblStg * gudtUSParameter.Temperatur1_°C * 0.000001 * US_Laufzeit(gudtUSParameter.Temperatur1_°C) ^ 2 _ * gudtUSParameter.Geberkonstante1_IST_m * 3600# ' ACHTUNG: Das sind jetzt ltr/h, daraus also m3/h machen: dblFst = dblFst / 1000 ' ich hoffe es ist ab jetzt wieder alles in m3/h ' in dieser Version nicht notwendig ' dblFst = dblFst / gudtUSParameter.Sollfluss1_m3ph ' dblFst = dblFst / 1000 ' nach ltr/h ' dblFst = dblFst * 100 ' nach % DebugMsg "Korrekturwert Qmin (kalt) = " & dblFst & " m³/h" ' und damit jetzt noch den Istdurchfluss korrigieren gudtUSParameter.Istfluss1_m3ph = gudtUSParameter.Istfluss1_m3ph + dblFst DebugMsg "neuer Qmin (kalt) = " & gudtUSParameter.Istfluss1_m3ph & " m³/h" End Sub '******************************************************************************************** Public Sub Justage_Execute() If gudtUSParameter.Unlinearitaet = 0 Then '---keine Bereichsumschaltung '---normale Justage berechnen gudtUSParameter.Geberkonstante_Neu1_m = Geberkonstante_m(gudtUSParameter.Geberkonstante1_IST_m) gudtUSParameter.Offset_Neu1_m3ph = Offset_m3ph(gudtUSParameter.Offset1_IST_m3ph) gudtUSParameter.Geberkonstante_Neu2_m = Geberkonstante_m(gudtUSParameter.Geberkonstante2_IST_m) gudtUSParameter.Offset_Neu2_m3ph = Offset_m3ph(gudtUSParameter.Offset2_IST_m3ph) Else '---Berechnung der Bereichsumschaltung in m³/h Dim DiffTof As Double Dim BUist As Double Dim BUsoll As Double Dim TempSoll As Double Dim TempIst As Double '---Berechnung DiffTof für Bereichsumschaltung DiffTof = gudtUSParameter.Bereich_ns + gudtUSParameter.OffsetGeber_ns - gudtUSParameter.SteilheitGeber_nsp°C * gudtUSParameter.Temperatur1_°C '---BUsoll/ist mit Justageparameter unten und Temperatur unten BUist = Q_US_lph(DiffTof, -gudtUSParameter.OffsetGeber_ns, gudtUSParameter.Temperatur1_°C, gudtUSParameter.Geberkonstante1_IST_m, gudtUSParameter.SteilheitGeber_nsp°C, gudtUSParameter.Offset1_IST_m3ph * 1000) / 1000 BUsoll = BUist + gudtUSParameter.Unlinearitaet * BUist 'Zwischenspeicherung TempSoll = gudtUSParameter.Sollfluss2_m3ph TempIst = gudtUSParameter.Istfluss2_m3ph 'Justage vom Bereichsumschaltpunkt bis Prüfpkt. unten gudtUSParameter.Sollfluss2_m3ph = BUsoll '---oberer Prüfpkt. ist jetzt die Bereichsumschaltung gudtUSParameter.Istfluss2_m3ph = BUist gudtUSParameter.Geberkonstante_Neu1_m = Geberkonstante_m(gudtUSParameter.Geberkonstante1_IST_m) gudtUSParameter.Offset_Neu1_m3ph = Offset_m3ph(gudtUSParameter.Offset1_IST_m3ph) '---Zwischenspeicherung rückgängig gudtUSParameter.Sollfluss2_m3ph = TempSoll gudtUSParameter.Istfluss2_m3ph = TempIst 'Justage vom Trennpunkt bis Prüfpkt. oben '---Berechnung DiffTof für Bereichsumschaltung DiffTof = gudtUSParameter.Bereich_ns + gudtUSParameter.OffsetGeber_ns - gudtUSParameter.SteilheitGeber_nsp°C * gudtUSParameter.Temperatur2_°C '---BUsoll mit Justageparameter oben und Temperatur oben BUist = Q_US_lph(DiffTof, -gudtUSParameter.OffsetGeber_ns, gudtUSParameter.Temperatur2_°C, gudtUSParameter.Geberkonstante2_IST_m, gudtUSParameter.SteilheitGeber_nsp°C, gudtUSParameter.Offset2_IST_m3ph * 1000) / 1000 BUsoll = BUist + gudtUSParameter.Unlinearitaet * BUist '---Zwischenspeicherung und Justage vom Trennpunkt bis Prüfpkt. oben TempSoll = gudtUSParameter.Sollfluss1_m3ph TempIst = gudtUSParameter.Istfluss1_m3ph gudtUSParameter.Sollfluss1_m3ph = BUsoll '---unterer Prüfpkt. ist jetzt die Bereichsumschaltung gudtUSParameter.Istfluss1_m3ph = BUist gudtUSParameter.Geberkonstante_Neu2_m = Geberkonstante_m(gudtUSParameter.Geberkonstante2_IST_m) gudtUSParameter.Offset_Neu2_m3ph = Offset_m3ph(gudtUSParameter.Offset2_IST_m3ph) '---Zwischenspeicherung rückgängig gudtUSParameter.Sollfluss1_m3ph = TempSoll gudtUSParameter.Istfluss1_m3ph = TempIst End If End Sub '******************************************************************************************* ' Author: Uwe Groß (Invensys Metering Systems) ' Date: 31.07.2002 ' Description: Algorithmus zur ZeroFlow Justage. ' ZU ÜBERPRÜFEN: Wie wirkt sich FP_St_Geber ungleich 0 aus!!!!!!!! ' -------------- ' ' Input: Definition der Justage Parameter und Prüfpunkte im Global US: ' ------------------------------------------------------------- ' .Sollfluss1_m3ph As Single '---Solldurchfluß unterer Bereich (m³/h) ' .Sollfluss2_m3ph As Single '---Solldurchfluß oberer Bereich (m³/h) ' .Istfluss1_m3ph As Single '---Istdurchfluß unterer Bereich (m³/h) ' .Istfluss2_m3ph As Single '---Istdurchfluß oberer Bereich (m³/h) ' .Temperatur1_°C As Single '---Wassertemperatur am Prüfpunkt 1 (°C) ' .Temperatur2_°C As Single '---Wassertemperatur am Prüfpunkt 2 (°C) ' .Geberkonstante1_IST_m As Double '---Geberkonstante im unteren Bereich[m] ' .Offset1_IST_m3ph As Double '---Offset im unteren Bereich [m³/h] ' .Geberkonstante2_IST_m As Double '---Geberkonstante im oberen Bereich[m] ' .Offset2_IST_m3ph As Double '---Offset im oberen Bereich [m³/h] ' .Bereich_ns As Double '---Trennpunkt für Bereich oben/unten [ns] nach ZeroFlowJustage ' .SteilheitGeber_nsp°C As Double '---Steilheit Zeroflow [ns/°C] ' .OffsetGeber_ns As Double '---Offset Zeroflow [ns] wie im µC ' .Unlinearitaet As Single '---weiterer additiver Unlinearitätsfehler am Trennpunkt [%] ' 0% bedeutet damit alte Einstellung (z.B. 3%) bleibt unverändert ' Output: ' .Geberkonstante_Neu1_m As Double '---Neue Geberkonstante im unteren Bereich[m] ' .Offset_Neu1_m3ph As Double '---Neuer Offset im unteren Bereich [m³/h] ' .Geberkonstante_Neu2_m As Double '---Neue Geberkonstante im oberen Bereich[m] ' .Offset_Neu2_m3ph As Double '---Neuer Offset im oberen Bereich [m³/h] ' .SteilheitGeber_nsp°C '---Input ZeroFlowSteilheit auf 0 [ns/°C] ' .OffsetGeber_ns '---Input ZeroFlowOffset neu berechnet [ns] ' ' History: 08.08.02: Fehler bei der Toleranzabfrage für FP_O_Geber korregiert. ' 13.08.02: Input für ZeroFlowOffset_ErmitteltAusEinerTemperatur um US.SteilheitGeber_nsp°C und mittlere Temperatur erweitert '***************************************************************************************** Public Sub Justage_mit_ZeroFlow() Dim DT1 As Double Dim DT2 As Double With gudtUSParameter '---DiffToff aus den alten Justageparametern für die Prüfpunkte bestimmen DT1 = Diff_Tof(.Istfluss1_m3ph * 1000, .Temperatur1_°C, .Geberkonstante2_IST_m, .Offset2_IST_m3ph * 1000, .Geberkonstante1_IST_m, .Offset1_IST_m3ph * 1000, -.OffsetGeber_ns, .SteilheitGeber_nsp°C, .Bereich_ns) DT2 = Diff_Tof(.Istfluss2_m3ph * 1000, .Temperatur2_°C, .Geberkonstante2_IST_m, .Offset2_IST_m3ph * 1000, .Geberkonstante1_IST_m, .Offset1_IST_m3ph * 1000, -.OffsetGeber_ns, .SteilheitGeber_nsp°C, .Bereich_ns) .DT1 = DT1 .DT2 = DT2 '---Berechnung des ZeroFlowOffset aus den beiden Justagepunkten für eine Temperatur .OffsetGeber_ns = ZeroFlowOffset_ErmitteltAusEinerTemperatur(DT1, DT2, .Sollfluss1_m3ph, .Sollfluss2_m3ph, .SteilheitGeber_nsp°C, (.Temperatur1_°C + .Temperatur2_°C) / 2) '---Berechnung des Istdurchfluss1&2 bei Verwendung des neuen ZeroFlowOffset .Istfluss1_m3ph = Q_US_Bereich_lph(DT1, -.OffsetGeber_ns, .Temperatur1_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 .Istfluss2_m3ph = Q_US_Bereich_lph(DT2, -.OffsetGeber_ns, .Temperatur2_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 End With '---hydraulische Justage, damit mit dem neuen ZeroFlowOffset '---die Prüfpunkte1&2 zu 0% Fehler führen. End Sub '******************************************************************************************** ' Author: Uwe Groß ' Date: 22.03.2001 ' Description: Bestimmt Offset und Geberkonstante aus 2 Fehlermessungen ' ' Input: Sollfluss1_m3ph : Solldurchfluß 1 (m³/h) ' Sollfluss2_m3ph : Solldurchfluß 2 (m³/h) ' Istfluss1_m3ph : Istdurchfluß 1 (m³/h) ' Istfluss2_m3ph : Istdurchfluß 2 (m³/h) ' Geberkonstante_IST_m : Geberkonstante [m] ' Offset_IST_m3ph : Offset DiffToff bei Zeroflow [m³/h] ' Output: Geberkonstante_m : neuer Geberkonstante [m] ' Offset_m3ph : neuer Offset DiffToff bei Zeroflow [m³/h] ' ' History: 10.05.01 - Version 4.9 - Uwe Groß: Anpassung auf Temperaturkompensation der US-Laufzeit ' 14.05.01 - Version 4.10 -Uwe Groß: Berechnungsfehler beseitigt ' 14.05.01 - Version 8.0 -Uwe Groß: Neue Justage mit Offset_m3ph, dadurch sind die Temperaturen ' als Input nicht mehr nötig ' 06.08.01 - Version 8.5 - Uwe Groß: Die meisten Inputs durch Globals ersetzt '******************************************************************************************* Function Geberkonstante_m(Geberkonstante_IST_m As Double) As Double ' OK wie bei Deplhi, kontrolliert von RH am 5.3.2008 Geberkonstante_m = Geberkonstante_IST_m * (gudtUSParameter.Sollfluss1_m3ph - gudtUSParameter.Sollfluss2_m3ph) / (gudtUSParameter.Istfluss1_m3ph - gudtUSParameter.Istfluss2_m3ph) End Function Function Offset_m3ph(Offset_IST_m3ph As Double) As Double ' OK wie bei Deplhi, kontrolliert von RH am 5.3.2008 Offset_m3ph = (gudtUSParameter.Sollfluss2_m3ph * (gudtUSParameter.Istfluss1_m3ph - Offset_IST_m3ph) - gudtUSParameter.Sollfluss1_m3ph * (gudtUSParameter.Istfluss2_m3ph - Offset_IST_m3ph)) / (gudtUSParameter.Istfluss1_m3ph - gudtUSParameter.Istfluss2_m3ph) End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 22.02.2001 ' Description: Bestimmt den die Laufzeit US in Wasser in Abhängigkeit der Temperatur ' ' Input: Temperatur: Temperatur des Wassers in °C ' Output: Schalllaufzeit in m/s ' '******************************************************************************************* Function US_Laufzeit(Temperatur) ' OK wie bei Deplhi, kontrolliert von RH am 5.3.2008 Const k0 = 1402.38754 Const k1 = 5.03711129 Const k2 = -0.0580852166 Const k3 = 0.000334198834 Const k4 = -0.00000147800417 Const k5 = 3.14643091E-09 US_Laufzeit = k0 + k1 * Temperatur + k2 * Temperatur ^ 2 + k3 * Temperatur ^ 3 + k4 * Temperatur ^ 4 + k5 * Temperatur ^ 5 End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 31.01.2001 ' Description: Bestimmt den Durchfluß für US2000 ' ' Input: DiffTof_ns : Laufzeitdifferenz in ns ' OGeber_ns : Offset Geber in ns (Achtung im µC ist dieser Wert * -1) ' Temperatur_°C: Wassertemperatur in °C ' KGeber_m : Geberkonsante in m aus Querschnitt/2/Wandlerabstand ' STGeber_ns : temperaturabhängige Steilheit für DiffTof_ns ' OFlow_lph : temperaturunabhänige Offsetkorrektur in l/h ' ' Output: Ergebnis in l/h ' ' History: 15.05.01 neue Berechnungsformel mit US-Laufzeit aus Temperatur ermittelt ' 19.06.01 temperaturunabhängiger Offset und Unlinearitätsausgleich hinzugefügt ' 06.08.01 temperaturabhängige Steilheit für DiffTof_ns hinzugefügt ' UnLinAbgl entfernt '******************************************************************************************* Function Q_US_lph(DiffTof_ns As Double, OGeber_ns As Double, Temperatur_°C As Double, KGeber_m As Double, STGeber_ns As Double, OFlow_lph As Double) As Double '--Durchflußermittelung nach konventioneller Art Q_US_lph = (DiffTof_ns + OGeber_ns + Temperatur_°C * STGeber_ns) * 0.000001 _ * US_Laufzeit(Temperatur_°C) ^ 2 * KGeber_m * 3600 '--temperaturunabhängiger Offset Q_US_lph = OFlow_lph + Q_US_lph End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 02.01.2002 ' Description: Bestimmt den Durchfluß für US2000 mit Bereichsumschaltung ' ' Input: DiffTof_ns : Laufzeitdifferenz in ns ' OGeber_ns : Offset Geber in ns (Achtung im µC ist dieser Wert * -1) ' Temperatur_°C: Wassertemperatur in °C ' KGeberUNTEN_m : Geberkonstante in m für unteren Bereich ' KGeberOBEN_m : Geberkonstante in m für oberen Bereich ' STGeber_ns : temperaturabhängige Steilheit für DiffTof_ns ' OFlowUNTEN_lph : temperaturunabhänige Offsetkorrektur in l/h für unteren Bereich ' OFlowOBEN_lph : temperaturunabhänige Offsetkorrektur in l/h für oberen Bereich ' Bereich_ns : Bereichsumschaltung in ns ' k0 bis k5 Koeffizienten 5. Ordnung für US-Laufzeitkompensation ' ' Output: Ergebnis in l/h ' ' History: 12.06.02 US-LZ Koeffizienten als Input entfernt ' 09.08.02 Definition des Inputs als Single bzw. Double sonst Absturz bei undefiniertem Input '******************************************************************************************* Function Q_US_Bereich_lph(DiffTof_ns As Double, OGeber_ns As Double, Temperatur_°C As Double, KGeberUNTEN_m As Double, KGeberOBEN_m As Double, STGeber_ns As Double, OFlowUNTEN_lph As Double, OFlowOBEN_lph As Double, Bereich_ns As Double) As Double Dim DT As Double '---DiffTof in ns nach ZeroFlow Korrektur DT = (DiffTof_ns + OGeber_ns + Temperatur_°C * STGeber_ns) '--Durchflußermittelung If DT < Bereich_ns Then Q_US_Bereich_lph = DT * 0.000001 * US_Laufzeit(Temperatur_°C) ^ 2 * KGeberUNTEN_m * 3600 + OFlowUNTEN_lph Else Q_US_Bereich_lph = DT * 0.000001 * US_Laufzeit(Temperatur_°C) ^ 2 * KGeberOBEN_m * 3600 + OFlowOBEN_lph End If End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 25.09.2001 ' Description: Bestimmt aus dem Durchfluß ein mittleres Diff_Tof ' ' Input: Durchfluß_lph: Laufzeitdifferenz in ns ' Temperatur_°C: Wassertemperatur in °C ' KGeber_m : Geberkonsante in m aus Querschnitt/2/Wandlerabstand ' OFlow_lph : temperaturunabhänige Offsetkorrektur in l/h ' O_Geber_ns : temperaturabhängige Offsetkorrektur in ns (Achtung im µC ist dieser Wert * -1) ' ST_Geber_nsPerGradC: temperaturabhängige Steilheitskorrektur in ns/°C ' Output: Ergebnis in ns ' ' History: 16.11.01 O_Geber_ns und ST_Geber_nsPerGradC als zusätzlicher Input ' 22.11.01 Bereichumschaltung eingefügt und Input entsprechend erweitert ' 11.01.02 US-LZ Koeffizienten als Input aufgenommen ' 12.06.02 US-LZ Koeffizienten als Input wieder entfernt ' 09.08.02 Definition des Inputs als Single bzw. Double sonst Absturz bei undefiniertem Input '******************************************************************************************* Private Function Diff_Tof(Durchfluß_lph As Double, _ Temperatur_°C As Double, _ KGeberOBEN_m As Double, _ OFlowOBEN_lph As Double, _ KGeberUNTEN_m As Double, _ OFlowUNTEN_lph As Double, _ O_Geber_ns As Double, _ ST_Geber_nsPerGradC As Double, _ Bereich_ns As Double) As Double Dim Diff_TofOben As Double Dim Diff_TofUnten As Double Diff_TofOben = ((Durchfluß_lph - OFlowOBEN_lph) / 3600000 / KGeberOBEN_m / US_Laufzeit(Temperatur_°C) ^ 2 * 1000000000#) Diff_TofUnten = ((Durchfluß_lph - OFlowUNTEN_lph) / 3600000 / KGeberUNTEN_m / US_Laufzeit(Temperatur_°C) ^ 2 * 1000000000#) If Diff_TofUnten < Bereich_ns Then Diff_Tof = Diff_TofUnten - O_Geber_ns - ST_Geber_nsPerGradC * Temperatur_°C Else Diff_Tof = Diff_TofOben - O_Geber_ns - ST_Geber_nsPerGradC * Temperatur_°C End If End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 31.07.2002 ' Description: Bestimmt den ZeroFlow Offset aus dem Input bei gleicher Temperatur. ' Die Temperatur für Sollfluss1_m3ph und Sollfluss2_m3ph muß ungefähr ' (ca. +-5°C) gleich sein. ' Input: DiffTof1_ns : DiffTof bei Sollfluss1_m3ph [ns] ' DiffTof2_ns : DiffTof bei Sollfluss2_m3ph [ns] ' Sollfluss1_m3ph : Solldurchfluß unterer Bereich (m³/h) ' Sollfluss2_m3ph : Solldurchfluß oberer Bereich (m³/h) ' SteilheitGeber_nsp°C: ZeroFlow Steilheit [ns/°C] ' Temperatur_°C : mittlere Temperatur der Prüfpkt. Sollfluss1_m3ph und Sollfluss2_m3ph ' Output: ' History: 13.08.2002 Version 9.16: Fehler im Quotienten Sollfluss2 mit Sollfluss1 vertauscht. ' Input um SteilheitGeber_nsp°C und Temperatur_°C erweitert und ' im Algorithmus berücksichtigt. '******************************************************************************************* Private Function ZeroFlowOffset_ErmitteltAusEinerTemperatur(DiffTof1_ns As Double, _ DiffTof2_ns As Double, _ Sollfluss1_m3ph As Double, _ Sollfluss2_m3ph As Double, _ SteilheitGeber_nsp°C As Double, _ Temperatur_°C As Double) ZeroFlowOffset_ErmitteltAusEinerTemperatur = (Sollfluss2_m3ph * DiffTof1_ns - Sollfluss1_m3ph * DiffTof2_ns) / _ (Sollfluss2_m3ph - Sollfluss1_m3ph) + Temperatur_°C * SteilheitGeber_nsp°C End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 19.02.2001 ' Description: Wandelt eine positive Dezimalzahl in eine Hexdezimale Zahl ' ' Input: Dezimalzahl >0 ' Stellen_Anzahl > 1 der Hexadezimalen Zahl ' Output: Hexadezimale Zahl ' ' History: '******************************************************************************************* Public Function Positive_HexWandelung(Dezimalzahl As Long, Stellen_Anzahl As Long) As String 'Checken des Input-Bereiches If Dezimalzahl >= 16 ^ Stellen_Anzahl Then 'Positive_HexWandelung = "OVERFLOW" Err.Raise 0, "Positive_HexWandelung", "OVERFLOW" Exit Function End If Stellen_Anzahl = Int(Stellen_Anzahl) - 1 If (Dezimalzahl < 0 Or Stellen_Anzahl < 0) Then 'Positive_HexWandelung = "ERROR" Err.Raise 0, "Positive_HexWandelung", "ERROR" Exit Function End If Dim i As Integer Dim A As Long If Positive_HexWandelung = "" Then '---Weiter wenn kein Input Fehler vorliegt For i = Stellen_Anzahl To 0 Step -1 A = 0 Do While Dezimalzahl - 16 ^ i >= 0 Dezimalzahl = Dezimalzahl - 16 ^ i A = A + 1 Loop Positive_HexWandelung = Positive_HexWandelung + Hex(A) Next i End If End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 21.02.2001 ' Description: Wandelt eine Hexdezimale Zahl in eine Dezimalzahl mit Beachtung des Vorzeichens ' Ist das MSB=1 wird die HexZahl als negative Zahl im 2er Komplement betrachtet ' Input: Hexzahl ' Output: Dezimalzahl vorzeichenbehaftet ' ' History: '******************************************************************************************* Private Function Vorzeichen_DezWandelung(strHexZahl As String) As Long Dim lngReturn As Long '8. Bit von rechts auf 1 - bzw. hier 4. Bit von rechts in einem Nibbel lngReturn = CLng("&H" & strHexZahl) If (CLng("&h" + Left$(strHexZahl, 1)) And 8) = 8 Then 'Hexzahl ist negativ - entsprechend der Länge der HexZahl FFFFF+1 abziehen lngReturn = lngReturn - (CLng("&H" & (String$(Len(strHexZahl), "F"))) + 1) End If Vorzeichen_DezWandelung = lngReturn End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 18.04.2001 ' Description: Wandelt eine Float-Zahl MSP430 Format in eine ' gebrochene Dezimalzahl ' Input: FloatMSP430: Hexadezimale Zahl im Format "XXXXXXXX" als String mit: ' e ,sn, m ' 31...24,23,22....0 ' Output: FloatMSP430_To_DEZ=-1^sn*(1+M/2^23)*2^(e-128) ' mit sn=-1^s entspricht -1 und sn=0 entspricht +1 ' History: 18.09.01 - Uwe Groß - FloatMSP430 = "00000000" führt zu 0,00 '******************************************************************************************* Public Function FloatMSP430_To_DEZ(FloatMSP430 As String) As Double Dim sn As Integer Dim m As Double Dim e As Double If Len(FloatMSP430) <> 8 Then 'FloatMSP430_To_DEZ = "Error: Length<>8" Err.Raise "0", "FloatMSP430_To_DEZ", "Length<>8" Else If FloatMSP430 = "00000000" Then FloatMSP430_To_DEZ = 0 Else '--Bestimmung des Vorzeichens sn = Int("&h" + Mid$(FloatMSP430, 3, 1)) And 8 If sn = 0 Then sn = 1 Else sn = -1 End If '--Berechnung des Exponenten von 2 e = (Int("&h" + Mid$(FloatMSP430, 1, 2))) - 128 '--Berechnung der Mantisse m = (Int("&h" + Mid$(FloatMSP430, 3, 6)) And &H7FFFFF) / (2 ^ 23) + 1 '--Berechnung der gebrochenen Dezimalzahl FloatMSP430_To_DEZ = sn * m * (2 ^ e) End If End If End Function '******************************************************************************************** ' Author: Uwe Groß ' Date: 18.04.2001 ' Description: Wandelt eine gebrochene Dezimalzahl in eine ' Float-Zahl MSP430 Format ' Input: Dezimal: gebrochene Dezimalzahl ' Output: DEZ_To_FloatMSP430 im Format "XXXXX" als String mit: ' e ,sn, m ' 40...24,23,22....0 ' mit sn=1 entspricht -1 und sn=0 entspricht +1 ' History: 12.06.01 (Uwe Groß) Abfrage auf m >=; zusätzlich kommentiert in Source '******************************************************************************************* Public Function DEZ_To_FloatMSP430(Dezimal As Double) As String Dim sn As Long Dim e As Long Dim m As Double '--Bestimmung des Vorzeichens If Dezimal < 0 Then sn = 2 ^ 23 Dezimal = Dezimal * -1 Else sn = 0 End If '--Bestimmung des Exponenten von 2 und der Mantisse If Dezimal <> 0 Then e = 0 m = Dezimal * 2 ^ 151 '---Änderung 12.06.01/Uwe Groß Abfrage auf m >= Do While (m >= 2 ^ 24) '---max. Mantisse + 2^23 m = m / 2 e = e + 1 Loop m = Dezimal * 2 ^ (151 - e) - 2 ^ 23 m = sn + m '---Vorzeichen verheiraten Else e = 0 End If '--Bestimmung des hexadezimalen String für MSP430 float format If e > 255 Then 'DEZ_To_FloatMSP430 = "Error: Overflow" Err.Raise 0, "DEZ_To_FloatMSP430", "Overflow" Else DEZ_To_FloatMSP430 = Right$("0" + Hex$(e), 2) + _ Right$("000000" + Hex$(m), 6) ' a = Hex$(m) End If End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' neu RH 6.1.2011 '{******************************************************************************* 'Author: Frank Leidel 'Datum: 12.11.2011 'Beschreibung: Rechnet den Offset zum neuen O-Geber hinzu 'Input: Offset_m3ph : Offset in m³/h 'KGeber_m : Geberkonstante in m 'OGeber_ns : O-Geber in ns 'Temperatur : Wassertemperatur in °C 'Output: Ergebnis in ns '*******************************************************************************} Public Function OffsetZumOGeber_ns(Offset_m3ph As Double, KGeber_m As Double, OGeber_ns, Temperatur As Double) As Double Dim Laufzeit As Double Laufzeit = US_Laufzeit(Temperatur) OffsetZumOGeber_ns = (Offset_m3ph / ((Laufzeit * Laufzeit) * KGeber_m * 3600) * (-1)) * 1000000000 + OGeber_ns End Function ' hinzugefügt am 6.1.2012 von R.Henning: '{******************************************************************************* 'Author: Uwe Groß 'Datum: 22.03.2001 'Beschreibung: Berechnung Geberkonstanten und Offsets 'Input: EPS : Einzelprüfstandsnummer '*******************************************************************************} Public Sub Justage_Execute_FW2() With gudtUSParameter '//---normale Justage berechnen 'Geberkonstante_Neu1_m := Geberkonstante_m(EPS, Geberkonstante1_IST_m); .Geberkonstante_Neu1_m = Geberkonstante_m(.Geberkonstante1_IST_m) 'Geberkonstante_Neu2_m := Geberkonstante_m(EPS, Geberkonstante2_IST_m); .Geberkonstante_Neu2_m = Geberkonstante_m(.Geberkonstante2_IST_m) ' Offset1_Neu_m3ph := Offset_m3ph(EPS, Offset1_IST_m3ph); .Offset_Neu1_m3ph = Offset_m3ph(.Offset1_IST_m3ph) ' Offset2_Neu_m3ph := Offset_m3ph(EPS, Offset2_IST_m3ph); .Offset_Neu2_m3ph = Offset_m3ph(.Offset2_IST_m3ph) ' // ---- ab hier neue Justage ---------------------------------------- ' // für das Logfile den neu berechneten O-Geber ohne Offset speichern ' OGeber_Roh_Neu_ns := OffsetGeber_Neu_ns; ''' .OGeber_Roh_Neu_ns = .OffsetGeber_ns .OGeber_Roh_Neu_ns = .OffsetGeber_Neu_ns ' Korrektur RH 18.9.2013 mit F.Leidel: .OffsetGeber_Neu_ns = 0 ' Korrektur RH 18.9.2013 mit F.Leidel: ' ' // Offset zum O-Geber hinzu rechnen ' ' OffsetGeber_Neu_ns := OffsetZumOGeber_ns(Offset1_Neu_m3ph, Geberkonstante1_IST_m,OffsetGeber_Neu_ns, Temperatur1); ' ' .OffsetGeber_Neu_ns = OffsetZumOGeber_ns(.Offset_Neu1_m3ph, .Geberkonstante1_IST_m, .OffsetGeber_Neu_ns, .Temperatur1_°C) ' RH: wieso eigentlich nur Temperatur1? '// Offset nullen 'Offset1_Neu_m3ph := 0; .Offset_Neu1_m3ph = 0 'Offset2_Neu_m3ph := 0; .Offset_Neu2_m3ph = 0 .OffsetGeber_ns = .OffsetGeber_Neu_ns End With End Sub '{******************************************************************************* 'Author: Uwe Groß 'Datum: 15.08.2002 'Beschreibung: Berechnung Zeroflow 'Input: EPS : Einzelprüfstandsnummer '*******************************************************************************} Public Sub Justage_mit_Zeroflow_FW2() Dim DT_1 As Double Dim DT_2 As Double Dim OGeber As Double With gudtUSParameter If (.DiffTof1_ns < 0.01) And (.DiffTof2_ns < 0.01) Then ' // DiffToff aus den alten Justageparametern für die Prüfpunkte bestimmen 'DT1 := Diff_Tof(IstFluss1_m3ph * 1000, Temperatur1, GeberKonstante2_Ist_m,Offset2_Ist_m3ph * 1000, GeberKonstante1_Ist_m, Offset1_Ist_m3ph * 1000,-OffsetGeber_ns, SteilheitGeber_nspC, Bereich_ns); .DT1 = Diff_Tof(.Istfluss1_m3ph * 1000, .Temperatur1_°C, .Geberkonstante2_IST_m, .Offset2_IST_m3ph * 1000, .Geberkonstante1_IST_m, .Offset1_IST_m3ph * 1000, -.OffsetGeber_ns, .SteilheitGeber_nsp°C, .Bereich_ns) 'DT2 := Diff_Tof(IstFluss2_m3ph * 1000, Temperatur2, GeberKonstante2_Ist_m,Offset2_Ist_m3ph * 1000, GeberKonstante1_Ist_m, Offset1_Ist_m3ph * 1000,-OffsetGeber_ns, SteilheitGeber_nspC, Bereich_ns); .DT2 = Diff_Tof(.Istfluss2_m3ph * 1000, .Temperatur2_°C, .Geberkonstante2_IST_m, .Offset2_IST_m3ph * 1000, .Geberkonstante1_IST_m, .Offset1_IST_m3ph * 1000, -.OffsetGeber_ns, .SteilheitGeber_nsp°C, .Bereich_ns) '// neu !!! DiffTof um der Fehler verändern 'DT_1 := DT1 * (100 - Fehler1) / 100; DT_1 = .DT1 * (100 - .Fehler1) / 100 'DT_2 := DT2 * (100 - Fehler2) / 100; DT_2 = .DT2 * (100 - .Fehler2) / 100 '// für das Logfile die berenteten DiffTofs als negativen Wert speichern 'DiffTof1_ns := DT1 * (-1); .DiffTof1_ns = .DT1 * (-1) 'DiffTof2_ns := DT2 * (-1); .DiffTof2_ns = .DT2 * (-1) Else '// gemessene DiffTof übernehmen .DT1 = .DiffTof1_ns .DT2 = .DiffTof2_ns End If '// Berechnung des ZeroFlowOffset aus den beiden Justagepunkten für einer '// Temperatur '// OffsetGeber_Neu_ns := ZeroFlowOffset_ErmittelnAusEinerTemperatur(DT1, DT2, Sollfluss1_m3ph, Sollfluss2_m3ph, SteilheitGeber_nspC,(Temperatur1 + Temperatur2) / 2); Diese Funktion bitte entfernen! FL '// .OffsetGeber_Neu_ns = ZeroFlowOffset_ErmitteltAusEinerTemperatur(.DT1, .DT2, .Sollfluss1_m3ph, .Sollfluss2_m3ph, .SteilheitGeber_nsp°C, (.Temperatur1_°C + .Temperatur2_°C) / 2) ' ' Geraden-Abgleich ' 'OGeber := ZeroFlowOffset_ErmittelnAusEinerTemperatur(DT_1, DT_2, Sollfluss1_m3ph, Sollfluss2_m3ph, SteilheitGeber_nspC,(Temperatur1 + Temperatur2) / 2); ' .OGeber = ZeroFlowOffset_ErmitteltAusEinerTemperatur(DT_1, DT_2, .Sollfluss1_m3ph, .Sollfluss2_m3ph, .SteilheitGeber_nsp°C, (.Temperatur1_°C + .Temperatur2_°C) / 2) ' Korrektur RH mit F.Leidel am 18.9.2013 ' o_geber_roh in Nano sekunden .OffsetGeber_Neu_ns = ZeroFlowOffset_ErmitteltAusEinerTemperatur(.DT1, .DT2, .Sollfluss1_m3ph, .Sollfluss2_m3ph, .SteilheitGeber_nsp°C, (.Temperatur1_°C + .Temperatur2_°C) / 2) ' Korrektur RH mit F.Leidel am 18.9.2013 ''OffsetGeber_Neu_ns := DT1 - DT_1 + OffsetGeber_ns + OGeber '' Hier stand ein falscher Variabelname; ''.OffsetGeber_Neu_ns = .DT1 - DT_1 + .OffsetGeber_ns + .OGeber '// Berechnung des Istdurchfluss1&2 bei Verwendung des neuen ZeroFlowOffset 'IstFluss1_m3ph := Q_US_Bereich_lph(DT1, -OffsetGeber_Neu_ns, Temperatur1, GeberKonstante1_Ist_m,GeberKonstante2_Ist_m, SteilheitGeber_nspC, Offset1_Ist_m3ph * 1000,Offset2_Ist_m3ph * 1000, Bereich_ns) / 1000; .Istfluss1_m3ph = Q_US_Bereich_lph(.DT1, -.OffsetGeber_Neu_ns, .Temperatur1_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 'IstFluss2_m3ph := Q_US_Bereich_lph(DT2, -OffsetGeber_Neu_ns, Temperatur2, GeberKonstante1_Ist_m,GeberKonstante2_Ist_m, SteilheitGeber_nspC, Offset1_Ist_m3ph * 1000,Offset2_Ist_m3ph * 1000, Bereich_ns) / 1000; .Istfluss2_m3ph = Q_US_Bereich_lph(.DT2, -.OffsetGeber_Neu_ns, .Temperatur2_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 End With End Sub '======================================================================================================================== 'Justage in 2 Schritten(F.L. 16.10.13) 'Der Ablauf der Justage in 2 Schritten: 'Zuerst den Prüfpunkt Qp justieren durch neuen K_Geber1+2 mit Offset_Geber_ist(O_Gerber_roh aus dem Gerät)) 'Im zweiten Schritt den Prüfpunkt Qi justieren durch Offset_Geber_neu(O_Gerber_roh neu) 'Ziel ist die Berechnung vom Offset_Geber ohne Beeinflussung der Korrektur des K_Gebers ' neuer Name! Public Sub Justage1_Execute_FW2(SollwertQi As Double) '1. Schritt 'Beschreibung: Berechnung Geberkonstanten nur aus Prüfpunkt Qp der Justage 'Input=Sollfluss2; Istfluss2; Sollfluss1(feste Vorgabe), Istfluss1(feste Vorgabe) 'Vorgabe Sollfluss1 und Istfluss1: qp25=0,25m³/h;qp40=0,4m³/h;qp60=0,6m€/h 'An dieser Stelle die Vorgabewerte an die Variablen Sollfluss1 und Istfluss1 übergeben 'Variable Sollwertqi soll den Prüfwert für Qisoll bekommen With gudtUSParameter .Sollfluss1_m3ph = SollwertQi .Istfluss1_m3ph = SollwertQi 'Berechnung Geberkonstante neu aus Qp Prüfung und feste Vorgabewerte für Sollfluss1 und Istfluss1 'Geberkonstante_Neu1_m := Geberkonstante_m(EPS, Geberkonstante1_IST_m); .Geberkonstante_Neu1_m = Geberkonstante_m(.Geberkonstante1_IST_m) 'Geberkonstante_Neu2_m := Geberkonstante_m(EPS, Geberkonstante2_IST_m); .Geberkonstante_Neu2_m = Geberkonstante_m(.Geberkonstante2_IST_m) End With End Sub '''''2.Schritt '''''Beschreibung: Berechnung der restlichen Geberkonstanten außer K_Geber1+2 nach Prüfpunkt Qi bei der Justage) '''''{******************************************************************************* '''''Author: Uwe Groß '''''Datum: 22.03.2001 '''''Beschreibung: Berechnung Geberkonstanten und Offsets '''''Input: EPS : Einzelprüfstandsnummer '''''*******************************************************************************} ''''' neuer Name! ''''Public Sub Justage2_Execute_FW2() '''' With gudtUSParameter '''' '//---normale Justage berechnen '''' ''''' Offset1_Neu_m3ph := Offset_m3ph(EPS, Offset1_IST_m3ph); '''' .Offset_Neu1_m3ph = Offset_m3ph(.Offset1_IST_m3ph) ''''' Offset2_Neu_m3ph := Offset_m3ph(EPS, Offset2_IST_m3ph); '''' .Offset_Neu2_m3ph = Offset_m3ph(.Offset2_IST_m3ph) '''' '''' ' // ---- ab hier neue Justage ---------------------------------------- '''' ' // für das Logfile den neu berechneten O-Geber ohne Offset speichern '''' '''' .OGeber_Roh_Neu_ns = .OffsetGeber_Neu_ns '''' '''' ' Korrektur RH 18.9.2013 mit F.Leidel: '''' .OffsetGeber_Neu_ns = 0 '''' '''' '// Offset nullen '''' 'Offset1_Neu_m3ph := 0; '''' .Offset_Neu1_m3ph = 0 '''' '''' 'Offset2_Neu_m3ph := 0; '''' .Offset_Neu2_m3ph = 0 '''' '''' .OffsetGeber_ns = .OffsetGeber_Neu_ns '''' End With ''''End Sub '{******************************************************************************* 'Author: Uwe Groß 'Datum: 15.08.2002 'Beschreibung: Berechnung Zeroflow 'Input: EPS : Einzelprüfstandsnummer '*******************************************************************************} ' neuer Name! Public Sub Justage3_mit_Zeroflow_FW2() Dim DT_1 As Double Dim DT_2 As Double Dim OGeber As Double With gudtUSParameter .Fehler1 = 100 * (.Istfluss1_m3ph - .Sollfluss1_m3ph) / .Sollfluss1_m3ph ''' .Istfluss1_m3ph = Q_US_Bereich_lph(.DT1, -.OffsetGeber_Neu_ns, .Temperatur1_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 ' If (.DiffTof1_ns < 0.01) And (.DiffTof2_ns < 0.01) Then ' // DiffToff aus den alten Justageparametern für die Prüfpunkte bestimmen '.Istfluss2_m3ph = Q_US_Bereich_lph(.DT2, -.OffsetGeber_ns, .Temperatur2_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 'DT1 := Diff_Tof(IstFluss1_m3ph * 1000, Temperatur1, GeberKonstante2_Ist_m,Offset2_Ist_m3ph * 1000, GeberKonstante1_Ist_m, Offset1_Ist_m3ph * 1000,-OffsetGeber_ns, SteilheitGeber_nspC, Bereich_ns); .DT1 = Diff_Tof(.Istfluss1_m3ph * 1000, .Temperatur1_°C, .Geberkonstante2_IST_m, .Offset2_IST_m3ph * 1000, .Geberkonstante1_IST_m, .Offset1_IST_m3ph * 1000, -.OffsetGeber_ns, .SteilheitGeber_nsp°C, .Bereich_ns) 'DT2 := Diff_Tof(IstFluss2_m3ph * 1000, Temperatur2, GeberKonstante2_Ist_m,Offset2_Ist_m3ph * 1000, GeberKonstante1_Ist_m, Offset1_Ist_m3ph * 1000,-OffsetGeber_ns, SteilheitGeber_nspC, Bereich_ns); .DT2 = Diff_Tof(.Istfluss2_m3ph * 1000, .Temperatur2_°C, .Geberkonstante2_IST_m, .Offset2_IST_m3ph * 1000, .Geberkonstante1_IST_m, .Offset1_IST_m3ph * 1000, -.OffsetGeber_ns, .SteilheitGeber_nsp°C, .Bereich_ns) ' Korrektur RH mit F.Leidel am 18.9.2013 ' o_geber_roh in Nano sekunden '.OffsetGeber_Neu_ns = ZeroFlowOffset_ErmitteltAusEinerTemperatur(.DT1, .DT2, .Sollfluss1_m3ph, .Sollfluss2_m3ph, .SteilheitGeber_nsp°C, (.Temperatur1_°C + .Temperatur2_°C) / 2) .OGeber_Roh_Neu_ns = ZeroFlowOffset_ErmitteltAusEinerTemperatur(.DT1, .DT2, .Sollfluss1_m3ph, .Sollfluss2_m3ph, .SteilheitGeber_nsp°C, (.Temperatur1_°C + .Temperatur2_°C) / 2) '// Berechnung des Istdurchfluss1&2 bei Verwendung des neuen ZeroFlowOffset 'IstFluss1_m3ph := Q_US_Bereich_lph(DT1, -OffsetGeber_Neu_ns, Temperatur1, GeberKonstante1_Ist_m,GeberKonstante2_Ist_m, SteilheitGeber_nspC, Offset1_Ist_m3ph * 1000,Offset2_Ist_m3ph * 1000, Bereich_ns) / 1000; 'Berechnung des Istfluss2 entfällt weil schon im Schritt1 ermittelt, kleine Abweichung weil ohne Offsetgeber neu ist egal 'IstFluss2_m3ph := Q_US_Bereich_lph(DT2, -OffsetGeber_Neu_ns, Temperatur2, GeberKonstante1_Ist_m,GeberKonstante2_Ist_m, SteilheitGeber_nspC, Offset1_Ist_m3ph * 1000,Offset2_Ist_m3ph * 1000, Bereich_ns) / 1000; 'entfällt .Istfluss2_m3ph = Q_US_Bereich_lph(.DT2, -.OffsetGeber_Neu_ns, .Temperatur2_°C, .Geberkonstante1_IST_m, .Geberkonstante2_IST_m, .SteilheitGeber_nsp°C, .Offset1_IST_m3ph * 1000, .Offset2_IST_m3ph * 1000, .Bereich_ns) / 1000 End With End Sub Public Sub Justage_o_geber_roh() ' Extrahiert am 6.11.2013 aus dem Excel Blatt "Kopie von Test 40 Justage in 2 Schritten Qp25 33365171 05 11 13.xls" Dim Q_Offset_1 As Double Dim Q_Offset_2 As Double Dim Q_in_Difftof_1 As Double Dim Q_in_Difftof_2 As Double Dim Difftof_1_roh_in_s As Double Dim Difftof_2_roh_in_s As Double Dim Difftof1 As Double Dim Difftof2 As Double Dim temp As Double Dim Temp1 As Double Dim Temp2 As Double Dim fp_k_geber_roh As Double Dim fp_st_geber_roh As Double Dim OffsetGeber_ns As Double fp_st_geber_roh = 0 fp_k_geber_roh = 1 OffsetGeber_ns = 0 With gudtUSParameter 'J41 = I41-E9 Q_Offset_1 = .Istfluss1_m3ph - .Offset1_IST_m3ph 'J37 = I37-E9 Q_Offset_2 = .Istfluss2_m3ph - .Offset2_IST_m3ph 'K41 = J41/((Q12*Q12)*H25*3600) Q_in_Difftof_1 = Q_Offset_1 / ((US_Laufzeit(.Temperatur1_°C) ^ 2) * .Geberkonstante1_IST_m * 3600) 'K37 = J37 /((Q12*Q12)*E8*3600) Q_in_Difftof_2 = Q_Offset_2 / ((US_Laufzeit(.Temperatur2_°C) ^ 2) * .Geberkonstante2_IST_m * 3600) ' L41 = K41 + E10 - (J2 * E12) ' Difftof_1_roh_in_s = Q_in_Difftof_1 + O_Geber - (Temp1 * fp_st_Geber) Difftof_1_roh_in_s = Q_in_Difftof_1 + OffsetGeber_ns - (.Temperatur1_°C * (.SteilheitGeber_nsp°C / 10 ^ 9)) 'L37 = K37 + E10 + (G2 * E12) 'Difftof_2_roh_in_s = Q_in_Difftof_2 + O_Geber + (Temp2 * fp_st_Geber) Difftof_2_roh_in_s = Q_in_Difftof_2 + OffsetGeber_ns - (.Temperatur2_°C * (.SteilheitGeber_nsp°C / 10 ^ 9)) 'Difftof1 = G45 = M41 = (L41 + E11 - (J2 * L11)) * L12 'Difftof1 = (Difftof_1_roh_in_s + O_Geber_roh - (Temp1 * fp_st_geber_roh)) * fp_k_geber_roh Difftof1 = (Difftof_1_roh_in_s + (.OffsetGeber_ns / 10 ^ 9) - (.Temperatur1_°C * fp_st_geber_roh)) * fp_k_geber_roh 'H45 = I56 = M37 = (L37 + E11 - (G2 * L11)) * L12 'Difftof2 = (Difftof_2_roh_in_s + O_Geber_roh - (Temp2 * fp_st_geber_roh)) * fp_k_geber_roh Difftof2 = (Difftof_2_roh_in_s + (.OffsetGeber_ns / 10 ^ 9) - (.Temperatur2_°C * fp_st_geber_roh)) * fp_k_geber_roh ' gemittelte Temperatur temp = (.Temperatur1_°C + .Temperatur2_°C) / 2 'I45 = (F45 * G45 - E45 * H45) / (F45 - E45) + C45 * E12 'fp_o_Geber_roh_neu = (Sollfluss2 * Difftof1 - Sollfluss1 * Difftof2) / (Sollfluss2 - Sollfluss1) + Temp * fp_st_Geber Dim OGeber_Roh_Neu_sec As Double OGeber_Roh_Neu_sec = (.Sollfluss2_m3ph * Difftof1 - .Sollfluss1_m3ph * Difftof2) / (.Sollfluss2_m3ph - .Sollfluss1_m3ph) + temp * (.SteilheitGeber_nsp°C / 10 ^ 9) .OGeber_Roh_Neu_ns = OGeber_Roh_Neu_sec * 10 ^ 9 End With End Sub