FMU - 将新值重新分配给变量时出现问题
FMU - Problem reassigning a new value to a variable
主要目标
用定义的start_values启动FMU,并在“ModelExachange”的过程中更改它。
接近
- 获取已经从 FMI 标准 Web 创建的 FMU。
- 使用 FMPY 启动它。
- 使用 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_fmu
here的代码。
主要目标
用定义的start_values启动FMU,并在“ModelExachange”的过程中更改它。
接近
- 获取已经从 FMI 标准 Web 创建的 FMU。
- 使用 FMPY 启动它。
- 使用 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_fmu
here的代码。