Modelica 输入和输出连接器上的连接限制
我想强制用户不能将输入连接到输入。我希望下面的代码会给出编译时错误,但它没有给出错误如何解决此问题?Modelica 输入和输出连接器上的连接限制,modelica,Modelica,我想强制用户不能将输入连接到输入。我希望下面的代码会给出编译时错误,但它没有给出错误如何解决此问题? package Pkg constant Integer C=3; connector Connector Real x[C]; end Connector; connector InConn = input Connector; connector OutConn = output Connector; class Base InConn[:
package Pkg
constant Integer C=3;
connector Connector
Real x[C];
end Connector;
connector InConn = input Connector;
connector OutConn = output Connector;
class Base
InConn[:] inlet;
OutConn[:] outlet;
end Base;
class A
extends Base;
redeclare InConn[1] inlet;
redeclare OutConn[1] outlet;
end A;
end Pkg;
model Test
import Pkg.*;
A p;
A q;
equation
connect(p.inlet[1], q.inlet[1]);
end Test;
另一个问题是包全局编译时常量C
。它是一种参数,应该由包的用户提供这应该如何在Modelica中实现?
package Pkg
constant Integer C=3;
connector Connector
Real x[C];
end Connector;
connector InConn = input Connector;
connector OutConn = output Connector;
class Base
InConn[:] inlet;
OutConn[:] outlet;
end Base;
class A
extends Base;
redeclare InConn[1] inlet;
redeclare OutConn[1] outlet;
end A;
end Pkg;
model Test
import Pkg.*;
A p;
A q;
equation
connect(p.inlet[1], q.inlet[1]);
end Test;
这里有几个问题。主要原因是您在
A
中的重新声明不正确。它们应该是对extends
子句的修改。但也要注意,它们甚至不是必需的,因为它们实际上不会改变任何东西。应通过参数指定尺寸
类似地,常数确实需要是连接器定义的参数。如果连接两个大小不同的连接器,Modelica编译器应该抛出一个错误(特别是,它应该对连接集中任何参数的值生成断言)
我没有在这台机器上安装Modelica编译器,但我建议您尝试一下,看看这是否更适合您:
package Pkg
connector Connector
parameter Integer C=3;
Real x[C];
end Connector;
connector InConn = input Connector;
connector OutConn = output Connector;
class Base
parameter Integer ni;
parameter Integer no;
InConn[ni] inlet;
OutConn[no] outlet;
end Base;
class A
extends Base(ni=1, no=1);
end A;
end Pkg;
model Test
import Pkg.*;
A p;
A q;
equation
connect(p.inlet[1], q.inlet[1]);
end Test;
希望这将使事情进入一种状态,编译器将生成正确的错误。Modelica的语义是这样的,两个输入的连接应该会触发错误(事实上,这是输入和输出连接器的基本限制)。非常感谢,它解决了我的问题!至于混乱的连接,我得到了一个失败的断言,这就足够了。这些类还需要访问包globalC
,这些类没有连接器。因此,在连接器类中移动C
会破坏一切。我可能会提出另一个问题。您仍然可以将包级别设置为常量,然后使用包级别常量初始化连接器中的参数。但是,为什么不能访问x
阵列的组件需要知道其大小?我认为这里还有一个更基本的架构问题,很可能存在设计缺陷。很难详细说明。目前我能给你的最好解释是:。有一些等式,其中用户必须在1:C范围内迭代。这些等式由包的用户在任何连接器和块之外提供。类和连接器必须知道的唯一一件事是C。除此之外,包的类和连接器与用户定义的方程是解耦的。如果你有时间和耐心,你能帮助我吗?这是用户提供的非默认公式的一个示例,尽管C
的这个问题不在其中。