diff --git a/ThermofluidStream/Sensors/DifferenceSensorSelect.mo b/ThermofluidStream/Sensors/DifferenceSensorSelect.mo index 896428d0..dd330019 100644 --- a/ThermofluidStream/Sensors/DifferenceSensorSelect.mo +++ b/ThermofluidStream/Sensors/DifferenceSensorSelect.mo @@ -69,13 +69,13 @@ model DifferenceSensorSelect "Sensor for selectable quantatiy difference" protected Real direct_value(unit=Internal.getUnit(quantity)); - function getQuantityA = Internal.getQuantity(redeclare package Medium=MediumA) "Quantity compute function A" + Internal.GetQuantity getQuantityA(redeclare package Medium=MediumA, quantity=quantity, rho_min=rho_min) "Quantity compute function" annotation (Documentation(info=" -
This function computes the selected quantity from state. r and rho_min are neddet for the quantities r/p_total and v respectively.
+This block computes the selected quantity from state. r and rho_min are needed for the quantities r/p_total and v respectively.
")); - function getQuantityB = Internal.getQuantity(redeclare package Medium=MediumB) "Quantity compute function B" + Internal.GetQuantity getQuantityB(redeclare package Medium=MediumB, quantity=quantity, rho_min=rho_min) "Quantity compute function" annotation (Documentation(info=" -This function computes the selected quantity from state. r and rho_min are neddet for the quantities r/p_total and v respectively.
+This block computes the selected quantity from state. r and rho_min are needed for the quantities r/p_total and v respectively.
")); initial equation @@ -90,8 +90,14 @@ equation inletA.m_flow = 0; inletB.m_flow = 0; - valueA = getQuantityA(inletA.state, inletA.r, quantity, rho_min); - valueB = getQuantityB(inletB.state, inletB.r, quantity, rho_min); + getQuantityA.r = inletA.r; + getQuantityA.state = inletA.state; + + getQuantityB.r = inletB.r; + getQuantityB.state = inletB.state; + + valueA = getQuantityA.value; + valueB = getQuantityB.value; direct_value = valueA - valueB; diff --git a/ThermofluidStream/Sensors/Internal/GetQuantity.mo b/ThermofluidStream/Sensors/Internal/GetQuantity.mo new file mode 100644 index 00000000..f87eff54 --- /dev/null +++ b/ThermofluidStream/Sensors/Internal/GetQuantity.mo @@ -0,0 +1,57 @@ +within ThermofluidStream.Sensors.Internal; +block GetQuantity "Computes selected quantity from state" + extends Modelica.Blocks.Icons.Block; + replaceable package Medium = Media.myMedia.Interfaces.PartialMedium "Medium model" annotation( + choicesAllMatching = true, + Documentation(info = " +Medium Model for the function. Make sure it implements the needed functions.
+ ")); + parameter Types.Quantities quantity; + parameter Modelica.Units.SI.Density rho_min; + + input Medium.ThermodynamicState state; + input Modelica.Units.SI.Pressure r; + output Real value; +equation + if quantity == Types.Quantities.T_K then + value = Medium.temperature(state); + elseif quantity == Types.Quantities.T_C then + value = Modelica.Units.Conversions.to_degC(Medium.temperature(state)); + elseif quantity == Types.Quantities.p_Pa then + value = Medium.pressure(state); + elseif quantity == Types.Quantities.p_bar then + value = Modelica.Units.Conversions.to_bar(Medium.pressure(state)); + elseif quantity == Types.Quantities.r_Pa then + value = r; + elseif quantity == Types.Quantities.r_bar then + value = Modelica.Units.Conversions.to_bar(r); + elseif quantity == Types.Quantities.p_total_Pa then + value = Medium.pressure(state) + r; + elseif quantity == Types.Quantities.p_total_bar then + value = Modelica.Units.Conversions.to_bar(Medium.pressure(state) + r); + elseif quantity == Types.Quantities.h_Jpkg then + value = Medium.specificEnthalpy(state); + elseif quantity == Types.Quantities.s_JpkgK then + value = Medium.specificEntropy(state); + elseif quantity == Types.Quantities.rho_kgpm3 then + value = Medium.density(state); + elseif quantity == Types.Quantities.v_m3pkg then + value = 1/(max(rho_min, Medium.density(state))); + elseif quantity == Types.Quantities.a_mps then + value = Medium.velocityOfSound(state); + elseif quantity == Types.Quantities.cv_JpkgK then + value = Medium.specificHeatCapacityCv(state); + elseif quantity == Types.Quantities.cp_JpkgK then + value = Medium.specificHeatCapacityCp(state); + elseif quantity == Types.Quantities.kappa_1 then + value = Medium.isentropicExponent(state); + elseif quantity == Types.Quantities.MM_kgpmol then + value = Medium.molarMass(state); + else + value = 0; + end if; + annotation( + Documentation(info = " +Helper block to get a quantity from an Thermofluid state.
+")); +end GetQuantity; diff --git a/ThermofluidStream/Sensors/Internal/getQuantity.mo b/ThermofluidStream/Sensors/Internal/getQuantity.mo index 3f63a614..e8d54147 100644 --- a/ThermofluidStream/Sensors/Internal/getQuantity.mo +++ b/ThermofluidStream/Sensors/Internal/getQuantity.mo @@ -1,6 +1,6 @@ within ThermofluidStream.Sensors.Internal; function getQuantity "Computes selected quantity from state" - extends Modelica.Icons.Function; + extends Modelica.Icons.ObsoleteModel; replaceable package Medium = Media.myMedia.Interfaces.PartialMedium "Medium model" @@ -54,7 +54,7 @@ algorithm value :=0; end if; - annotation (Documentation(info=" + annotation (Documentation(obsolete="Use Sensors.Internal.GetQuantity instead", info="Helper function to get a quantity from an Thermofluid state.
")); end getQuantity; diff --git a/ThermofluidStream/Sensors/Internal/package.order b/ThermofluidStream/Sensors/Internal/package.order index 57901aba..f64d3ca1 100644 --- a/ThermofluidStream/Sensors/Internal/package.order +++ b/ThermofluidStream/Sensors/Internal/package.order @@ -1,5 +1,6 @@ Types getQuantity +GetQuantity getFlowQuantity getTwoPhaseQuantity getUnit diff --git a/ThermofluidStream/Sensors/SingleSensorSelect.mo b/ThermofluidStream/Sensors/SingleSensorSelect.mo index 337c1b7a..0d4e953c 100644 --- a/ThermofluidStream/Sensors/SingleSensorSelect.mo +++ b/ThermofluidStream/Sensors/SingleSensorSelect.mo @@ -57,9 +57,9 @@ model SingleSensorSelect "Selectable sensor" protected Real direct_value(unit=Internal.getUnit(quantity)); - function getQuantity = Internal.getQuantity(redeclare package Medium=Medium) "Quantity compute function" + Internal.GetQuantity getQuantity(redeclare package Medium=Medium, quantity=quantity, rho_min=rho_min) "Quantity compute function" annotation (Documentation(info=" -This function computes the selected quantity from state. r and rho_min are neddet for the quantities r/p_total and v respectively.
+This block computes the selected quantity from state. r and rho_min are needed for the quantities r/p_total and v respectively.
")); initial equation @@ -70,8 +70,11 @@ initial equation end if; equation + getQuantity.r = inlet.r; + getQuantity.state = inlet.state; + inlet.m_flow = 0; - direct_value = getQuantity(inlet.state, inlet.r, quantity, rho_min); + direct_value = getQuantity.value; if filter_output then der(value) * TC = direct_value-value; diff --git a/ThermofluidStream/Undirected/Sensors/SingleSensorSelect.mo b/ThermofluidStream/Undirected/Sensors/SingleSensorSelect.mo index 87a8b641..1bdcc8d6 100644 --- a/ThermofluidStream/Undirected/Sensors/SingleSensorSelect.mo +++ b/ThermofluidStream/Undirected/Sensors/SingleSensorSelect.mo @@ -48,10 +48,10 @@ model SingleSensorSelect "Selectable sensor" transformation(extent={{70,50},{90,70}}), iconTransformation(extent={{70,50},{90,70}}))); - function getQuantity = ThermofluidStream.Sensors.Internal.getQuantity ( - redeclare package Medium = Medium) "Quantity compute function" + + ThermofluidStream.Sensors.Internal.GetQuantity getQuantity(redeclare package Medium=Medium, quantity=quantity, rho_min=rho_min) "Quantity compute function" annotation (Documentation(info=" -This function computes the selected quantity from state. r and rho_min are neddet for the quantities r/p_total and v respectively.
+This block computes the selected quantity from state. r and rho_min are needed for the quantities r/p_total and v respectively.
")); Real value(unit=ThermofluidStream.Sensors.Internal.getUnit(quantity)); @@ -66,10 +66,10 @@ initial equation value = value_0; end if; - equation - - direct_value = getQuantity(state, rear.r, quantity, rho_min); + getQuantity.r = rear.r; + getQuantity.state = state; + direct_value = getQuantity.value; if filter_output then der(value) * TC = direct_value-value;