FMU - 将新值重新分配给变量时出现问题

FMU - Problem reassigning a new value to a variable

主要目标

用定义的start_values启动FMU,并在“ModelExachange”的过程中更改它。

接近

  1. 获取已经从 FMI 标准 Web 创建的 FMU。
  2. 使用 FMPY 启动它。
  3. 使用 step_finished 参数从 simulate_fmu 使用 my_callback 函数每一步更改值。

第一步

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])

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

Python代码:

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 尝试的事情?

谢谢。

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

你可以看看simulate_fmuhere的代码。