主要目标
使用定义的 start_values 启动 FMU,并在“ModelExachange”的过程中对其进行更改。
方法
- 以已经从 FMI 标准网络创建的 FMU 为例。
- 使用 FMPY 启动它。
- 使用 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 做我尝试的事情吗?
谢谢。