在模拟期间更改 FMI variable/function

change FMI variable/function during simulation

我有一个简单的 FMU 文件,其中包含一个将 u 作为输入并输出 y 的正弦块。在这种情况下,u 设置为等于时间。在我的 C++ 代码中,我从 FMILibrary 加载了 FMI 库,并完成了所有必要的步骤,直到我想为我的输入 u 提供一个新的 pi 值(如 3.14)。所以我去了:

fmistatus = fmi2_import_set_real(fmu, &uRef, 1, &pi);
while (timeCurrent < timeEnd){
    fmistatus = fmi2_import_do_step(fmu, timeCurrent , stepSize, fmi2_true);
    timeCurrent += stepSize;
}

即使我试图给它一个新值,你仍然设置为时间。我错过了什么吗?

PS。有什么地方可以找到有关 FMI 库函数的更详细说明?目前只能找到输入输出描述还是我又漏掉了什么

更新:经过几次试验,我认为这个问题可能是因为我试图重新定义我的等式 u = time。换句话说,当我将 u 变量更改为 openmodelica 中的 RealInput 块时,一切正常。那么,如果我真的想重新定义某个方程怎么办?我必须做什么?

您不能在 FMI 中设置任何变量——尤其是不能设置带有绑定方程的变量——我假设您的 Modelica 模型有 "u=time;"。而不是 "u=time" 您需要添加一个没有任何方程式的顶级输入(以便导出的 FMI 将其作为输入)- 然后将其连接到正弦块。

详情: 对于协同仿真 FMI,您可以设置的限制在 FMI2 规范第 4.2.4 节的状态图中。

在 fmi2DoStep 之间,您只能设置具有 causality="input" 或 causality="parameter" 和 variability="tunable" 的 Real 变量 - 带有方程式的输入不合格。

在开始积分之前,您也可以为其他变量设置它,但这只是初始化的猜测值 - 不应覆盖 "u=time" 等式。