示例#1
0
    def test_basic_algebraic_loop(self):
        model_sub1 = FMUModelCS2("LinearStability.SubSystem1.fmu",
                                 cs2_xml_path,
                                 _connect_dll=False)
        model_sub2 = FMUModelCS2("LinearStability.SubSystem2.fmu",
                                 cs2_xml_path,
                                 _connect_dll=False)

        models = [model_sub1, model_sub2]
        connections = [(model_sub1, "y1", model_sub2, "u2"),
                       (model_sub2, "y2", model_sub1, "u1")]

        sim = Master(models, connections)
        assert sim.algebraic_loops

        model_sub1 = FMUModelCS2("LinearStability_LinearSubSystemNoFeed1.fmu",
                                 cs2_xml_path,
                                 _connect_dll=False)
        model_sub2 = FMUModelCS2("LinearStability_LinearSubSystemNoFeed2.fmu",
                                 cs2_xml_path,
                                 _connect_dll=False)

        models = [model_sub1, model_sub2]
        connections = [(model_sub1, "y1", model_sub2, "u2"),
                       (model_sub2, "y2", model_sub1, "u1")]

        sim = Master(models, connections)
        assert not sim.algebraic_loops
示例#2
0
    def test_integer_to_real_connections(self):
        model_sub1 = Dummy_FMUModelCS2([],
                                       "IntegerStep.fmu",
                                       cs2_xml_path,
                                       _connect_dll=False)
        model_sub2 = Dummy_FMUModelCS2([],
                                       "GainTestReal.fmu",
                                       cs2_xml_path,
                                       _connect_dll=False)

        model_sub1.set("y", 1)

        def do_step1(current_t, step_size, new_step=True):
            model_sub1.values[model_sub1.get_variable_valueref(
                "y")] = 1 if current_t + step_size < 0.5 else 3
            model_sub1.completed_integrator_step()
            return 0

        def do_step2(current_t, step_size, new_step=True):
            u = model_sub2.values[model_sub2.get_variable_valueref("u")]
            model_sub2.values[model_sub2.get_variable_valueref("y")] = 10 * u
            model_sub2.completed_integrator_step()
            return 0

        model_sub1.do_step = do_step1
        model_sub2.do_step = do_step2

        models = [model_sub1, model_sub2]
        connections = [(model_sub1, 'y', model_sub2, 'u')]

        master = Master(models, connections)

        opts = master.simulate_options()
        opts["block_initialization"] = True

        res = master.simulate(start_time=0.0, final_time=2.0, options=opts)

        assert res[model_sub2]["u"][0] == 1.0
        assert res[model_sub2]["u"][-1] == 3.0
示例#3
0
    def test_loading_models(self):
        model_sub1 = FMUModelCS2("LinearStability.SubSystem1.fmu",
                                 cs2_xml_path,
                                 _connect_dll=False)
        model_sub2 = FMUModelCS2("LinearStability.SubSystem2.fmu",
                                 cs2_xml_path,
                                 _connect_dll=False)

        models = [model_sub1, model_sub2]
        connections = [(model_sub1, "y1", model_sub2, "u2"),
                       (model_sub2, "y2", model_sub1, "u1")]

        #Assert that loading is successful
        sim = Master(models, connections)
示例#4
0
#!/usr/bin/env python
import matplotlib.pyplot as plt
from scipy import signal
from pyfmi import load_fmu, Master

# Load the model FMUs
ctrl = load_fmu('FMU/Ctrl.fmu')
plant = load_fmu('FMU/Plant.fmu')

# Connect the controller and plant
components = [ctrl, plant]
conns = [(ctrl, 'y', plant, 'u'), (plant, 'y', ctrl, 'u_m')]

# Create the FMU Master
model = Master(components, conns)

# Connect a reference signal
ref = signal.square
input_obj = ((ctrl, 'u_s'), ref)

# Run the simulation
res = model.simulate(input=input_obj)

# Get simulation results
output = res[plant]['y']
reference = res[ctrl]['u_s']
t = res[plant]['time']

# Plot results
fig, ax = plt.subplots()
ax.plot(t, reference, 'b')
示例#5
0
    def test_unstable_simulation(self):
        model_sub1 = Dummy_FMUModelCS2(
            [],
            "LinearCoSimulation_LinearSubSystem1.fmu",
            cs2_xml_path,
            _connect_dll=False)
        model_sub2 = Dummy_FMUModelCS2(
            [],
            "LinearCoSimulation_LinearSubSystem2.fmu",
            cs2_xml_path,
            _connect_dll=False)

        model_sub2.set("d2", 1.1)  #Coupled system becomes unstable

        a1 = model_sub1.values[model_sub1.get_variable_valueref("a1")]
        b1 = model_sub1.values[model_sub1.get_variable_valueref("b1")]
        c1 = model_sub1.values[model_sub1.get_variable_valueref("c1")]
        d1 = model_sub1.values[model_sub1.get_variable_valueref("d1")]

        a2 = model_sub2.values[model_sub2.get_variable_valueref("a2")]
        b2 = model_sub2.values[model_sub2.get_variable_valueref("b2")]
        c2 = model_sub2.values[model_sub2.get_variable_valueref("c2")]
        d2 = model_sub2.values[model_sub2.get_variable_valueref("d2")]

        def do_step1(current_t, step_size, new_step=True):
            u1 = model_sub1.values[model_sub1.get_variable_valueref("u1")]

            model_sub1.continuous_states = 1.0 / a1 * (
                np.exp(a1 * step_size) - 1.0) * b1 * u1 + np.exp(
                    a1 * step_size) * model_sub1.continuous_states
            model_sub1.values[model_sub1.get_variable_valueref(
                "y1")] = c1 * model_sub1.continuous_states + d1 * u1
            model_sub1.completed_integrator_step()
            return 0

        def do_step2(current_t, step_size, new_step=True):
            u2 = model_sub2.values[model_sub2.get_variable_valueref("u2")]

            model_sub2.continuous_states = 1.0 / a2 * (
                np.exp(a2 * step_size) - 1.0) * b2 * u2 + np.exp(
                    a2 * step_size) * model_sub2.continuous_states
            model_sub2.values[model_sub2.get_variable_valueref(
                "y2")] = c2 * model_sub2.continuous_states + d2 * u2
            model_sub2.completed_integrator_step()
            return 0

        model_sub1.do_step = do_step1
        model_sub2.do_step = do_step2

        models = [model_sub1, model_sub2]
        connections = [(model_sub1, "y1", model_sub2, "u2"),
                       (model_sub2, "y2", model_sub1, "u1")]

        master = Master(models, connections)

        opts = master.simulate_options()
        opts["step_size"] = 0.0005

        res = master.simulate(final_time=0.3, options=opts)

        assert abs(res[model_sub1].final("x1")) > 100
        assert abs(res[model_sub2].final("x2")) > 100
示例#6
0
    def _basic_simulation(self, result_handling):
        model_sub1 = Dummy_FMUModelCS2(
            [],
            "LinearCoSimulation_LinearSubSystem1.fmu",
            cs2_xml_path,
            _connect_dll=False)
        model_sub2 = Dummy_FMUModelCS2(
            [],
            "LinearCoSimulation_LinearSubSystem2.fmu",
            cs2_xml_path,
            _connect_dll=False)

        a1 = model_sub1.values[model_sub1.get_variable_valueref("a1")]
        b1 = model_sub1.values[model_sub1.get_variable_valueref("b1")]
        c1 = model_sub1.values[model_sub1.get_variable_valueref("c1")]
        d1 = model_sub1.values[model_sub1.get_variable_valueref("d1")]

        a2 = model_sub2.values[model_sub2.get_variable_valueref("a2")]
        b2 = model_sub2.values[model_sub2.get_variable_valueref("b2")]
        c2 = model_sub2.values[model_sub2.get_variable_valueref("c2")]
        d2 = model_sub2.values[model_sub2.get_variable_valueref("d2")]

        def do_step1(current_t, step_size, new_step=True):
            u1 = model_sub1.values[model_sub1.get_variable_valueref("u1")]

            model_sub1.continuous_states = 1.0 / a1 * (
                np.exp(a1 * step_size) - 1.0) * b1 * u1 + np.exp(
                    a1 * step_size) * model_sub1.continuous_states
            model_sub1.values[model_sub1.get_variable_valueref(
                "y1")] = c1 * model_sub1.continuous_states + d1 * u1
            model_sub1.completed_integrator_step()
            return 0

        def do_step2(current_t, step_size, new_step=True):
            u2 = model_sub2.values[model_sub2.get_variable_valueref("u2")]

            model_sub2.continuous_states = 1.0 / a2 * (
                np.exp(a2 * step_size) - 1.0) * b2 * u2 + np.exp(
                    a2 * step_size) * model_sub2.continuous_states
            model_sub2.values[model_sub2.get_variable_valueref(
                "y2")] = c2 * model_sub2.continuous_states + d2 * u2
            model_sub2.completed_integrator_step()
            return 0

        model_sub1.do_step = do_step1
        model_sub2.do_step = do_step2

        models = [model_sub1, model_sub2]
        connections = [(model_sub1, "y1", model_sub2, "u2"),
                       (model_sub2, "y2", model_sub1, "u1")]

        master = Master(models, connections)

        opts = master.simulate_options()
        opts["step_size"] = 0.0005
        opts["result_handling"] = result_handling

        res = master.simulate(options=opts)

        nose.tools.assert_almost_equal(res[model_sub1].final("x1"),
                                       0.0859764038708439, 3)
        nose.tools.assert_almost_equal(res[model_sub2].final("x2"),
                                       0.008392664839635064, 4)