1

主要目标

使用定义的 start_values 启动 FMU,并在“ModelExachange”的过程中对其进行更改。

方法

  1. 以已经从 FMI 标准网络创建的 FMU 为例。
  2. 使用 FMPY 启动它。
  3. 使用 my_callback 函数的模拟 fmu 中的 step_finished 参数更改每一步的值。

第一步

FMU 已完美加载,相同的代码在“CoSimulation”中完美运行,但目标是“ModelExchange”。

问题

我试图修改 my_callback 函数的值,但这给了我下一个错误:

[ERROR] Variable e can only be set after instantiation, in initialization mode, or in event mode.

我曾尝试在分配或初始化模式之前运行事件模式,但没有任何效果。

在这一行中,我们修改值,设置 XML 第一个参数的引用,以及第二个参数的值:

recorder.fmu.setReal([2], [count])

此时正是我得到暴露错误的地方。

蟒蛇代码:

import fmpy
from fmpy import *
from ctypes import *

fmpy.plot_library = 'plotly'  # experimental

global count

filename = 'BouncingBall.fmu'


start_values = {
    # variable    start   unit       description
    'g':         (-9.81, 'm/s2'),  # Gravity acting on the ball
    'e':            0.7,           # Coefficient of restitution
}

output = [
    'h',  # Position of the ball
    'v',  # Velocity of the ball
]

def my_callback(time, recorder):
    # use recorder.fmu to access the FMU instance
    count = 0

    if time < 1:
        count = 3
    else:
        count = 1

    recorder.fmu.setReal([2], [count])

    return True

result = simulate_fmu(filename, start_values=start_values, output=output, stop_time=3.0,fmi_type = 'ModelExchange',solver = 'Euler', step_size = 0.001, output_interval = 0.001, step_finished = my_callback)

plot_result(result)

我的问题:

知道我该如何解决这个问题吗?可以为 ModelExchange 做我尝试的事情吗?

谢谢。

4

1 回答 1

0

尝试使用 fmpy 的输入参数设置这些变量。使用输入参数,您可以定义输入的“时间序列”。如果在 t=0 处设置“g”,它将应用于初始化模式(您也可以消除对my_callback()函数的需要)。

你可以看看simulate_fmu 这里的代码。

于 2021-03-04T08:09:15.727 回答