Dymola仿真后访问模型变量报错:未声明变量或命令
问题描述
我给某个组件模型编写了测试器,需要用大量边界条件对其进行测试。由于手动修改边界值并记录最终结果耗时极长,我尝试通过读取包含边界条件的BC.mat文件来自动化该流程,将感兴趣变量的时间序列最终值存入另一个.mat文件用于后续后处理——该.mat文件中每行代表一次模型运行,每列对应目标变量的最终时间值。但运行Dymola脚本时始终无法解决以下错误:Warning: Undeclared variable or command: Model.Variable。
我的脚本代码如下:
openModel("pathToModel"); startTime :=0; stopTime :=30; data := readMatrix("BC.mat", "BC_MatrixName", nrows, ncols); resultsMatrix := zeros(size(data, 1), 2); for i in 1:size(data, 1) loop SubmodelBoundary1.value1 := data[i, 1]; ... More Bc's simulateModel("ModelName", start=startTime, stop=stopTime, method="dassl", tolerance=1e-4); resultsMatrix[i, 1] := ModelName.VarName[end]; end for;
我尝试了多种访问变量的方式,且已确保目标变量在模型中设为public,仿真前也能正常访问该变量。求问如何在仿真后正确访问模型变量?
解决方法
Dymola仿真结束后,模型实例的变量不会自动保留在脚本环境中,直接用ModelName.VarName[end]访问会触发错误,可通过以下方式解决:
1. 从仿真结果文件读取变量值
仿真完成后,结果默认存储在ModelName_res.mat文件中,使用readTrajectory函数读取目标变量的最后一个值:
// 仿真完成后添加以下代码 res := readTrajectory("ModelName_res.mat", "ModelName.VarName"); resultsMatrix[i, 1] := res[end];
注意变量路径需与仿真结果中的完全一致,若变量位于子模型内,路径应为ModelName.Submodel.VarName。
2. 启用仿真后保留模型实例
调用simulateModel时添加finalNames参数,指定需要保留的变量,仿真后即可直接访问变量的最终值:
simulateModel("ModelName", start=startTime, stop=stopTime, method="dassl", tolerance=1e-4, finalNames={"VarName"}); // 直接访问变量最终值 resultsMatrix[i, 1] := ModelName.VarName;
此方式无需读取结果文件,直接在脚本中获取值,但需确保finalNames中的变量为public属性,且变量名准确无误。
3. 校验仿真执行状态
仿真失败会导致后续变量访问出错,建议在仿真后添加状态判断:
simResult := simulateModel("ModelName", start=startTime, stop=stopTime, method="dassl", tolerance=1e-4); if simResult then // 读取变量值的逻辑 else // 处理仿真失败的情况,例如记录错误信息 end if;
内容的提问来源于stack exchange,提问作者trecpy
相关产品推荐
相关产品推荐

