From 1ab135e9899bc67d2fb3f05d48eb211b1772e367 Mon Sep 17 00:00:00 2001 From: Frank Haverland Date: Fri, 14 Oct 2022 19:53:04 +0200 Subject: [PATCH] fix hanging digits in transition --- .../ClassFlowCNNGeneral.cpp | 27 +++++++------------ .../test_flowpostprocessing.cpp | 22 ++++++++++++--- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp b/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp index 7701546b..e564be93 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp +++ b/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) + diff --git a/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp b/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp index 47c61775..10f479e2 100644 --- a/code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp +++ b/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()); + }