From 5806a65a0ccef40904176fd3653addbe1d0d65a0 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Tue, 3 Feb 2015 10:30:24 +0100 Subject: [PATCH] RegulValveTandem op SetFlowOp should be functional, to be tested --- .../Elde/RegulValve/ChangeValvePositionOp.cs | 10 +-- .../BenchControl/Elde/RegulValve/SetFlowOp.cs | 10 +-- .../RegulValve/SetRegulValvePositionOp.cs | 2 +- .../RegulValveTandem/ChangeValvePositionOp.cs | 12 +-- .../Elde/RegulValveTandem/RegulValveTandem.cs | 29 ++++--- .../RegulValveTandem/RegulValveTandemCfg.cs | 13 +-- .../RegulValveTandemCfgCtrl.cs | 14 ++-- .../RegulValveTandemCfgCtrl.designer.cs | 56 ++++++------- .../Elde/RegulValveTandem/SetFlowOp.cs | 80 ++++++++++++++----- .../SetRegulValvePositionOp.cs | 12 +-- 10 files changed, 139 insertions(+), 99 deletions(-) diff --git a/TestBenchFramework/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs index b92df2ddd..ba1907bed 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValve/ChangeValvePositionOp.cs @@ -24,19 +24,19 @@ namespace TBF.BenchControl.Elde.RegulValve /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component /// Lower limit of the position to be achieved /// Upper limit of the position to be achieved /// Timeout in sec. for setting the flow /// Only Elde.Valve flow are used, other flow on the lists are ignored - public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve regulValve, float timePulseSec) + public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, RegulValve _regulValve, float timePulseSec) { if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); this.controlBoard = controlBoard; - this.regulValve = regulValve as RegulValve; - if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); - this.regulValveNr = this.regulValve.Idx1; + regulValve = _regulValve as RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; this.timePulseSec = timePulseSec; diff --git a/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs index f9b3e9b19..6e120ef31 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs @@ -53,7 +53,7 @@ namespace TBF.BenchControl.Elde.RegulValve /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component /// Flowmeter component /// Lower limit of the flow to be achieved in [m3/h] /// Upper limit of the flow to be achieved in [m3/h] @@ -61,16 +61,16 @@ namespace TBF.BenchControl.Elde.RegulValve /// Timeout for the flow setting in [s] /// true = Leave the measurement running after op. stop /// Only Elde.Valve flow are used, other flow on the lists are ignored - public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regulValve, IFlowMeter flowMeter, + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve _regulValve, IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, int timeout, bool leaveMeasurementRunning) { if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); this.controlBoard = controlBoard; - this.regulValve = regulValve as Elde.RegulValve.RegulValve; + regulValve = _regulValve as Elde.RegulValve.RegulValve; if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); - this.regulValveNr = this.regulValve.Idx1; + regulValveNr = this.regulValve.Idx1; if (flowMeter is Elde.FlowMeter.FlowMeter) { @@ -178,7 +178,7 @@ namespace TBF.BenchControl.Elde.RegulValve TestMethods tm = 0; StopDevs sd = 0; - // 'regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + // '_regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' controlBoard.SendCommand(Command.Start, flowMeterNr, controlBoard.Route, int.MaxValue, tm, 0.0f, (int)pidCoef, 0, sd); } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs index 804877c57..0110baeec 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs @@ -31,7 +31,7 @@ namespace TBF.BenchControl.Elde.RegulValve /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component /// Lower limit of the position to be achieved /// Upper limit of the position to be achieved /// Timeout in sec. for setting the flow diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs index bb0cecf6c..033f34373 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/ChangeValvePositionOp.cs @@ -15,7 +15,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Set by the constructor readonly ControlBoardDev controlBoard; - readonly RegulValveTandem regulValve; + readonly Elde.RegulValve.RegulValve regulValve; readonly int regulValveNr; readonly float timePulseSec; @@ -24,19 +24,19 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component /// Lower limit of the position to be achieved /// Upper limit of the position to be achieved /// Timeout in sec. for setting the flow /// Only Elde.Valve flow are used, other flow on the lists are ignored - public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, RegulValveTandem regulValve, float timePulseSec) + public ChangeRegulValvePositionOp(ControlBoardDev controlBoard, IRegulValve _regulValve, float timePulseSec) { if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); this.controlBoard = controlBoard; - this.regulValve = regulValve as RegulValveTandem; - if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); - this.regulValveNr = this.regulValve.Idx1; + regulValve = _regulValve as Elde.RegulValve.RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; this.timePulseSec = timePulseSec; diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs index fc1fcaa84..8f244aeb0 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs @@ -21,16 +21,14 @@ namespace TBF.BenchControl.Elde.RegulValveTandem readonly RegulValve.RegulValve regulValve; readonly RegulValve.RegulValve fixedRV; - public int Idx1 { get { return regulValve.Idx1; } } /// 1..7 - public int DacValueClosed { get { return regulValve.DacValueClosed; } } /// 0..1023 - public int DacValueOpen { get { return regulValve.DacValueOpen; } } /// 0..1023 - /// - public int StableTime { get { return RegulValveTandemCfg.StableTime; } } /// 0=200ms, step=50ms, max. 1500ms (max.26) + readonly float fixedPctLo; /// [%] + readonly float fixedPctHi; /// [%] + public int FlowStableSec { get { return RegulValveTandemCfg.FlowStableSec; } } /// 0..60 sec /// public float Position { - get { return controlBoard.RValvePosition(Idx1); } + get { return regulValve.Position; } } @@ -45,6 +43,9 @@ namespace TBF.BenchControl.Elde.RegulValveTandem fixedRV = (RegulValve.RegulValve)TbfComponents.FindComponent(RegulValveTandemCfg.ParentName, components); if (fixedRV == null) throw new Exception("Cannot find fixed RV"); + fixedPctLo = Math.Max(0.0f, RegulValveTandemCfg.FixedRVPosition - 3.0f); + fixedPctHi = Math.Min(100.0f, RegulValveTandemCfg.FixedRVPosition + 3.0f); + this.dict = new Dictionary(); log.Debug(this.ToString()); @@ -61,9 +62,11 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Measured flow [m3/h] /// Timeout in [s] /// SetFlowOp instance - public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, int timeout) + public IOperation SetFlowOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, FloatBox measuredFlow, int timeout) { - return new SetFlowOp(controlBoard, this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout); + return new SetFlowOp(controlBoard, regulValve, fixedRV, fixedPctLo, fixedPctHi, + flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout); } /// @@ -76,9 +79,11 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Measured flow [m3/h] /// Timeout in [s] /// SetFlowOp instance - public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, int timeout, float filterConstant) + public IOperation SetFlowAndMeasureOp(GenericDevices.IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, + float pidCoef, FloatBox measuredFlow, int timeout, float filterConstant) { - return new SetFlowOp(controlBoard, this, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, true); + return new SetFlowOp(controlBoard, regulValve, fixedRV, fixedPctLo, fixedPctHi, + flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, true); } /// @@ -90,12 +95,12 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// SetPositionOp instance public IOperation SetRegulValvePositionOp(float pctLo, float pctHi, int timeoutMs) { - return new SetRegulValvePositionOp(controlBoard, this, pctLo, pctHi, timeoutMs); + return null; } public IOperation ChangeRegulValvePositionOp(float timePulseSec) { - return new ChangeRegulValvePositionOp(controlBoard, this, timePulseSec); + return null; } } } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs index efceb51e5..f9164ad00 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfg.cs @@ -16,15 +16,10 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// public string RegulValveName; /// Name of the regulation valve used to control the flow public string FixedRVName; /// Name of the regulation valve with a fixed position - public int StableTimeMs; /// 200..1500 ms + public float FixedRVPosition; /// Fixed RV position 0 .. 100 in [%] public bool StoredPositionReuse; /// true = store and re-use previous regulation valve positions public int FlowStableSec; /// 0..60 sec - /// - /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. - /// - public int StableTime { get { return (StableTimeMs - 200) / 50; } } - /// Private parameterless constructor invoked by all other (public) constructors RegulValveTandemCfg() { @@ -34,7 +29,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem RegulValveName = "RV1"; FixedRVName = "RV2"; - StableTimeMs = 500; + FixedRVPosition = 50.0f; StoredPositionReuse = false; FlowStableSec = 5; } @@ -47,11 +42,11 @@ namespace TBF.BenchControl.Elde.RegulValveTandem public string ToString(int i) { - return string.Format("Name={0}, ControlledRVName={1}, ADC-FixedRVName={2}, StabTm={3}ms, PosReuse={4}, FlowStable={5}s", + return string.Format("Name={0}, RegulVName={1}, FixedRVName={2}, FixedRVPos={3}%, PosReuse={4}, FlowStable={5}s", Name, RegulValveName, FixedRVName, - StableTimeMs, + FixedRVPosition.ToString("F0"), StoredPositionReuse, FlowStableSec); } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs index 6d112967a..cb96ba2f3 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.cs @@ -61,7 +61,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem nameTextBox.Text = config.Name; regulValveNameComboBox.Text = string.IsNullOrEmpty(config.RegulValveName) ? "---" : config.RegulValveName; fixedRVNameComboBox.Text = string.IsNullOrEmpty(config.FixedRVName) ? "---" : config.FixedRVName; - stableTimeTextBox.Text = config.StableTimeMs.ToString(); + fixedRVPositionTextBox.Text = config.FixedRVPosition.ToString("F0"); storedPosReuseCheckBox.Checked = config.StoredPositionReuse; flowStableSecTextBox.Text = config.FlowStableSec.ToString(); } @@ -71,7 +71,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem nameTextBox.Enabled = true; regulValveNameComboBox.Enabled = true; fixedRVNameComboBox.Enabled = true; - stableTimeTextBox.Enabled = true; + fixedRVPositionTextBox.Enabled = true; storedPosReuseCheckBox.Enabled = true; flowStableSecTextBox.Enabled = true; } @@ -93,13 +93,13 @@ namespace TBF.BenchControl.Elde.RegulValveTandem } int dummy; - if (!int.TryParse(stableTimeTextBox.Text, out dummy) || dummy < 200 || dummy > 1500 || (dummy % 50) != 0) + if (!int.TryParse(fixedRVPositionTextBox.Text, out dummy) || dummy < 0 || dummy > 100) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "'Stable time' should be between 200 and 1500 ms in 50 ms steps"; } - if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60) + if (!int.TryParse(flowStableSecTextBox.Text, out dummy) || dummy < 0 || dummy > 60) { flags |= CfgUpdateFlags.Error; message += Environment.NewLine + "'Flow stable' should be between 0 and 60 sec"; @@ -134,10 +134,10 @@ namespace TBF.BenchControl.Elde.RegulValveTandem flags |= CfgUpdateFlags.RestartRqrd; } - int tmp = int.Parse(stableTimeTextBox.Text); - if (config.StableTimeMs != tmp) + int tmp = int.Parse(fixedRVPositionTextBox.Text); + if (config.FixedRVPosition != (float)tmp) { - config.StableTimeMs = tmp; + config.FixedRVPosition = (float)tmp; flags |= CfgUpdateFlags.RestartRqrd; } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs index 7b7fc7c4a..f73e73f87 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandemCfgCtrl.designer.cs @@ -34,18 +34,18 @@ this.classNameLabel = new System.Windows.Forms.Label(); this.regulValveNameComboBox = new System.Windows.Forms.ComboBox(); this.storedPosReuseCheckBox = new System.Windows.Forms.CheckBox(); - this.stableTimeTextBox = new System.Windows.Forms.TextBox(); - this.stableTimeLabel = new System.Windows.Forms.Label(); this.flowStableSecTextBox = new System.Windows.Forms.TextBox(); this.flowStableSecLabel = new System.Windows.Forms.Label(); this.fixedRVNameComboBox = new System.Windows.Forms.ComboBox(); this.fixedRVNameLabel = new System.Windows.Forms.Label(); + this.fixedRVPositionTextBox = new System.Windows.Forms.TextBox(); + this.fixedRVPositionLabel = new System.Windows.Forms.Label(); this.SuspendLayout(); // // regulValveNameLabel // this.regulValveNameLabel.AutoSize = true; - this.regulValveNameLabel.Location = new System.Drawing.Point(28, 69); + this.regulValveNameLabel.Location = new System.Drawing.Point(28, 68); this.regulValveNameLabel.Name = "regulValveNameLabel"; this.regulValveNameLabel.Size = new System.Drawing.Size(87, 13); this.regulValveNameLabel.TabIndex = 3; @@ -81,7 +81,7 @@ // this.regulValveNameComboBox.Enabled = false; this.regulValveNameComboBox.FormattingEnabled = true; - this.regulValveNameComboBox.Location = new System.Drawing.Point(138, 66); + this.regulValveNameComboBox.Location = new System.Drawing.Point(138, 65); this.regulValveNameComboBox.Name = "regulValveNameComboBox"; this.regulValveNameComboBox.Size = new System.Drawing.Size(130, 21); this.regulValveNameComboBox.TabIndex = 4; @@ -97,23 +97,6 @@ this.storedPosReuseCheckBox.Text = "Enable stored position re-use"; this.storedPosReuseCheckBox.UseVisualStyleBackColor = true; // - // stableTimeTextBox - // - this.stableTimeTextBox.Enabled = false; - this.stableTimeTextBox.Location = new System.Drawing.Point(138, 144); - this.stableTimeTextBox.Name = "stableTimeTextBox"; - this.stableTimeTextBox.Size = new System.Drawing.Size(46, 20); - this.stableTimeTextBox.TabIndex = 15; - // - // stableTimeLabel - // - this.stableTimeLabel.AutoSize = true; - this.stableTimeLabel.Location = new System.Drawing.Point(28, 147); - this.stableTimeLabel.Name = "stableTimeLabel"; - this.stableTimeLabel.Size = new System.Drawing.Size(81, 13); - this.stableTimeLabel.TabIndex = 14; - this.stableTimeLabel.Text = "Stable time [ms]"; - // // flowStableSecTextBox // this.flowStableSecTextBox.Enabled = false; @@ -135,7 +118,7 @@ // this.fixedRVNameComboBox.Enabled = false; this.fixedRVNameComboBox.FormattingEnabled = true; - this.fixedRVNameComboBox.Location = new System.Drawing.Point(138, 93); + this.fixedRVNameComboBox.Location = new System.Drawing.Point(138, 91); this.fixedRVNameComboBox.Name = "fixedRVNameComboBox"; this.fixedRVNameComboBox.Size = new System.Drawing.Size(130, 21); this.fixedRVNameComboBox.TabIndex = 22; @@ -143,22 +126,39 @@ // fixedRVNameLabel // this.fixedRVNameLabel.AutoSize = true; - this.fixedRVNameLabel.Location = new System.Drawing.Point(28, 96); + this.fixedRVNameLabel.Location = new System.Drawing.Point(28, 94); this.fixedRVNameLabel.Name = "fixedRVNameLabel"; this.fixedRVNameLabel.Size = new System.Drawing.Size(82, 13); this.fixedRVNameLabel.TabIndex = 21; this.fixedRVNameLabel.Text = "Fixed reg. valve"; // + // fixedRVPositionTextBox + // + this.fixedRVPositionTextBox.Enabled = false; + this.fixedRVPositionTextBox.Location = new System.Drawing.Point(138, 117); + this.fixedRVPositionTextBox.Name = "fixedRVPositionTextBox"; + this.fixedRVPositionTextBox.Size = new System.Drawing.Size(46, 20); + this.fixedRVPositionTextBox.TabIndex = 24; + // + // fixedRVPositionLabel + // + this.fixedRVPositionLabel.AutoSize = true; + this.fixedRVPositionLabel.Location = new System.Drawing.Point(28, 120); + this.fixedRVPositionLabel.Name = "fixedRVPositionLabel"; + this.fixedRVPositionLabel.Size = new System.Drawing.Size(89, 13); + this.fixedRVPositionLabel.TabIndex = 23; + this.fixedRVPositionLabel.Text = "Fixed RV position"; + // // RegulValveTandemCfgCtrl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fixedRVPositionTextBox); + this.Controls.Add(this.fixedRVPositionLabel); this.Controls.Add(this.fixedRVNameComboBox); this.Controls.Add(this.fixedRVNameLabel); this.Controls.Add(this.flowStableSecTextBox); this.Controls.Add(this.flowStableSecLabel); - this.Controls.Add(this.stableTimeTextBox); - this.Controls.Add(this.stableTimeLabel); this.Controls.Add(this.storedPosReuseCheckBox); this.Controls.Add(this.regulValveNameComboBox); this.Controls.Add(this.regulValveNameLabel); @@ -180,12 +180,12 @@ private System.Windows.Forms.Label nameLabel; private System.Windows.Forms.Label classNameLabel; private System.Windows.Forms.ComboBox regulValveNameComboBox; - private System.Windows.Forms.CheckBox storedPosReuseCheckBox; - private System.Windows.Forms.TextBox stableTimeTextBox; - private System.Windows.Forms.Label stableTimeLabel; + private System.Windows.Forms.CheckBox storedPosReuseCheckBox; private System.Windows.Forms.TextBox flowStableSecTextBox; private System.Windows.Forms.Label flowStableSecLabel; private System.Windows.Forms.ComboBox fixedRVNameComboBox; private System.Windows.Forms.Label fixedRVNameLabel; + private System.Windows.Forms.TextBox fixedRVPositionTextBox; + private System.Windows.Forms.Label fixedRVPositionLabel; } } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs index 350edea54..92aa55717 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetFlowOp.cs @@ -18,6 +18,10 @@ namespace TBF.BenchControl.Elde.RegulValveTandem readonly ControlBoardDev controlBoard; readonly Elde.RegulValve.RegulValve regulValve; readonly int regulValveNr; + readonly Elde.RegulValve.RegulValve fixedRV; + readonly int fixedRVNr; + readonly float fixedPctLo; + readonly float fixedPctHi; readonly int flowMeterNr; readonly float reqFlowLo; readonly float reqFlowHi; @@ -32,9 +36,11 @@ namespace TBF.BenchControl.Elde.RegulValveTandem enum OpState { Idle = 0, - ValveMoveToPosition, + IssueSetPositionCommand, SettingPosition, - ValveMoveToFlow, + IssueSetPositionCommand_FixedRV, + SettingPosition_FixedRV, + IssueSetFlowCommand, SettingFlow, FlowReached, } @@ -53,7 +59,10 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component + /// Regulation valve set to a fixed position + /// Lower limit of the fixed position of the fixed reg.v. + /// Upper limit of the fixed position of the fixed reg.v. /// Flowmeter component /// Lower limit of the flow to be achieved in [m3/h] /// Upper limit of the flow to be achieved in [m3/h] @@ -61,16 +70,23 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Timeout for the flow setting in [s] /// true = Leave the measurement running after op. stop /// Only Elde.Valve flow are used, other flow on the lists are ignored - public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regulValve, IFlowMeter flowMeter, - float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regV, IRegulValve fxdRV, float fxdPctLo, float fxdPctHi, + IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, int timeout, bool leaveMeasurementRunning) { if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); this.controlBoard = controlBoard; - this.regulValve = regulValve as Elde.RegulValve.RegulValve; - if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); - this.regulValveNr = this.regulValve.Idx1; + regulValve = regV as Elde.RegulValve.RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = regulValve.Idx1; + + fixedRV = fxdRV as Elde.RegulValve.RegulValve; + if (fixedRV == null) throw new ArgumentNullException("regValve is null or not Elde"); + fixedRVNr = fixedRV.Idx1; + + this.fixedPctLo = fxdPctLo; + this.fixedPctHi = fxdPctHi; if (flowMeter is Elde.FlowMeter.FlowMeter) { @@ -104,9 +120,9 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Set required water flow - Do not leave the measurement running. /// Events: FlowSet /// - public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IFlowMeter flowMeter, - float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, int timeout) - : this(controlBoard, regValve, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, false) + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IRegulValve fixedRV, float fixedPctLo, float fixedPctHi, + IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow, int timeout) + : this(controlBoard, regValve, fixedRV, fixedPctLo, fixedPctHi, flowMeter, requiredFlowLo, requiredFlowHi, pidCoef, measuredFlow, timeout, false) { } @@ -114,9 +130,9 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Set required water flow - No timeout. /// Events: FlowSet /// - public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IFlowMeter flowMeter, - float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow) - : this(controlBoard, regValve, flowMeter, requiredFlowLo, pidCoef, requiredFlowHi, measuredFlow, int.MaxValue, false) + public SetFlowOp(ControlBoardDev controlBoard, IRegulValve regValve, IRegulValve fixedRV, float fixedPctLo, float fixedPctHi, + IFlowMeter flowMeter, float requiredFlowLo, float requiredFlowHi, float pidCoef, FloatBox measuredFlow) + : this(controlBoard, regValve, fixedRV, fixedPctLo, fixedPctHi, flowMeter, requiredFlowLo, pidCoef, requiredFlowHi, measuredFlow, int.MaxValue, false) { } @@ -163,14 +179,14 @@ namespace TBF.BenchControl.Elde.RegulValveTandem log.InfoFormat("Start(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3} FETCHED: posLo={4} posHi={5}", regulValveNr, flowMeterNr, reqFlowLo, reqFlowHi, targetPositionLo, targetPositionHi); - opState = OpState.ValveMoveToPosition; + opState = OpState.IssueSetPositionCommand; } else { log.InfoFormat("Start(): rv#={0} flowMtr#={1} TARGET: flowLo={2} flowHi={3}", regulValveNr, flowMeterNr, reqFlowLo, reqFlowHi); - opState = OpState.ValveMoveToFlow; + opState = OpState.IssueSetPositionCommand_FixedRV; } expireTime = StateMachine.Time + timeout; @@ -178,7 +194,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem TestMethods tm = 0; StopDevs sd = 0; - // 'regulValve.RegulValveTandemCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' + // '_regulValve.RegulValveTandemCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' controlBoard.SendCommand(Command.Start, flowMeterNr, controlBoard.Route, int.MaxValue, tm, 0.0f, (int)pidCoef, 0, sd); } @@ -190,6 +206,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem public Event Run() { float rvPosition = controlBoard.RValvePosition(regulValveNr); + float fixedRVPosition = controlBoard.RValvePosition(fixedRVNr); float flowMtrFreq = controlBoard.ReferenceFreq; float flow = flowMtrFreq * nominalFlow / 2000.0f; @@ -198,7 +215,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem log.InfoFormat("Run(): rv#={0} pos={1}% freq={2} flow={3} opState={4}", regulValveNr, rvPosition.ToString("F1"), flowMtrFreq, flow, opState); - if (opState == OpState.ValveMoveToPosition) + if (opState == OpState.IssueSetPositionCommand) { /// /// Done once, issues an appropriate ValveMove(...) command @@ -217,11 +234,34 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// if ((targetPositionLo <= rvPosition) && (rvPosition <= targetPositionHi)) { - opState = OpState.ValveMoveToFlow; + opState = OpState.IssueSetPositionCommand_FixedRV; } return Event.None; } - else if (opState == OpState.ValveMoveToFlow) + else if (opState == OpState.IssueSetPositionCommand_FixedRV) + { + /// + /// Done once, issues an appropriate ValveMove(...) command + /// + controlBoard.ValveMove(fixedRVNr, RegulValveMode.TargetPosition, + new float[2] { fixedPctLo, fixedPctHi }, + regulValve.StableTime); + + opState = OpState.SettingPosition_FixedRV; + return Event.None; + } + else if (opState == OpState.SettingPosition_FixedRV) + { + /// + /// Repeated untill position is reached + /// + if ((fixedPctLo <= fixedRVPosition) && (fixedRVPosition <= fixedPctHi)) + { + opState = OpState.IssueSetFlowCommand; + } + return Event.None; + } + else if (opState == OpState.IssueSetFlowCommand) { /// /// Done once, issues an appropriate ValveMove(...) command diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs index 6ea9e4d42..2eb57a0ec 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/SetRegulValvePositionOp.cs @@ -15,7 +15,7 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Set by the constructor readonly ControlBoardDev controlBoard; - readonly RegulValveTandem regulValve; + readonly Elde.RegulValve.RegulValve regulValve; readonly int regulValveNr; readonly float posLoPct; readonly float posHiPct; @@ -31,19 +31,19 @@ namespace TBF.BenchControl.Elde.RegulValveTandem /// Events: FlowSet, FlowTimeOut /// /// Control board device - /// Regulation valve component + /// Regulation valve component /// Lower limit of the position to be achieved /// Upper limit of the position to be achieved /// Timeout in sec. for setting the flow /// Only Elde.Valve flow are used, other flow on the lists are ignored - public SetRegulValvePositionOp(ControlBoardDev controlBoard, RegulValveTandem regulValve, float posLoPct, float posHiPct, int timeout) + public SetRegulValvePositionOp(ControlBoardDev controlBoard, IRegulValve regV, float posLoPct, float posHiPct, int timeout) { if (controlBoard == null) throw new ArgumentNullException("ctrlBoard"); this.controlBoard = controlBoard; - this.regulValve = regulValve as RegulValveTandem; - if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); - this.regulValveNr = this.regulValve.Idx1; + regulValve = regV as Elde.RegulValve.RegulValve; + if (regulValve == null) throw new ArgumentNullException("regValve is null or not Elde"); + regulValveNr = this.regulValve.Idx1; this.posLoPct = posLoPct; this.posHiPct = posHiPct;