PyFMI: установка параметров иногда невозможна (зависит от модели)

Я создал минимальный пример (напряжение постоянного тока, нагрузка) в OpenModelica. Впоследствии я создал FMU и использовал его через Python.

Краткое описание проблемы: используя только резистор в качестве нагрузки, я не могу изменить параметры через python. После добавления индуктора в модель я могу изменить некоторые параметры, и симуляция реагирует на эти изменения.

В этой простой модели нет ничего, что могло бы вызвать проблемы со стороны электротехники, проблема должна быть где-то еще.

Настройка модели

Проблемная модель:

 model testbench
  parameter Real v_DC (start = 100);
  Modelica.Blocks.Sources.RealExpression realExpression(y = v_DC)  annotation(
    Placement(visible = true, transformation(origin = {-70, 70}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Sources.SignalVoltage signalVoltage annotation(
    Placement(visible = true, transformation(origin = {-30, 46}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Resistor resistor(R = 10)  annotation(
    Placement(visible = true, transformation(origin = {-30, 14}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Ground ground annotation(
    Placement(visible = true, transformation(origin = {28, 28}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
  connect(realExpression.y, signalVoltage.v) annotation(
    Line(points = {{-58, 70}, {-30, 70}, {-30, 58}, {-30, 58}}, color = {0, 0, 127}));
  connect(signalVoltage.n, resistor.n) annotation(
    Line(points = {{-20, 46}, {-6, 46}, {-6, 14}, {-20, 14}, {-20, 14}}, color = {0, 0, 255}));
  connect(signalVoltage.n, ground.p) annotation(
    Line(points = {{-20, 46}, {28, 46}, {28, 38}, {28, 38}}, color = {0, 0, 255}));
  connect(resistor.p, signalVoltage.p) annotation(
    Line(points = {{-40, 14}, {-40, 14}, {-40, 46}, {-40, 46}}, color = {0, 0, 255}));
  annotation(
    uses(Modelica(version = "3.2.3")));
end testbench;

Частично рабочая модель:

model testbench
  parameter Real v_DC (start = 100);
  Modelica.Blocks.Sources.RealExpression realExpression(y = v_DC)  annotation(
    Placement(visible = true, transformation(origin = {-70, 70}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Sources.SignalVoltage signalVoltage annotation(
    Placement(visible = true, transformation(origin = {-30, 46}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Resistor resistor(R = 10)  annotation(
    Placement(visible = true, transformation(origin = {-30, 14}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Ground ground annotation(
    Placement(visible = true, transformation(origin = {28, 28}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Inductor inductor annotation(
    Placement(visible = true, transformation(origin = {-60, 14}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
  connect(realExpression.y, signalVoltage.v) annotation(
    Line(points = {{-58, 70}, {-30, 70}, {-30, 58}, {-30, 58}}, color = {0, 0, 127}));
  connect(signalVoltage.n, resistor.n) annotation(
    Line(points = {{-20, 46}, {-6, 46}, {-6, 14}, {-20, 14}, {-20, 14}}, color = {0, 0, 255}));
  connect(signalVoltage.n, ground.p) annotation(
    Line(points = {{-20, 46}, {28, 46}, {28, 38}, {28, 38}}, color = {0, 0, 255}));
  connect(inductor.n, resistor.p) annotation(
    Line(points = {{-50, 14}, {-40, 14}, {-40, 14}, {-40, 14}}, color = {0, 0, 255}));
  connect(signalVoltage.p, inductor.p) annotation(
    Line(points = {{-40, 46}, {-74, 46}, {-74, 14}, {-70, 14}, {-70, 14}}, color = {0, 0, 255}));
  annotation(
    uses(Modelica(version = "3.2.3")));
end testbench;

Используемое программное обеспечение

  • Windows 10
  • OpenModelica 1.16.0
  • PyFMI 2.5
  • Spyder 3.3.6

Создание FMU

Создал FMU с файлом.mos со следующими настройками:

OpenModelica.Scripting.loadFile("testbench.mo"); getErrorString();
setCommandLineOptions("-d=newInst"); getErrorString();
setCommandLineOptions("-d=initialization"); getErrorString();
setCommandLineOptions("--simCodeTarget=Cpp"); getErrorString();
setCommandLineOptions("-d=-disableDirectionalDerivatives"); getErrorString();
OpenModelica.Scripting.translateModelFMU(testbench, version="2.0", fmuType = "me"); getErrorString();

Код Python для тестирования

import pylab as P
import numpy as N

from pyfmi import load_fmu

def run_demo(with_plots=True):

    model = load_fmu('testbench.fmu') 
    Tstart = 0.0 #
    Tend   = 0.1     
    dt = 0.0001 
  
    model.setup_experiment(start_time = Tstart) 
    model.enter_initialization_mode()
    model.exit_initialization_mode()
    time = Tstart
    
    model.enter_continuous_time_mode()
    x = model.continuous_states
    model.set('resistor.R', 1000)
    model.set('v_DC', 5700)

    vref  = [model.get_variable_valueref('resistor.i')]    
    vref2  = [model.get_variable_valueref('resistor.R')]  
    t_sol = [Tstart]
    sol = [model.get_real(vref)]  
    sol2 = [model.get_real(vref2)]     
    
    while time < Tend:

        dx = model.get_derivatives()
             
        time = time + dt
        model.time = time
        x = x + dt*dx
        model.continuous_states = x
        t_sol += [time]
        sol += [model.get_real(vref)]
        sol2 += [model.get_real(vref2)]
        
    if with_plots:
        P.figure(1)
        P.plot(t_sol,N.array(sol)[:,0])
        P.title(model.get_name())
        P.ylabel('Current at Resistor1 (A)')
        P.xlabel('Time (s)')
        P.figure(2)
        P.plot(t_sol,N.array(sol2)[:,0])
        P.title(model.get_name())
        P.ylabel('Resistor1 (Ohm)')
        P.xlabel('Time (s)')


if __name__ == "__main__":
    run_demo()

Ошибки

Во второй модели (с катушкой индуктивности) изменение напряжения постоянного тока (model.set('v_DC', 5700)) приводит к пропорциональному изменению тока на резисторе1. Это работает как надо.

Изменение номинала резистора (model.set('resistor.R', 10000)) никак не влияет на ток в резисторе. При печати значения отображается значение, которое было фактически установлено (см. Второй график), но для расчета тока используется значение по умолчанию, которое было выбрано в OpenModelica.

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

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

Есть ли ошибка в настройке параметров, ошибка в OpenModelica, в PyFMI или что здесь происходит?

0 ответов

Другие вопросы по тегам