Я пытаюсь создать несколько моделей openmodelica, которые работают аналогично библиотеке жидкости modelica, поскольку в ней используются порты с переменной потока и несколько компонентов, работающих дальше над компонентом TwoPort. Чтобы упростить мой вопрос, я попробую использовать в качестве примера библиотеку жидкости modelica.
В одном из моих компонентов, основанном на PartialTwoPort, мне нужна производная от переменной потока m_flow, но когда я пытаюсь реализовать это, кажется, что системы не могут с этим справиться. (Я пытался найти ответ в Интернете, но не нашел ничего, что могло бы мне помочь)
Я создал простую модель тестирования, которую (надеюсь) можно использовать для проверки возможных решений. Таким образом, TestValue — это то, что я хотел бы получить в качестве результирующего параметра, который я мог бы использовать в дальнейшем коде. Модель работает, когда TestValue закомментировано, но возвращает ошибку, если это не так.
model Fluid_test
//extends Modelica.Icons.Example;
replaceable package Medium = Modelica.Media.Water.StandardWaterOnePhase
constrainedby Modelica.Media.Interfaces.PartialMedium;
Modelica.Fluid.Sources.FixedBoundary boundary(
nPorts = 1,
use_T=true,
T=Modelica.Units.Conversions.from_degC(20),
p=600000,
redeclare package Medium = Medium) annotation(
Placement(transformation(origin = {-56, -18}, extent = {{-10, -10}, {10, 10}})));
Modelica.Fluid.Sources.FixedBoundary boundary1(
p=600000,
T=400,
nPorts=2,
redeclare package Medium = Medium)
annotation (Placement(transformation(origin = {-18, 44}, extent = {{100, -40}, {80, -20}})));
Modelica.Fluid.Machines.PrescribedPump pump(
checkValve=true,
checkValveHomotopy = Modelica.Fluid.Types.CheckValveHomotopyType.Closed,
N_nominal=1200,
redeclare function flowCharacteristic =
Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics.quadraticFlow (
V_flow_nominal = {0,0.25,0.5}, head_nominal = {100,60,0}),
use_N_in=true,
nParallel=1,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
V(displayUnit = "l") = 0.05,
massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
redeclare package Medium = Medium,
p_b_start=600000,
T_start=400) annotation(
Placement(transformation(origin = {-10, 14}, extent = {{-10, -10}, {10, 10}})));
Modelica.Blocks.Sources.Constant const annotation(
Placement(transformation(origin = {-8, 58}, extent = {{-10, -10}, {10, 10}})));
Real TestValue;
equation
TestValue = der(pump.port_a.m_flow);
connect(boundary.ports[1], pump.port_a) annotation(
Line(points = {{-46, -18}, {-20, -18}, {-20, 14}}, color = {0, 127, 255}));
connect(pump.port_b, boundary1.ports[1]) annotation(
Line(points = {{0, 14}, {62, 14}}, color = {0, 127, 255}));
connect(const.y, pump.N_in) annotation(
Line(points = {{4, 58}, {-10, 58}, {-10, 24}}, color = {0, 0, 127}));
annotation(
Diagram);
end Fluid_test;
Возвращается следующая ошибка: введите сюда описание изображения
К сожалению, массовый расход не является состоянием, и использование der()
таким образом, на мой взгляд, не является правильным способом оценки производной. Я бы использовал Derivative block
с достаточно маленькой постоянной времени, как описано в модифицированном примере ниже:
model Fluid_test
//extends Modelica.Icons.Example;
replaceable package Medium = Modelica.Media.Water.StandardWaterOnePhase constrainedby Modelica.Media.Interfaces.PartialMedium;
Modelica.Fluid.Sources.FixedBoundary boundary(
nPorts=1,
use_T=true,
T=Modelica.Units.Conversions.from_degC(20),
p=600000,
redeclare package Medium = Medium) annotation (Placement(transformation(origin = {-50,0}, extent = {{-10,-10},{10,10}})));
Modelica.Fluid.Sources.FixedBoundary boundary1(
p=600000,
T=400,
redeclare package Medium = Medium,
nPorts=1) annotation (Placement(transformation(origin = {-40,30}, extent = {{100,-40},{80,-20}})));
Modelica.Fluid.Machines.PrescribedPump pump(
checkValve=true,
checkValveHomotopy=Modelica.Fluid.Types.CheckValveHomotopyType.Closed,
N_nominal=1200,
redeclare function flowCharacteristic = Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics.quadraticFlow (V_flow_nominal = {0,0.25,0.5}, head_nominal = {100,60,0}),
use_N_in=true,
nParallel=1,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
V(displayUnit = "l") = 0.05,
massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
redeclare package Medium = Medium,
p_b_start=600000,
T_start=400) annotation (Placement(transformation(extent = {{-10,-10},{10,10}})));
Modelica.Blocks.Sources.Constant const(k=1) annotation (Placement(transformation(origin = {-20,30}, extent = {{-10,-10},{10,10}})));
Real TestValue;
Modelica.Blocks.Continuous.Derivative derBlock(
k=1,
T=1e-2,
initType=Modelica.Blocks.Types.Init.SteadyState);
inner Modelica.Fluid.System system annotation (Placement(transformation(extent = {{40,-80},{60,-60}})));
equation
derBlock.u = pump.port_a.m_flow;
TestValue = derBlock.y;
connect(boundary.ports[1], pump.port_a) annotation (Line(points = {{-40,0},{-10,0}}, color = {0,127,255}));
connect(const.y, pump.N_in) annotation (Line(points = {{-9,30},{0,30},{0,10}}, color = {0,0,127}));
connect(pump.port_b, boundary1.ports[1]) annotation (Line(points = {{10,0},{40,0}}, color = {0,127,255}));
annotation (uses(Modelica(version = "4.0.0")));
end Fluid_test;
Я также исправил количество портов на boundary1
(с 2 до 1), установил постоянное значение Constant block
на 1 (вместо нуля) и добавил System block
. Они приводят к предупреждениям в Дымоле.
Отлично, похоже, это работает и для моей исходной модели (хотя мне нужно решить еще несколько небольших проблем). Спасибо за помощь!