Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Modelica 输入和输出连接器上的连接限制_Modelica - Fatal编程技术网

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的语义是这样的,两个输入的连接应该会触发错误(事实上,这是输入和输出连接器的基本限制)。

非常感谢,它解决了我的问题!至于混乱的连接,我得到了一个失败的断言,这就足够了。这些类还需要访问包global
C
,这些类没有连接器。因此,在连接器类中移动
C
会破坏一切。我可能会提出另一个问题。您仍然可以将包级别设置为常量,然后使用包级别常量初始化连接器中的参数。但是,为什么不能访问
x
阵列的组件需要知道其大小?我认为这里还有一个更基本的架构问题,很可能存在设计缺陷。很难详细说明。目前我能给你的最好解释是:。有一些等式,其中用户必须在1:C范围内迭代。这些等式由包的用户在任何连接器和块之外提供。类和连接器必须知道的唯一一件事是C。除此之外,包的类和连接器与用户定义的方程是解耦的。如果你有时间和耐心,你能帮助我吗?这是用户提供的非默认公式的一个示例,尽管
C
的这个问题不在其中。