Просмотр исходного кода

fix hanging digits in transition

Frank Haverland 3 лет назад
Родитель
Сommit
1ab135e989

+ 9 - 18
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -215,21 +215,6 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
         return result;
     }
 
-  /*  if ((ziffer_vorgaenger >= DigitalUebergangsbereichVorgaengerAnalogToDigit ) && (ziffer_vorgaenger <= (10.0 - DigitalUebergangsbereichVorgaengerAnalogToDigit)))
-    {
-        Bei DigitalUebergangsbereichVorgaengerAnalogToDigit verursacht runden weitere Fehler
-        // kein Ziffernwechsel, da Vorgänger weit genug weg ist (0+/-DigitalUebergangsbereichVorgaenger) --> zahl wird gerundet
-        if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8))     // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
-            result = ((int) trunc(zahl) + 10) % 10;
-        else
-            result = ((int) round(zahl) + 10) % 10;
-        
-        result = ((int) trunc(zahl) + 10) % 10;
-        if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - kein Ziffernwechsel, da Vorkomma weit genug weg = " + std::to_string(result) +
-                                                    " zahl: " + std::to_string(zahl) + " ziffer_vorgaenger = " + std::to_string(ziffer_vorgaenger) + " DigitalUnschaerfe = " +  std::to_string(DigitalUnschaerfe));
-        return result;
-    }  
-*/
     if (ziffer_vorgaenger <= 3 && eval_vorgaenger<9)  // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
         // aber Sonderfall ziffer_vorgaeger = 0.1 vor_vorgaenger 9.9 => eval_vorgaenger ist 9, damit hat Nulldurchgang nicht stattgefunden.
     {
@@ -250,9 +235,15 @@ int ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu(float zahl, float ziffer_vor
     // dig=4.8, ana=5.5 => dig=4
 
     // Aber zwischen ziffer_vorgaenger 3..8 keine Veränderung
-    if (ergebnis_nachkomma >= 1 || (ziffer_vorgaenger>3 && ziffer_vorgaenger<8) )
-        result =  ergebnis_vorkomma;
-    else
+    if (ergebnis_nachkomma >= 1 || (ziffer_vorgaenger>3 && ziffer_vorgaenger<8) ) {
+
+        // Ziffer bleibt bei x.8 oder x.9 "hängen", kommt also nicht richtig auf x.0
+        // muss eine Rundung erfolgen
+        if (eval_vorgaenger<8 && ergebnis_nachkomma >= 8)   
+            result = ((int) round(zahl) + 10) % 10;
+        else
+            result = ergebnis_vorkomma;
+    } else
         result =  (ergebnis_vorkomma - 1 + 10) % 10;
 
     if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalAnalogToDigitNeu - 9.0 --> noch kein Nulldurchgang = " + std::to_string(result) +

+ 19 - 3
code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp

@@ -305,10 +305,10 @@ void test_doFlow() {
 
        // Fehler bei V12.0.1 
         // Lokal
-        digits = { 9.8, 9.8, 1.9, 0.9, 0.9, 9.9, 2.9, 4.8};  // 211.0355 als falsches Ergebnis
+        digits = { 9.8, 9.8, 1.9, 0.9, 0.9, 9.9, 2.9, 4.8};  // 211.0345 als falsches Ergebnis
         analogs = { 5.5};
-        expected = "211.0345";
-        expected_extended= "211.03455";
+        expected = "211.0355";
+        expected_extended= "211.03555";
         
         // extendResolution=false
         result = process_doFlow(analogs, digits, Digital100, false, false, -3);
@@ -411,6 +411,22 @@ void test_doFlow() {
         result = process_doFlow(analogs, digits, Digital100, false, true, 0);
         TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
 
+
+        // Fehler bei rolling post V12.0.1 
+        // lokal watermeter1
+        digits = { 0.0, 0.0, 9.0, 1.9};  //91.38403 als falsches Ergebnis
+        analogs = {3.6,  8.2, 3.2, 2.0};
+        expected = "92.3832";
+        expected_extended= "92.38320";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, 0);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
+
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, 0);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
+
 }