调用Dymola的translateModel时,使用x_start=x0修饰符为何提示x0未声明?
Dymola translateModel调用报错原因及解决方案
报错原因
调用translateModel(problem="Sandbox.Test(x_start=x0)")时提示x0未声明,核心是作用域差异:
- 命令行参数里的
x0是在全局命令行作用域查找的,无法直接访问Test模型内部定义的x0参数 - 而
extends Test(x_start=x0)能成功,是因为extends的修饰符在Tester模型的作用域内解析,会自动查找父模型Test中的x0参数
修饰符是否必须使用字面量?
不是必须,但要遵循作用域规则:
- 在模型内部(extends或实例化语句):可以引用当前模型或父模型作用域内的变量
- 在命令行的
translateModel参数中:修饰符的值只能是字面量,或者全局命令行作用域已定义的变量
正确调用方式
方式1:直接使用字面量
把模型内部x0的实际值直接写入参数:
translateModel(problem="Sandbox.Test(x_start=1.234)");
方式2:先定义全局变量再引用
在命令行先声明全局的x0变量,再执行转换:
x0 = 1.234; translateModel(problem="Sandbox.Test(x_start=x0)");
方式3:通过子模型间接调用(已验证可行)
保持你定义的Tester模型,直接调用子模型的转换:
translateModel(problem="Sandbox.Tester");
内容的提问来源于stack exchange,提问作者Jesse Gohl
相关产品推荐
相关产品推荐

