WMChart can plot error limits other then 2% and 5% and qp,qi style hyperbolic error limits, related DB and UI changes, ver. 2.33.2027

This commit is contained in:
Milan Hanajik 2023-03-20 10:14:29 +01:00
parent f0e57554f2
commit 7b95f5f436
17 changed files with 363 additions and 169 deletions

View File

@ -223,6 +223,14 @@ namespace Common
Count, Count,
} }
public enum FlowNames
{
QnQtQmin = 0,
Q3Q2Q1 = 1,
QpQi = 2,
Count,
}
public enum ProfileType public enum ProfileType
{ {
Q3R, Q3R,

View File

@ -21,6 +21,18 @@ namespace Common
return (format == "F0") ? value.ToString("F0") : value.ToString(format).TrimEnd(new char[] { '0' }); return (format == "F0") ? value.ToString("F0") : value.ToString(format).TrimEnd(new char[] { '0' });
} }
public static FlowNames ProfileType2FlowNames(ProfileType pt)
{
switch (pt)
{
case ProfileType.Q3R: return FlowNames.Q3Q2Q1;
case ProfileType.QnClassColdWater: return FlowNames.QnQtQmin;
case ProfileType.QnClassHotWater: return FlowNames.QnQtQmin;
case ProfileType.QpQi: return FlowNames.QpQi;
default: return FlowNames.Q3Q2Q1;
}
}
public static string SignificantDigitsToFmt(double value, int sigDigits) public static string SignificantDigitsToFmt(double value, int sigDigits)
{ {
if (sigDigits == 6) if (sigDigits == 6)

View File

@ -47,7 +47,7 @@ namespace Config.Entities
public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure) public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure)
public virtual float DN { get; set; } /// Not mapped to DB, valid in ProceduresCtrl for procedure filtering only public virtual float DN { get; set; } /// Not mapped to DB, valid in ProceduresCtrl for procedure filtering only
public virtual float Qn { get; set; } /// - ' ' - public virtual double Qn { get; set; } /// - ' ' -
public virtual string MClass { get; set; } /// - ' ' - public virtual string MClass { get; set; } /// - ' ' -
public virtual string Producer { get; set; } /// - ' ' - public virtual string Producer { get; set; } /// - ' ' -

View File

@ -113,11 +113,13 @@ namespace Results.Entities
public virtual string Producer() { return WaterMeterData.Producer; } public virtual string Producer() { return WaterMeterData.Producer; }
public virtual string MetrologicalClass() { return WaterMeterData.MetrologicalClass; } public virtual string MetrologicalClass() { return WaterMeterData.MetrologicalClass; }
public virtual string ApprovalInfo() { return WaterMeterData.ApprovalInfo; } public virtual string ApprovalInfo() { return WaterMeterData.ApprovalInfo; }
public virtual bool NewQnames() { return WaterMeterData.NewQnames; } public virtual FlowNames Qnames() { return (FlowNames)WaterMeterData.Qnames; }
public virtual double Q4_Qmax() { return WaterMeterData.Q4_Qmax; } public virtual double Q4_Qmax() { return WaterMeterData.Q4_Qmax; }
public virtual double Q3_Qn() { return WaterMeterData.Q3_Qn; } public virtual double Q3_Qn() { return WaterMeterData.Q3_Qn; }
public virtual double Q2_Qt() { return WaterMeterData.Q2_Qt; } public virtual double Q2_Qt() { return WaterMeterData.Q2_Qt; }
public virtual double Q1_Qmin() { return WaterMeterData.Q1_Qmin; } public virtual double Q1_Qmin() { return WaterMeterData.Q1_Qmin; }
public virtual double ErrLimHiQ() { return WaterMeterData.ErrLimHiQ; }
public virtual double ErrLimLoQ() { return WaterMeterData.ErrLimLoQ; }
public virtual bool Compound() { return WaterMeterData.Compound; } public virtual bool Compound() { return WaterMeterData.Compound; }
public virtual bool HeatMeter() { return WaterMeterData.HeatMeter; } public virtual bool HeatMeter() { return WaterMeterData.HeatMeter; }

View File

@ -17,11 +17,14 @@ namespace Results.Entities
public virtual double DN { get; set; } /// [mm] public virtual double DN { get; set; } /// [mm]
public virtual double L { get; set; } /// [mm] public virtual double L { get; set; } /// [mm]
public virtual Mounting Mounting { get; set; } /// H / V / S / F public virtual Mounting Mounting { get; set; } /// H / V / S / F
public virtual bool NewQnames { get; set; } /// Yes = Q3... No = Qn... public virtual sbyte Qnames { get; set; } /// see Common.Enums.FlowNames
public virtual double Q4_Qmax { get; set; } /// [m3/h] public virtual double Q4_Qmax { get; set; } /// [m3/h]
public virtual double Q3_Qn { get; set; } /// [m3/h] public virtual double Q3_Qn { get; set; } /// [m3/h]
public virtual double Q2_Qt { get; set; } /// [m3/h] public virtual double Q2_Qt { get; set; } /// [m3/h]
public virtual double Q1_Qmin { get; set; } /// [m3/h] public virtual double Q1_Qmin { get; set; } /// [m3/h]
public virtual double ErrLimHiQ { get; set; } /// [%]
public virtual double ErrLimLoQ { get; set; } /// [%]
public virtual string MetrologicalClass { get; set; } public virtual string MetrologicalClass { get; set; }
public virtual TemperatureClass TemperatureClass { get; set; } public virtual TemperatureClass TemperatureClass { get; set; }
public virtual PressureLossClass PressureLossClass { get; set; } public virtual PressureLossClass PressureLossClass { get; set; }
@ -66,11 +69,13 @@ namespace Results.Entities
DN = oriWMData.DN; DN = oriWMData.DN;
L = oriWMData.L; L = oriWMData.L;
Mounting = oriWMData.Mounting; Mounting = oriWMData.Mounting;
NewQnames = oriWMData.NewQnames; Qnames = oriWMData.Qnames;
Q4_Qmax = oriWMData.Q4_Qmax; Q4_Qmax = oriWMData.Q4_Qmax;
Q3_Qn = oriWMData.Q3_Qn; Q3_Qn = oriWMData.Q3_Qn;
Q2_Qt = oriWMData.Q2_Qt; Q2_Qt = oriWMData.Q2_Qt;
Q1_Qmin = oriWMData.Q1_Qmin; Q1_Qmin = oriWMData.Q1_Qmin;
ErrLimHiQ = oriWMData.ErrLimHiQ;
ErrLimLoQ = oriWMData.ErrLimLoQ;
MetrologicalClass = oriWMData.MetrologicalClass; MetrologicalClass = oriWMData.MetrologicalClass;
TemperatureClass = oriWMData.TemperatureClass; TemperatureClass = oriWMData.TemperatureClass;
PressureLossClass = oriWMData.PressureLossClass; PressureLossClass = oriWMData.PressureLossClass;
@ -109,11 +114,13 @@ namespace Results.Entities
if (DN != wmd.DN) return false; if (DN != wmd.DN) return false;
if (L != wmd.L) return false; if (L != wmd.L) return false;
if (Mounting != wmd.Mounting) return false; if (Mounting != wmd.Mounting) return false;
if (NewQnames != wmd.NewQnames) return false; if (Qnames != wmd.Qnames) return false;
if (Q4_Qmax != wmd.Q4_Qmax) return false; if (Q4_Qmax != wmd.Q4_Qmax) return false;
if (Q3_Qn != wmd.Q3_Qn) return false; if (Q3_Qn != wmd.Q3_Qn) return false;
if (Q2_Qt != wmd.Q2_Qt) return false; if (Q2_Qt != wmd.Q2_Qt) return false;
if (Q1_Qmin != wmd.Q1_Qmin) return false; if (Q1_Qmin != wmd.Q1_Qmin) return false;
if (ErrLimHiQ != wmd.ErrLimHiQ) return false;
if (ErrLimLoQ != wmd.ErrLimLoQ) return false;
if (MetrologicalClass != wmd.MetrologicalClass) return false; if (MetrologicalClass != wmd.MetrologicalClass) return false;
if (TemperatureClass != wmd.TemperatureClass) return false; if (TemperatureClass != wmd.TemperatureClass) return false;
if (PressureLossClass != wmd.PressureLossClass) return false; if (PressureLossClass != wmd.PressureLossClass) return false;
@ -167,11 +174,13 @@ namespace Results.Entities
writer.Write(DN); writer.Write(DN);
writer.Write(L); writer.Write(L);
writer.Write((int)Mounting); writer.Write((int)Mounting);
writer.Write(NewQnames); writer.Write((int)Qnames);
writer.Write(Q4_Qmax); writer.Write(Q4_Qmax);
writer.Write(Q3_Qn); writer.Write(Q3_Qn);
writer.Write(Q2_Qt); writer.Write(Q2_Qt);
writer.Write(Q1_Qmin); writer.Write(Q1_Qmin);
writer.Write(ErrLimHiQ);
writer.Write(ErrLimLoQ);
writer.Write((MetrologicalClass != null) ? MetrologicalClass : string.Empty); writer.Write((MetrologicalClass != null) ? MetrologicalClass : string.Empty);
writer.Write((int)TemperatureClass); writer.Write((int)TemperatureClass);
writer.Write((int)PressureLossClass); writer.Write((int)PressureLossClass);
@ -205,11 +214,13 @@ namespace Results.Entities
DN = reader.ReadDouble(); DN = reader.ReadDouble();
L = reader.ReadDouble(); L = reader.ReadDouble();
Mounting = (Mounting)reader.ReadInt32(); Mounting = (Mounting)reader.ReadInt32();
NewQnames = reader.ReadBoolean(); Qnames = (sbyte)reader.ReadInt32();
Q4_Qmax = reader.ReadDouble(); Q4_Qmax = reader.ReadDouble();
Q3_Qn = reader.ReadDouble(); Q3_Qn = reader.ReadDouble();
Q2_Qt = reader.ReadDouble(); Q2_Qt = reader.ReadDouble();
Q1_Qmin = reader.ReadDouble(); Q1_Qmin = reader.ReadDouble();
ErrLimHiQ = reader.ReadDouble();
ErrLimLoQ = reader.ReadDouble();
MetrologicalClass = reader.ReadString(); MetrologicalClass = reader.ReadString();
TemperatureClass = (TemperatureClass)reader.ReadInt32(); TemperatureClass = (TemperatureClass)reader.ReadInt32();
PressureLossClass = (PressureLossClass)reader.ReadInt32(); PressureLossClass = (PressureLossClass)reader.ReadInt32();

View File

@ -1,5 +1,5 @@
/// ///
/// Copyright (c) 2019 Sensus Slovensko a.s. /// Copyright (c) 2019-2023 Sensus Slovensko a.s.
/// ///
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -14,6 +14,13 @@ namespace Results.Forms
{ {
public partial class MoreWMResultsDlg : Form public partial class MoreWMResultsDlg : Form
{ {
enum Tabs
{
Results = 0,
Graph,
Tracing,
}
public MoreWMResultsDlg(Results.Entities.WaterMeter wm, IList<ReferenceRecord> refRecords) public MoreWMResultsDlg(Results.Entities.WaterMeter wm, IList<ReferenceRecord> refRecords)
{ {
InitializeComponent(); InitializeComponent();
@ -23,14 +30,15 @@ namespace Results.Forms
ShowAllResults(wm); ShowAllResults(wm);
ShowChart(wm); ShowChart(wm);
/// Select the initial tab page to be displayed
if (refRecords == null) if (refRecords == null)
{ {
tabControl1.SelectTab(1); tabControl1.SelectTab((int)Tabs.Graph);
tabControl1.TabPages.RemoveAt(2); tabControl1.TabPages.RemoveAt((int)Tabs.Tracing);
} }
else else
{ {
tabControl1.SelectTab(2); tabControl1.SelectTab((int)Tabs.Tracing);
ShowTracingResults(wm, refRecords); ShowTracingResults(wm, refRecords);
} }
} }
@ -39,9 +47,9 @@ namespace Results.Forms
void Localize() void Localize()
{ {
Text = Strings.Water_meter_results; Text = Strings.Water_meter_results;
tabControl1.TabPages[0].Text = Strings.All_results; tabControl1.TabPages[(int)Tabs.Results].Text = Strings.All_results;
tabControl1.TabPages[1].Text = Strings.Graphs; tabControl1.TabPages[(int)Tabs.Graph].Text = Strings.Graphs;
tabControl1.TabPages[2].Text = Strings.Production_tracing_results; tabControl1.TabPages[(int)Tabs.Tracing].Text = Strings.Production_tracing_results;
} }
@ -107,11 +115,7 @@ namespace Results.Forms
void ShowChart(Results.Entities.WaterMeter wm) void ShowChart(Results.Entities.WaterMeter wm)
{ {
//chart.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yy"; tabControl1.TabPages[(int)Tabs.Graph].Controls.Add(Results.Output.WMChart.GetChart(wm, false));
//chart.ChartAreas[0].AxisX.Interval = 1;
//chart.ChartAreas[0].AxisX.IntervalType = ;
tabControl1.TabPages[1].Controls.Add(Results.Output.WMChart.GetChart(wm, false));
} }

View File

@ -18,13 +18,13 @@ namespace Results.Mappings
Map(x => x.L); Map(x => x.L);
Map(x => x.Mounting); Map(x => x.Mounting);
#if MUNICH && LANG_DE Map(x => x.Qnames);
Map(x => x.NewQnames);
#endif
Map(x => x.Q4_Qmax); Map(x => x.Q4_Qmax);
Map(x => x.Q3_Qn); Map(x => x.Q3_Qn);
Map(x => x.Q2_Qt); Map(x => x.Q2_Qt);
Map(x => x.Q1_Qmin); Map(x => x.Q1_Qmin);
Map(x => x.ErrLimHiQ);
Map(x => x.ErrLimLoQ);
Map(x => x.MetrologicalClass); Map(x => x.MetrologicalClass);
Map(x => x.TemperatureClass); Map(x => x.TemperatureClass);

View File

@ -526,11 +526,11 @@ namespace Results.Output.Printers.Munich
} }
lineNr++; lineNr++;
PrintAt(e, Tab1, lineNr * SpacingOne, wm.NewQnames() ? "Q3 :" : "Qn :"); PrintAt(e, Tab1, lineNr * SpacingOne, (wm.Qnames() == FlowNames.Q3Q2Q1) ? "Q3 :" : (wm.Qnames() == FlowNames.QpQi) ? "qp :" : "Qn :");
PrintAt(e, Tab2, lineNr * SpacingOne, wm.Q3_Qn().ToString()); PrintAt(e, Tab2, lineNr * SpacingOne, wm.Q3_Qn().ToString());
if (compound) if (compound)
{ {
PrintAt(e, Tab3, lineNr * SpacingOne, wm.NewQnames() ? "Q3 :" : "Qn :"); PrintAt(e, Tab3, lineNr * SpacingOne, (wm.Qnames() == FlowNames.Q3Q2Q1) ? "Q3 :" : (wm.Qnames() == FlowNames.QpQi) ? "qp :" : "Qn :");
PrintAt(e, Tab4, lineNr * SpacingOne, wm.Q3_Qn_Aux().ToString()); PrintAt(e, Tab4, lineNr * SpacingOne, wm.Q3_Qn_Aux().ToString());
} }
lineNr++; lineNr++;

View File

@ -1,5 +1,5 @@
/// ///
/// Copyright (c) 2019-2022 Sensus Metering Systems /// Copyright (c) 2019-2023 Sensus Metering Systems
/// ///
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -55,6 +55,9 @@ namespace Results.Output
chArea.AxisX.LogarithmBase = 10; chArea.AxisX.LogarithmBase = 10;
chArea.AxisX.IsLabelAutoFit = true; chArea.AxisX.IsLabelAutoFit = true;
Series upperLimit = new Series { Name = Strings.Upper_limit, ChartArea = "ChartArea1", ChartType = SeriesChartType.Line, Color = Color.Red };
Series lowerLimit = new Series { Name = Strings.Lower_limit, ChartArea = "ChartArea1", ChartType = SeriesChartType.Line, Color = Color.Red };
List<double> xs = new List<double>() { 0.0001, 0.0002, 0.0005, List<double> xs = new List<double>() { 0.0001, 0.0002, 0.0005,
0.001, 0.002, 0.005, 0.001, 0.002, 0.005,
0.01, 0.02, 0.05, 0.01, 0.02, 0.05,
@ -71,6 +74,8 @@ namespace Results.Output
double from = Units.ConvertTo(flowUnit, wm.WaterMeterData.Q1_Qmin); double from = Units.ConvertTo(flowUnit, wm.WaterMeterData.Q1_Qmin);
double to = Units.ConvertTo(flowUnit, isQ4 ? wm.WaterMeterData.Q4_Qmax : wm.WaterMeterData.Q3_Qn); double to = Units.ConvertTo(flowUnit, isQ4 ? wm.WaterMeterData.Q4_Qmax : wm.WaterMeterData.Q3_Qn);
bool inRange = false; bool inRange = false;
double qSharp = (wm.WaterMeterData.Qnames == (sbyte)FlowNames.QpQi) ? GetQsharp(wm, flowUnit) : 0;
double lastXs = 0;
for (int i = 0; i < xs.Count - 3; i += 3) for (int i = 0; i < xs.Count - 3; i += 3)
{ {
if (xs[i] <= from && from < xs[i + 3]) if (xs[i] <= from && from < xs[i + 3])
@ -88,6 +93,37 @@ namespace Results.Output
cl.FromPosition = Math.Log10(xs[j] * spacer); cl.FromPosition = Math.Log10(xs[j] * spacer);
cl.ToPosition = Math.Log10(xs[j] / spacer); cl.ToPosition = Math.Log10(xs[j] / spacer);
chArea.AxisX.CustomLabels.Add(cl); chArea.AxisX.CustomLabels.Add(cl);
if (wm.WaterMeterData.Qnames == (sbyte)FlowNames.QpQi)
{
if (lastXs != 0)
{
double insertedXs = Math.Sqrt(lastXs * xs[j]);
if (lastXs < qSharp && qSharp < insertedXs)
{
double errLim3 = GetErrorLimit(wm, flowUnit, qSharp);
lowerLimit.Points.AddXY(qSharp, -errLim3);
upperLimit.Points.AddXY(qSharp, +errLim3);
}
double errLim2 = GetErrorLimit(wm, flowUnit, insertedXs);
lowerLimit.Points.AddXY(insertedXs, -errLim2);
upperLimit.Points.AddXY(insertedXs, +errLim2);
if (insertedXs < qSharp && qSharp < xs[j])
{
double errLim3 = GetErrorLimit(wm, flowUnit, qSharp);
lowerLimit.Points.AddXY(qSharp, -errLim3);
upperLimit.Points.AddXY(qSharp, +errLim3);
}
}
lastXs = xs[j];
double errLim = GetErrorLimit(wm, flowUnit, xs[j]);
lowerLimit.Points.AddXY(xs[j], -errLim);
upperLimit.Points.AddXY(xs[j], +errLim);
}
} }
} }
@ -101,6 +137,36 @@ namespace Results.Output
cl.ToPosition = Math.Log10(xs[i + 3] / spacer); cl.ToPosition = Math.Log10(xs[i + 3] / spacer);
chArea.AxisX.CustomLabels.Add(cl); chArea.AxisX.CustomLabels.Add(cl);
if (wm.WaterMeterData.Qnames == (sbyte)FlowNames.QpQi)
{
if (lastXs != 0)
{
double insertedXs = Math.Sqrt(lastXs * xs[i + 3]);
if (lastXs < qSharp && qSharp < insertedXs)
{
double errLim3 = GetErrorLimit(wm, flowUnit, qSharp);
lowerLimit.Points.AddXY(qSharp, -errLim3);
upperLimit.Points.AddXY(qSharp, +errLim3);
}
double errLim2 = GetErrorLimit(wm, flowUnit, insertedXs);
lowerLimit.Points.AddXY(insertedXs, -errLim2);
upperLimit.Points.AddXY(insertedXs, +errLim2);
if (insertedXs < qSharp && qSharp < xs[i + 3])
{
double errLim3 = GetErrorLimit(wm, flowUnit, qSharp);
lowerLimit.Points.AddXY(qSharp, -errLim3);
upperLimit.Points.AddXY(qSharp, +errLim3);
}
}
double errLim = GetErrorLimit(wm, flowUnit, xs[i + 3]);
lowerLimit.Points.AddXY(xs[i + 3], -errLim);
upperLimit.Points.AddXY(xs[i + 3], +errLim);
}
break; break;
} }
} }
@ -111,19 +177,20 @@ namespace Results.Output
Legend legend1 = new Legend { Name = "Legend1" }; Legend legend1 = new Legend { Name = "Legend1" };
Series upperLimit = new Series { Name = Strings.Upper_limit, ChartArea = "ChartArea1", ChartType = SeriesChartType.Line, Color = Color.Red }; if (wm.WaterMeterData.Qnames == (sbyte)FlowNames.Q3Q2Q1 || wm.WaterMeterData.Qnames == (sbyte)FlowNames.QnQtQmin)
upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q1_Qmin), 5); {
upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), 5); upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q1_Qmin), wm.WaterMeterData.ErrLimHiQ);
upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), 2); upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), wm.WaterMeterData.ErrLimHiQ);
upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q3_Qn), 2); upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), wm.WaterMeterData.ErrLimLoQ);
if (isQ4) upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q4_Qmax), 2); upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q3_Qn), wm.WaterMeterData.ErrLimLoQ);
if (isQ4) upperLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q4_Qmax), wm.WaterMeterData.ErrLimHiQ);
Series lowerLimit = new Series { Name = Strings.Lower_limit, ChartArea = "ChartArea1", ChartType = SeriesChartType.Line, Color = Color.Red }; lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q1_Qmin), -wm.WaterMeterData.ErrLimHiQ);
lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q1_Qmin), -5); lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), -wm.WaterMeterData.ErrLimHiQ);
lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), -5); lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), -wm.WaterMeterData.ErrLimLoQ);
lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q2_Qt), -2); lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q3_Qn), -wm.WaterMeterData.ErrLimLoQ);
lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q3_Qn), -2); if (isQ4) lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q4_Qmax), -wm.WaterMeterData.ErrLimHiQ);
if (isQ4) lowerLimit.Points.AddXY(Units.ConvertTo(flowUnit, wm.WaterMeterData.Q4_Qmax), -2); }
Series line = new Series { Name = Strings.Relative_error, ChartArea = "ChartArea1", ChartType = SeriesChartType.Line, Color = Color.DeepSkyBlue }; Series line = new Series { Name = Strings.Relative_error, ChartArea = "ChartArea1", ChartType = SeriesChartType.Line, Color = Color.DeepSkyBlue };
Series dots = new Series { Name = Strings.Relative_error + " ", ChartArea = "ChartArea1", ChartType = SeriesChartType.Point, Color = Color.RoyalBlue }; Series dots = new Series { Name = Strings.Relative_error + " ", ChartArea = "ChartArea1", ChartType = SeriesChartType.Point, Color = Color.RoyalBlue };
@ -137,12 +204,38 @@ namespace Results.Output
chart.ChartAreas.Add(chArea); chart.ChartAreas.Add(chArea);
chart.Legends.Add(legend1); chart.Legends.Add(legend1);
chart.Series.Add(upperLimit); if (upperLimit.Points.Count > 1) chart.Series.Add(upperLimit);
chart.Series.Add(lowerLimit); if (lowerLimit.Points.Count > 1) chart.Series.Add(lowerLimit);
chart.Series.Add(dots); chart.Series.Add(dots);
chart.Series.Add(line); chart.Series.Add(line);
return chart; return chart;
} }
static double GetErrorLimit(WaterMeter wm, Unit flowUnit, double x)
{
double flow_m3 = Units.ConvertFrom(flowUnit, x);
switch (Convert.ToInt32(wm.WaterMeterData.Q2_Qt))
{
default:
case 1: return Math.Min(3.5, 1.0 + 0.01 * wm.WaterMeterData.Q3_Qn / flow_m3);
case 2: return Math.Min(5.0, 2.0 + 0.02 * wm.WaterMeterData.Q3_Qn / flow_m3);
case 3: return Math.Min(5.0, 3.0 + 0.05 * wm.WaterMeterData.Q3_Qn / flow_m3);
}
}
static double GetQsharp(WaterMeter wm, Unit flowUnit)
{
double qSharp;
switch (Convert.ToInt32(wm.WaterMeterData.Q2_Qt))
{
default:
case 1: qSharp = (0.01 / 2.5) * wm.WaterMeterData.Q3_Qn; break;
case 2: qSharp = (0.02 / 3.0) * wm.WaterMeterData.Q3_Qn; break;
case 3: qSharp = (0.05 / 2.0) * wm.WaterMeterData.Q3_Qn; break;
}
return Units.ConvertTo(flowUnit, qSharp);
}
} }
} }

View File

@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("2.32.2027.0")] [assembly: AssemblyVersion("2.33.2027.0")]
[assembly: AssemblyFileVersion("2.32.2027.0")] [assembly: AssemblyFileVersion("2.33.2027.0")]

View File

@ -1,8 +1,8 @@
/// ///
/// Copyright (c) 2013-2016 Sensus Metering Systems /// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// ///
using TBF.Rig.Generic;
using Common; using Common;
using TBF.Rig.Generic;
namespace TBF.Rig.GenericDevices namespace TBF.Rig.GenericDevices
{ {
@ -17,11 +17,13 @@ namespace TBF.Rig.GenericDevices
float L { get; } /// building length [mm] float L { get; } /// building length [mm]
Mounting Mounting { get; } /// mounting H / V Mounting Mounting { get; } /// mounting H / V
bool NewQnames { get; } /// true = Q3... false = Qn... FlowNames Qnames { get; } /// true = Q3... false = Qn...
float Q4_Qmax { get; } /// [m3/h] double Q4_Qmax { get; } /// [m3/h]
float Q3_Qn { get; } /// [m3/h] double Q3_Qn { get; } /// [m3/h]
float Q2_Qt { get; } /// [m3/h] double Q2_Qt { get; } /// [m3/h]
float Q1_Qmin { get; } /// [m3/h] double Q1_Qmin { get; } /// [m3/h]
double ErrLimHiQ { get; } /// [%]
double ErrLimLoQ { get; } /// [%]
string MetrologicalClass { get; } /// R<Q3/Q1> string MetrologicalClass { get; } /// R<Q3/Q1>
TemperatureClass TemperatureClass { get; } /// T30, T50, T70, ... TemperatureClass TemperatureClass { get; } /// T30, T50, T70, ...

View File

@ -577,7 +577,7 @@ namespace TBF.Rig.Sequences
DN = WaterMeters[ix].DN, DN = WaterMeters[ix].DN,
Mounting = WaterMeters[ix].Mounting, Mounting = WaterMeters[ix].Mounting,
NewQnames = WaterMeters[ix].NewQnames, Qnames = (sbyte)WaterMeters[ix].Qnames,
Q4_Qmax = WaterMeters[ix].Q4_Qmax, Q4_Qmax = WaterMeters[ix].Q4_Qmax,
Q3_Qn = WaterMeters[ix].Q3_Qn, Q3_Qn = WaterMeters[ix].Q3_Qn,
Q2_Qt = WaterMeters[ix].Q2_Qt, Q2_Qt = WaterMeters[ix].Q2_Qt,

View File

@ -55,20 +55,14 @@ namespace TBF.Rig.WaterMeters.Munich
"L [mm]", "L [mm]",
Strings.Mounting, Strings.Mounting,
Strings.New_Q_names, Strings.New_Q_names,
Strings.Qn, "Qn or Q3",
Strings.Metrological_class, Strings.Metrological_class,
Strings.Approval_info, Strings.Approval_info,
}; };
public override string ParamName(int i) public override string ParamName(int i)
{ {
string name = paramNames[i]; if (i == 7 && NewQnames) return NewQnames ? "Q3 [m3/h]" : "Qn [m3/h]";
return paramNames[i];
if (NewQnames && name.Equals(Strings.Qmax)) name = "Q4 [m3/h]";
if (NewQnames && name.Equals(Strings.Qn)) name = "Q3 [m3/h]";
if (NewQnames && name.Equals(Strings.Qt)) name = "Q2 [m3/h]";
if (NewQnames && name.Equals(Strings.Qmin)) name = "Q1 [m3/h]";
return name;
} }
public override int ParamsCount() { return paramNames.Length; } public override int ParamsCount() { return paramNames.Length; }

View File

@ -1,5 +1,5 @@
/// ///
/// Copyright (c) 2016 Sensus Metering Systems /// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// ///
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -34,11 +34,13 @@ namespace TBF.Rig.WaterMeters.Munich
public Mounting Mounting { get { return Mounting.NotSpecified; } } public Mounting Mounting { get { return Mounting.NotSpecified; } }
/// <summary>Nominal water flow in [m3/h]</summary> /// <summary>Nominal water flow in [m3/h]</summary>
public bool NewQnames { get { return waterMeterCfg.ProcParams.NewQnames; } } public FlowNames Qnames { get { return waterMeterCfg.ProcParams.NewQnames ? FlowNames.Q3Q2Q1 : FlowNames.QnQtQmin; } }
public float Q4_Qmax { get { return 0; } } public double Q4_Qmax { get { return 0; } }
public float Q3_Qn { get { return waterMeterCfg.ProcParams.Qn; } } public double Q3_Qn { get { return waterMeterCfg.ProcParams.Qn; } }
public float Q2_Qt { get { return 0; } } public double Q2_Qt { get { return 0; } }
public float Q1_Qmin { get { return 0; } } public double Q1_Qmin { get { return 0; } }
public double ErrLimHiQ { get { return 2.0; } }
public double ErrLimLoQ { get { return 5.0; } }
/// <summary>Metrological class, etc</summary> /// <summary>Metrological class, etc</summary>
public string MetrologicalClass { get { return waterMeterCfg.ProcParams.MetrologicalClass; } } public string MetrologicalClass { get { return waterMeterCfg.ProcParams.MetrologicalClass; } }

View File

@ -1,7 +1,8 @@
/// ///
/// Copyright (c) 2013-2017 Sensus Metering Systems /// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// ///
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Xml.Serialization; using System.Xml.Serialization;
@ -18,37 +19,39 @@ namespace TBF.Rig.WaterMeters.WaterMeter
public override XmlSerializer GetSerializer() { return Serializer; } public override XmlSerializer GetSerializer() { return Serializer; }
public string ProductName; /// Znak fabryczny (PL) public string ProductName; /// 0 Znak fabryczny (PL)
public string Producer; /// Producent (PL), Hersteller (D) public string Producer; /// 1 Producent (PL), Hersteller (D)
public float DN; public float DN; /// 2
public float L; /// stavebná dĺžka [mm] public float L; /// 3 stavebná dĺžka [mm]
public Mounting Mounting; public Mounting Mounting; /// 4
public bool NewQnames; /// true = display Q4,Q3,Q2,Q1, false = display Qmax, Qn, Qt, Qmin public FlowNames Qnames; /// 5 true = display Q4,Q3,Q2,Q1, false = display Qmax, Qn, Qt, Qmin
public float Qmax; /// [m3/h] public double Qmax; /// 6 [m3/h]
public float Qn; /// [m3/h] public double Qn; /// 7 [m3/h]
public float Qt; /// [m3/h] public double Qt; /// 8 [m3/h]
public float Qmin; /// [m3/h] public double Qmin; /// 9 [m3/h]
public double ErrLimHiQ; /// 10 [%]
public double ErrLimLoQ; /// 11 [%]
public string MetrologicalClass; /// Metr. Klasse public string MetrologicalClass; /// 12 Metr. Klasse
public TemperatureClass TemperatureClass; public TemperatureClass TemperatureClass; /// 13
public PressureLossClass PressureLossClass; public PressureLossClass PressureLossClass; /// 14
public MaxAdmissiblePressure MaxAdmissiblePressure; public MaxAdmissiblePressure MaxAdmissiblePressure; /// 15
public FlowProfileSensitivityClass FlowProfileSensitivityClass; public FlowProfileSensitivityClass FlowProfileSensitivityClass; /// 16
public string ApprovalInfo; /// Zulassungszeichen, WE (PL) public string ApprovalInfo; /// 17 Zulassungszeichen, WE (PL)
public string Certificate; public string Certificate; /// 18
public double PulsesPerLtr; /// Target low limit of the flow increase or decrease public double PulsesPerLtr; /// 19 Target low limit of the flow increase or decrease
public string Text1; public string Text1; /// 20
public string Text2; public string Text2; /// 21
public string Text3; public string Text3; /// 22
public string Text4; public string Text4; /// 23
public string Text5; public string Text5; /// 24
public Medium WaterTemp; /// Woda: zimna / tepla (PL) public Medium WaterTemp; /// 25 Woda: zimna / tepla (PL)
public override void InitializeAll() public override void InitializeAll()
@ -58,11 +61,13 @@ namespace TBF.Rig.WaterMeters.WaterMeter
DN = 0; DN = 0;
L = 0; L = 0;
Mounting = Mounting.NotSpecified; Mounting = Mounting.NotSpecified;
NewQnames = false; Qnames = FlowNames.Q3Q2Q1;
Qmax = 4.0f; Qmax = 3.125;
Qn = 2.5f; Qn = 2.5;
Qt = 0.005f; Qt = 0.005;
Qmin = 0.003125f; Qmin = 0.003125;
ErrLimHiQ = 2.0;
ErrLimLoQ = 5.0;
MetrologicalClass = "A"; MetrologicalClass = "A";
TemperatureClass = TemperatureClass.NotSpecified; TemperatureClass = TemperatureClass.NotSpecified;
PressureLossClass = PressureLossClass.NotSpecified; PressureLossClass = PressureLossClass.NotSpecified;
@ -76,7 +81,6 @@ namespace TBF.Rig.WaterMeters.WaterMeter
Text3 = string.Empty; Text3 = string.Empty;
Text4 = string.Empty; Text4 = string.Empty;
Text5 = string.Empty; Text5 = string.Empty;
WaterTemp = Medium.ColdWater; WaterTemp = Medium.ColdWater;
} }
@ -87,11 +91,13 @@ namespace TBF.Rig.WaterMeters.WaterMeter
"DN", "DN",
Strings.L, Strings.L,
Strings.Mounting, Strings.Mounting,
Strings.New_Q_names, "Q desig.",
Strings.Qmax, "Q4",
Strings.Qn, "Q3",
Strings.Qt, "Q2",
Strings.Qmin, "Q1",
"Err.lim. Hi Q",
"Err.lim. Lo Q",
Strings.Metrological_class, Strings.Metrological_class,
Strings.Temperature_class, Strings.Temperature_class,
Strings.Pressure_loss_class, Strings.Pressure_loss_class,
@ -105,22 +111,67 @@ namespace TBF.Rig.WaterMeters.WaterMeter
"Text3", "Text3",
"Text4", "Text4",
"Text5", "Text5",
Strings.Water, /// "Woda" Strings.Water, /// "Woda"
}; };
public override string ParamName(int i) public override string ParamName(int i)
{ {
string name = paramNames[i]; switch (Qnames)
{
case FlowNames.Q3Q2Q1:
if (i == 6) return "Q4 [m3/h]";
if (i == 7) return "Q3 [m3/h]";
if (i == 8) return "Q2 [m3/h]";
if (i == 9) return "Q1 [m3/h]";
break;
case FlowNames.QnQtQmin:
if (i == 6) return "Qmax [m3/h]";
if (i == 7) return "Qn [m3/h]";
if (i == 8) return "Qt [m3/h]";
if (i == 9) return "Qmin [m3/h]";
break;
case FlowNames.QpQi:
if (i == 6) return "N/A";
if (i == 7) return "Qp [m3/h]";
if (i == 8) return "Qi [m3/h]";
if (i == 9) return "N/A";
break;
}
if (NewQnames && name.Equals(Strings.Qmax)) name = "Q4"; return paramNames[i];
if (NewQnames && name.Equals(Strings.Qn)) name = "Q3";
if (NewQnames && name.Equals(Strings.Qt)) name = "Q2";
if (NewQnames && name.Equals(Strings.Qmin)) name = "Q1";
return name;
} }
public override int ParamsCount() { return paramNames.Length; } public override int ParamsCount() { return paramNames.Length; }
public ICollection<string> ParamValues(int ix)
{
var values = new List<string>();
switch (ix)
{
case 4:
for (Mounting m = 0; m < Mounting.Count; m++) values.Add(m.ToDescription());
return values;
case 5:
for (FlowNames q = 0; q < FlowNames.Count; q++) values.Add(q.ToString());
return values;
case 13:
for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++) values.Add(tc.ToDescription());
return values;
case 14:
for (PressureLossClass dp = 0; dp < PressureLossClass.Count; dp++) values.Add(dp.ToDescription());
return values;
case 15:
for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++) values.Add(map.ToDescription());
return values;
case 16:
for (FlowProfileSensitivityClass fps = 0; fps < FlowProfileSensitivityClass.Count; fps++) values.Add(fps.ToDescription());
return values;
case 25:
for (Medium m = 0; m < Medium.Count; m++) values.Add(m.ToDescription());
return values;
default:
return null;
}
}
public override string ToString(int i) public override string ToString(int i)
{ {
@ -131,26 +182,27 @@ namespace TBF.Rig.WaterMeters.WaterMeter
case 2: return DN.ToString(); case 2: return DN.ToString();
case 3: return L.ToString(); case 3: return L.ToString();
case 4: return Mounting.ToDescription(); case 4: return Mounting.ToDescription();
case 5: return (NewQnames ? Strings.yes : Strings.no); case 5: return Qnames.ToString();
case 6: return Qmax.ToString(); case 6: return Qmax.ToString();
case 7: return Qn.ToString(); case 7: return Qn.ToString();
case 8: return Qt.ToString(); case 8: return Qt.ToString();
case 9: return Qmin.ToString(); case 9: return Qmin.ToString();
case 10: return MetrologicalClass; case 10: return ErrLimHiQ.ToString();
case 11: return TemperatureClass.ToDescription(); case 11: return ErrLimLoQ.ToString();
case 12: return PressureLossClass.ToDescription(); case 12: return MetrologicalClass;
case 13: return MaxAdmissiblePressure.ToDescription(); case 13: return TemperatureClass.ToDescription();
case 14: return FlowProfileSensitivityClass.ToDescription(); case 14: return PressureLossClass.ToDescription();
case 15: return ApprovalInfo; case 15: return MaxAdmissiblePressure.ToDescription();
case 16: return Certificate; case 16: return FlowProfileSensitivityClass.ToDescription();
case 17: return PulsesPerLtr.ToString(); case 17: return ApprovalInfo;
case 18: return Text1; case 18: return Certificate;
case 19: return Text2; case 19: return PulsesPerLtr.ToString();
case 20: return Text3; case 20: return Text1;
case 21: return Text4; case 21: return Text2;
case 22: return Text5; case 22: return Text3;
case 23: return Text4;
case 23: return (WaterTemp == Medium.HotWater) ? Medium.HotWater.ToDescription() : Medium.ColdWater.ToDescription(); /// "tepla" : "zimna"; case 24: return Text5;
case 25: return (WaterTemp == Medium.HotWater) ? Medium.HotWater.ToDescription() : Medium.ColdWater.ToDescription(); /// "tepla" : "zimna";
default: return string.Empty; default: return string.Empty;
} }
} }
@ -169,46 +221,55 @@ namespace TBF.Rig.WaterMeters.WaterMeter
if (m.ToDescription().Equals(strValue)) { Mounting = m; return CfgUpdateFlags.None; } if (m.ToDescription().Equals(strValue)) { Mounting = m; return CfgUpdateFlags.None; }
} }
break; break;
case 5: NewQnames = strValue.Equals(Strings.yes); return CfgUpdateFlags.None; case 5:
for (FlowNames q = 0; q < FlowNames.Count; q++)
{
if (q.ToDescription().Equals(strValue)) { Qnames = q; return CfgUpdateFlags.None; }
}
break;
case 6: Qmax = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; case 6: Qmax = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None;
case 7: Qn = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; case 7: Qn = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None;
case 8: Qt = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; case 8: Qt = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None;
case 9: Qmin = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None; case 9: Qmin = Utils.ParseUFloat(strValue); return CfgUpdateFlags.None;
case 10: MetrologicalClass = strValue; return CfgUpdateFlags.None; case 12: MetrologicalClass = strValue; return CfgUpdateFlags.None;
case 11: case 13:
for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++) for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++)
{ {
if (tc.ToDescription().Equals(strValue)) { TemperatureClass = tc; return CfgUpdateFlags.None; } if (tc.ToDescription().Equals(strValue)) { TemperatureClass = tc; return CfgUpdateFlags.None; }
} }
break; break;
case 12: case 14:
for (PressureLossClass dp = 0; dp < PressureLossClass.Count; dp++) for (PressureLossClass dp = 0; dp < PressureLossClass.Count; dp++)
{ {
if (dp.ToDescription().Equals(strValue)) { PressureLossClass = dp; return CfgUpdateFlags.None; } if (dp.ToDescription().Equals(strValue)) { PressureLossClass = dp; return CfgUpdateFlags.None; }
} }
break; break;
case 13: case 15:
for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++) for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++)
{ {
if (map.ToDescription().Equals(strValue)) { MaxAdmissiblePressure = map; return CfgUpdateFlags.None; } if (map.ToDescription().Equals(strValue)) { MaxAdmissiblePressure = map; return CfgUpdateFlags.None; }
} }
break; break;
case 14: case 16:
for (FlowProfileSensitivityClass fps = 0; fps < FlowProfileSensitivityClass.Count; fps++) for (FlowProfileSensitivityClass fps = 0; fps < FlowProfileSensitivityClass.Count; fps++)
{ {
if (fps.ToDescription().Equals(strValue)) { FlowProfileSensitivityClass = fps; return CfgUpdateFlags.None; } if (fps.ToDescription().Equals(strValue)) { FlowProfileSensitivityClass = fps; return CfgUpdateFlags.None; }
} }
break; break;
case 15: ApprovalInfo = strValue; return CfgUpdateFlags.None; case 17: ApprovalInfo = strValue; return CfgUpdateFlags.None;
case 16: Certificate = strValue; return CfgUpdateFlags.None; case 18: Certificate = strValue; return CfgUpdateFlags.None;
case 17: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; case 19: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None;
case 18: Text1 = strValue; return CfgUpdateFlags.None; case 20: Text1 = strValue; return CfgUpdateFlags.None;
case 19: Text2 = strValue; return CfgUpdateFlags.None; case 21: Text2 = strValue; return CfgUpdateFlags.None;
case 20: Text3 = strValue; return CfgUpdateFlags.None; case 22: Text3 = strValue; return CfgUpdateFlags.None;
case 21: Text4 = strValue; return CfgUpdateFlags.None; case 23: Text4 = strValue; return CfgUpdateFlags.None;
case 22: Text5 = strValue; return CfgUpdateFlags.None; case 24: Text5 = strValue; return CfgUpdateFlags.None;
case 25:
case 23: WaterTemp = strValue.Equals(Medium.HotWater.ToDescription()) ? Medium.HotWater : Medium.ColdWater; return CfgUpdateFlags.None; /// "tepla" for (Medium m = 0; m < Medium.Count; m++)
{
if (m.ToDescription().Equals(strValue)) { WaterTemp = m; return CfgUpdateFlags.None; }
}
break;
default: return CfgUpdateFlags.None; default: return CfgUpdateFlags.None;
} }
@ -224,17 +285,19 @@ namespace TBF.Rig.WaterMeters.WaterMeter
{ {
case 0: /// ProductName case 0: /// ProductName
case 1: /// Producer case 1: /// Producer
case 10: /// MetrologicalClass case 12: /// MetrologicalClass
case 15: /// ApprovalInfo case 17: /// ApprovalInfo
case 16: /// Certificate case 18: /// Certificate
case 18: /// Text1 case 20: /// Text1
case 19: /// Text2 case 21: /// Text2
case 20: /// Text3 case 22: /// Text3
case 21: /// Text4 case 23: /// Text4
case 22: /// Text5 case 24: /// Text5
return true; return true;
case 5: case 5:
if (strValue.Equals(Strings.yes) || strValue.Equals(Strings.no)) return true; if (strValue.Equals(FlowNames.Q3Q2Q1.ToString()) ||
strValue.Equals(FlowNames.QnQtQmin.ToString()) ||
strValue.Equals(FlowNames.QpQi.ToString())) return true;
break; break;
case 2: /// DN case 2: /// DN
case 3: /// L case 3: /// L
@ -242,25 +305,25 @@ namespace TBF.Rig.WaterMeters.WaterMeter
case 7: /// Qn case 7: /// Qn
case 8: /// Qt case 8: /// Qt
case 9: /// Qmin case 9: /// Qmin
case 17: /// PulsesPerLtr case 19: /// PulsesPerLtr
if (Utils.TryParseUDouble(strValue, out dummy)) return true; if (Utils.TryParseUDouble(strValue, out dummy)) return true;
break; break;
case 4: case 4:
for (Mounting tc = 0; tc < Mounting.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; for (Mounting tc = 0; tc < Mounting.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true;
break; break;
case 11: case 13:
for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; for (TemperatureClass tc = 0; tc < TemperatureClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true;
break; break;
case 12: case 14:
for (PressureLossClass tc = 0; tc < PressureLossClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; for (PressureLossClass tc = 0; tc < PressureLossClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true;
break; break;
case 13: case 15:
for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++) if (map.ToDescription().Equals(strValue)) return true; for (MaxAdmissiblePressure map = 0; map < MaxAdmissiblePressure.Count; map++) if (map.ToDescription().Equals(strValue)) return true;
break; break;
case 14: case 16:
for (FlowProfileSensitivityClass tc = 0; tc < FlowProfileSensitivityClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true; for (FlowProfileSensitivityClass tc = 0; tc < FlowProfileSensitivityClass.Count; tc++) if (tc.ToDescription().Equals(strValue)) return true;
break; break;
case 23: case 25:
if (strValue.Equals(Medium.ColdWater.ToDescription()) || strValue.Equals(Medium.HotWater.ToDescription())) return true; /// "zimna", "tepla" if (strValue.Equals(Medium.ColdWater.ToDescription()) || strValue.Equals(Medium.HotWater.ToDescription())) return true; /// "zimna", "tepla"
break; break;
default: default:
@ -279,11 +342,13 @@ namespace TBF.Rig.WaterMeters.WaterMeter
prms.DN = this.DN; prms.DN = this.DN;
prms.L = this.L; prms.L = this.L;
prms.Mounting = this.Mounting; prms.Mounting = this.Mounting;
prms.NewQnames = this.NewQnames; prms.Qnames = this.Qnames;
prms.Qmax = this.Qmax; prms.Qmax = this.Qmax;
prms.Qn = this.Qn; prms.Qn = this.Qn;
prms.Qt = this.Qt; prms.Qt = this.Qt;
prms.Qmin = this.Qmin; prms.Qmin = this.Qmin;
prms.ErrLimHiQ = this.ErrLimHiQ;
prms.ErrLimLoQ = this.ErrLimLoQ;
prms.MetrologicalClass = this.MetrologicalClass; prms.MetrologicalClass = this.MetrologicalClass;
prms.TemperatureClass = this.TemperatureClass; prms.TemperatureClass = this.TemperatureClass;
prms.PressureLossClass = this.PressureLossClass; prms.PressureLossClass = this.PressureLossClass;
@ -297,7 +362,6 @@ namespace TBF.Rig.WaterMeters.WaterMeter
prms.Text3 = this.Text3; prms.Text3 = this.Text3;
prms.Text4 = this.Text4; prms.Text4 = this.Text4;
prms.Text5 = this.Text5; prms.Text5 = this.Text5;
prms.WaterTemp = this.WaterTemp; prms.WaterTemp = this.WaterTemp;
} }

View File

@ -1,5 +1,5 @@
/// ///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s. /// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// ///
using log4net; using log4net;
using Common; using Common;
@ -31,11 +31,13 @@ namespace TBF.Rig.WaterMeters.WaterMeter
public Mounting Mounting { get { return waterMeterCfg.ProcParams.Mounting; } } public Mounting Mounting { get { return waterMeterCfg.ProcParams.Mounting; } }
/// <summary>Nominal water flow in [m3/h]</summary> /// <summary>Nominal water flow in [m3/h]</summary>
public bool NewQnames { get { return waterMeterCfg.ProcParams.NewQnames; } } public FlowNames Qnames { get { return waterMeterCfg.ProcParams.Qnames; } }
public float Q4_Qmax { get { return waterMeterCfg.ProcParams.Qmax; } } public double Q4_Qmax { get { return waterMeterCfg.ProcParams.Qmax; } }
public float Q3_Qn { get { return waterMeterCfg.ProcParams.Qn; } } public double Q3_Qn { get { return waterMeterCfg.ProcParams.Qn; } }
public float Q2_Qt { get { return waterMeterCfg.ProcParams.Qt; } } public double Q2_Qt { get { return waterMeterCfg.ProcParams.Qt; } }
public float Q1_Qmin { get { return waterMeterCfg.ProcParams.Qmin; } } public double Q1_Qmin { get { return waterMeterCfg.ProcParams.Qmin; } }
public double ErrLimHiQ { get { return waterMeterCfg.ProcParams.ErrLimHiQ; } }
public double ErrLimLoQ { get { return waterMeterCfg.ProcParams.ErrLimLoQ; } }
/// <summary>Metrological class, etc</summary> /// <summary>Metrological class, etc</summary>
public string MetrologicalClass { get { return waterMeterCfg.ProcParams.MetrologicalClass; } } public string MetrologicalClass { get { return waterMeterCfg.ProcParams.MetrologicalClass; } }

View File

@ -1,5 +1,5 @@
/// ///
/// Copyright (c) 2020-2022 Sensus Slovensko a.s. /// Copyright (c) 2020-2023 Sensus Slovensko a.s.
/// ///
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -773,11 +773,11 @@ namespace TBF.UI.Procedures
TBF.Rig.WaterMeters.WaterMeter.ProcParams wmParams = waterMeterParams as TBF.Rig.WaterMeters.WaterMeter.ProcParams; TBF.Rig.WaterMeters.WaterMeter.ProcParams wmParams = waterMeterParams as TBF.Rig.WaterMeters.WaterMeter.ProcParams;
if (wmParams != null) if (wmParams != null)
{ {
wmParams.NewQnames = (pt == ProfileType.Q3R); wmParams.Qnames = Common.Utils.ProfileType2FlowNames(pt);
wmParams.Qmax = (float)((pt == ProfileType.Manual) ? 0 : Formulas.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium)); wmParams.Qmax = (pt == ProfileType.Manual) ? 0 : Formulas.GetQ4Qmax(dlg.Qn, dlg.MetroClass, medium);
wmParams.Qn = (float)dlg.Qn; wmParams.Qn = dlg.Qn;
wmParams.Qt = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? (0.1 * dlg.Qn) : Formulas.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium)); wmParams.Qt = (pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? (0.1 * dlg.Qn) : Formulas.GetQ2Qt(dlg.Qn, dlg.MetroClass, medium);
wmParams.Qmin = (float)((pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? dlg.Qn / dlg.QpQiRatio : Formulas.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium)); wmParams.Qmin = (pt == ProfileType.Manual) ? 0 : (pt == ProfileType.QpQi) ? dlg.Qn / dlg.QpQiRatio : Formulas.GetQ1Qmin(dlg.Qn, dlg.MetroClass, medium);
wmParams.MetrologicalClass = dlg.MetroClass; wmParams.MetrologicalClass = dlg.MetroClass;
wmParams.WaterTemp = medium; wmParams.WaterTemp = medium;
} }