В modelica Тепловой порт Электрического. Аналогового. Базового. Резистора определяется только как выход?Если да, то как? - PullRequest
3 голосов
/ 06 мая 2019

Я учусь modelica, все в порядке.До того момента, когда я хотел продемонстрировать акаузальность с помощью резистора моему коллеге.Вопрос, который мы задали себе: каково падение напряжения и ток для резистора 1 Ом, когда тепловая мощность от резистора составляет 1 Вт (очевидно, ответ должен быть 1 В, 1 А).Я не получаю никакого другого результата, кроме 0 В, 0А.Физически я доволен результатом, поскольку не ожидаю, что резистор превратится в источник питания после его нагрева, но я не понимаю, где в коде эта причинность встроена в модель резистора.Я отследил библиотеку modelica через Resistor - ConditionalHeatPort - HeatPort_a - HeatPort, но, насколько я понимаю, modelica есть только акаузальные уравнения.Кто-нибудь может пролить свет на это?

Спасибо!

Редактировать: ответ Рене Джаст Нильсен:

Я использовал код ниже.Идея состоит в том, что, учитывая тот факт, что тепловой поток из резистора зафиксирован на уровне 1 Вт, необходимо установить ток и напряжение на резисторе, чтобы решить все уравнения.Если я имитирую это, тепловой поток в компоненте fixedHeatFlow1 = 0 Вт, ток и напряжение также равны 0 В и 0 А. Конечно, это согласуется друг с другом, но не согласуется с фиксированным граничным условием -1 Вт.at fixedHeatFlow1.

model ElectricalPowerFromHeat
  Modelica.Electrical.Analog.Basic.Resistor resistor1(R = 1, alpha = 0, useHeatPort = true) annotation(
    Placement(visible = true, transformation(origin = {-28, -46}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Ground ground1 annotation(
    Placement(visible = true, transformation(origin = {12, -80}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Thermal.HeatTransfer.Sources.FixedHeatFlow fixedHeatFlow1(Q_flow = -1, alpha = 1)  annotation(
    Placement(visible = true, transformation(origin = {-68, 14}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
  connect(resistor1.n, ground1.p) annotation(
    Line(points = {{-18, -46}, {12, -46}, {12, -70}, {12, -70}}, color = {0, 0, 255}));
  connect(fixedHeatFlow1.port, resistor1.heatPort) annotation(
    Line(points = {{-58, 14}, {-28, 14}, {-28, -56}, {-28, -56}}, color = {191, 0, 0}));
  connect(resistor1.p, ground1.p) annotation(
    Line(points = {{-38, -46}, {-38, -60}, {12, -60}, {12, -70}}, color = {0, 0, 255}));
  annotation(
    uses(Modelica(version = "3.2.2")),
    experiment(StartTime = 0, StopTime = 1, Tolerance = 1e-06, Interval = 0.002));
end ElectricalPowerFromHeat;

Я ожидаю, что резистор может действовать как источник питания на основе уравнений внутри резистора:

  R_actual = R*(1 + alpha*(T_heatPort - T_ref));
  v = R_actual*i;
  LossPower = v*i;

1 Ответ

5 голосов
/ 07 мая 2019

Если вы хотите найти падение напряжения для резистора 1 Ом, учитывая, что тепловой поток составляет 1 Вт, это можно смоделировать следующим образом. Сначала вы берете модель, которая генерирует тепловой поток для простой цепи (в VoltageToHeatFlow), а затем инвертируете сигнал (в тестовой модели):

package ShowInvertPower
  model VoltageToHeatFlow
    Modelica.Electrical.Analog.Basic.Ground ground
      annotation (Placement(transformation(extent={{-22,-16},{-2,4}})));
    Modelica.Electrical.Analog.Basic.HeatingResistor resistor(R_ref=1)
      annotation (Placement(transformation(extent={{-8,48},{12,68}})));
    Modelica.Electrical.Analog.Sources.SignalVoltage signalVoltage
      annotation (Placement(transformation(extent={{-58,52},{-38,72}})));
    Modelica.Thermal.HeatTransfer.Sensors.HeatFlowSensor heatFlowSensor
      annotation (Placement(transformation(extent={{52,22},{72,42}})));
    Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heatCapacitor(C=1)
      annotation (Placement(transformation(extent={{84,36},{104,56}})));
    Modelica.Blocks.Interfaces.RealOutput Q_flow1
      "Heat flow from port_a to port_b as output signal"
      annotation (Placement(transformation(extent={{96,-18},{116,2}})));
    Modelica.Blocks.Interfaces.RealInput v1
      "Voltage between pin p and n (= p.v - n.v) as input signal"
      annotation (Placement(transformation(extent={{-126,-32},{-86,8}})));
  equation 
    connect(signalVoltage.n, resistor.p) annotation (Line(points={{-38,62},{-26,
            62},{-26,58},{-8,58}}, color={0,0,255}));
    connect(resistor.n, ground.p) annotation (Line(points={{12,58},{30,58},{30,4},
            {-12,4}}, color={0,0,255}));
    connect(signalVoltage.p, ground.p) annotation (Line(points={{-58,62},{-68,62},
            {-68,4},{-12,4}}, color={0,0,255}));
    connect(resistor.heatPort, heatFlowSensor.port_a) annotation (Line(points={{
            2,48},{28,48},{28,32},{52,32}}, color={191,0,0}));
    connect(heatFlowSensor.port_b, heatCapacitor.port) annotation (Line(points={
            {72,32},{84,32},{84,36},{94,36}}, color={191,0,0}));
    connect(heatFlowSensor.Q_flow, Q_flow1) annotation (Line(points={{62,22},{66,
            22},{66,-8},{106,-8}}, color={0,0,127}));
    connect(signalVoltage.v, v1) annotation (Line(points={{-48,74},{-106,74},{-106,
            -12}}, color={0,0,127}));
  end VoltageToHeatFlow;

  model Test
    ShowInvertPower.VoltageToHeatFlow voltageToHeatFlow annotation (Placement(
          transformation(
          extent={{-10,-10},{10,10}},
          rotation=180,
          origin={-2,58})));
    Modelica.Blocks.Math.InverseBlockConstraints inverseBlockConstraints
      annotation (Placement(transformation(extent={{-24,46},{16,70}})));
    Modelica.Blocks.Sources.Constant const(k=2)
      annotation (Placement(transformation(extent={{-86,46},{-66,66}})));
  equation 
    connect(voltageToHeatFlow.v1, inverseBlockConstraints.y2) annotation (Line(
          points={{8.6,59.2},{13.1,59.2},{13.1,58},{13,58}}, color={0,0,127}));
    connect(inverseBlockConstraints.u2, voltageToHeatFlow.Q_flow1) annotation (
        Line(points={{-20,58},{-12,58},{-12,58.8},{-12.6,58.8}}, color={0,0,127}));
    connect(const.y, inverseBlockConstraints.u1) annotation (Line(points={{-65,56},
            {-46,56},{-46,58},{-26,58}}, color={0,0,127}));
    annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
          coordinateSystem(preserveAspectRatio=false)));
  end Test;
  annotation (uses(Modelica(version="3.2.3")));
end ShowInvertPower;

В результате требуется 1 В (и 1 А). Очевидно, что его можно смоделировать более простыми способами, но использование обратных моделей таким способом является стандартным способом в Modelica.

...