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 или что здесь происходит?