系统模型

下一章将深入讨论子系统。现在,我们只讨论到目前为止看到的几个子系统主题。

连接

我们在本章见到,组件和子系统模型间的一个区别在于,子系统模型包括connect语句。为了探讨connect语句的原理,让我们重温在讨论热力控制时出现的MultiDomainControl例子。如果我们去掉所有标注(我们很快就会讨论这个内容),我们会得到一个如下所示的模型,:

within ModelicaByExample.Components.BlockDiagrams.Examples;
model MultiDomainControl
  "Mixing thermal components with blocks for sensing, actuation and control"

  import Modelica.SIunits.Conversions.from_degC;

  parameter Real h = 0.7 "Convection coefficient";
  parameter Real m = 0.1 "Thermal maass";
  parameter Real c_p = 1.2 "Specific heat";
  parameter Real T_inf = from_degC(25) "Ambient temperature";
  parameter Real T_bar = from_degC(30.0) "Desired temperature";
  parameter Real k = 2.0 "Controller gain";

  Components.Constant setpoint(k=T_bar);
  Components.Feedback feedback;
  Components.Gain controller_gain(k=k);
  HeatTransfer.ThermalCapacitance cap(C=m*c_p, T0 = from_degC(90));
  HeatTransfer.Convection convection2(h=h);
  HeatTransfer.AmbientCondition amb(T_amb(displayUnit="K") = T_inf);
  Components.IdealTemperatureSensor sensor;
  Components.HeatSource heatSource;
equation
  connect(setpoint.y, feedback.u1);
  connect(feedback.y, controller_gain.u);
  connect(convection2.port_a, cap.node);
  connect(amb.node, convection2.port_b);
  connect(sensor.y, feedback.u2);
  connect(heatSource.node, cap.node);
  connect(controller_gain.y, heatSource.u);
  connect(sensor.node, cap.node);
end MultiDomainControl;

在我们前面对非因果建模的讨论里,我们谈论了连接器内的非因果变量产生的方程式。但connect语句的作用取决于所连接变量的性质。MultiDomainControl模型对我们的讨论很有用,因为该模型不只有非因果连接。

在考虑MultiDomainControl模型的某条特定连接前,让我们先阐述一下connect语句的实际作用。这里可能有一些复杂的情况。但为了简单和教学需要,在这里我们只讨论基本情况。

connect语句连接了正正两个连接器。然后,语句按名字将每个连接器的每个相应变量“互相配对”。换句话说,语句将一个连接器的每个变量和另一连接器内的同名变量配对起来。

对每对变量,编译器首先确保这两个变量具有相同的类型(如RealInteger)。但是,产生的方程以及额外限制就取决于变量前的限定词了。下面列表涵盖了所有的基本情况:

  • 穿越变量- 这是带有flow限定词的变量。我们在此前对非因果建模讨论里就提到了,连接集的所有变量会生成一个守恒方程。

  • 参数- 包含parameter限定词的变量不会产生任何方程式。相反,它会生成一个assert调用,确保两个变量之间值相同。这在某些情况下很有用。例如,当connector包括指定连接器内数组大小的Integer参数时,断言语句会确保数组大小相同。

  • 输入- 带有input限定词的变量只能搭配带有inputoutput限定词的变量。假定这个要求得到满足,生成的等式会简单地为这两个变量建立相等关系。

  • 输出- 带有output限定词的变量只能与具有input限定词的变量配对(即两个输出不能连接)。与输入变量的情况一样,这样的连接会产生相等关系。

  • 横跨变量- 这些变量均没有任何限定词(和此前的情况不同)。正如我们对非因果建模所讨论的一样,连接集会产生一系列方程,令有横跨变量相等。

在对框图组件的讨论里,我们将inputoutput限定词表述为“因果性的”。事实上,inputoutput限定词实际上并不指定执行计算的顺序。正如以上所讨论,这些限定词只是限制变量可以如何连接。除了以上提到的限制,还有另一个限制:一个连接组内只能有一个output信号(原因很明显)。

我们可以看到,在MultiDomainControl模型里已经包括了几个这样的例子。例如,

connect(setpoint.y, feedback.u1);

在这里,output信号setpoint.yinput信号feedback.u1相连接。因此,此连接只涉及因果信号。但另一方面,我们有以下连接:

connect(heatSource.node, cap.node);

由此将得到此前讨论过的那类守恒方程。

总之,使用connect语句是一种管理复杂任务(如生成守恒以及连续性方程)并为此生成公式的方法。而同时,语句也会检查并确保该连接是有意义(例如变量须具有相同的类型)。

简图

本章中,我们展示了Modelica子系统模型可以如何用图形方式表示,如:

Cooling example schematic

产生这样图形所需的所有信息均包含在该Modelica模型里。虽然,这些信息已在本章中部分Modelica代码列举了出来。我们还没有真正讨论到底存储了什么信息、这些信息又是存储在了哪里。

渲染子系统简图需要三项信息:

  • 用来表示每个组件的图标。

  • 各组件的位置。

  • 每个连接的路径

组件图标

每个组件的图标就是包含在为该组件定义Icon标注内的任何绘图图元。Icon标注的细节在之前对图形标注的讨论里涵盖了。

组件位置

我们知道要组件要怎样呈现。现在,我们需要知道要在哪里对组件进行绘制。这就需要Placement标注了。这个标注出现在本章中许多例子里,如:

  Convection convection(h=0.7, A=1.0)
    annotation (Placement(transformation(extent={{10,-10},{30,10}})));

Placement标注不过建立了一个矩形区域,用以绘制组件的图标。与其他的图形标注相同,我们可以将Placement标注用record定义表示:

record Placement
  Boolean visible = true;
  Transformation transformation "Placement in the diagram layer";
  Transformation iconTransformation "Placement in the icon layer";
end Placement;

visible字段与在此前讨论GraphicItem标注时的作用一致。也就是说,此项用以控制组件是否被渲染。

transformation字段定义了如何在示意图中呈现图标。若标注被认为是子系统图标的一部分时,iconTransformation则定义了该标注此时的呈现方式。一般来说,iconTransformation仅用于连接器上。因为连接器通常是出现在图标表示里的唯一组件。

Transformation标注定义如下:

record Transformation
  Point origin = {0, 0};
  Extent extent;
  Real rotation(quantity="angle", unit="deg")=0;
end Transformation;

rotation字段表示组件图标应旋转多少度。而origin字段则表明上述旋转所应围绕的位置。最后,extent字段表示图标渲染区域的尺寸。

连接的显示

最后,我们讨论第三个话题,连接的显示。同样,决定如何渲染连接的标注已经出现在许多例子中。现在,我们终于会解释这些信息的意义了。考虑我们热力控制例子中的下列connect声明:

  connect(controller_gain.y, heatSource.u) annotation (Line(
      points={{41,40},{50,40},{50,60},{-70,60},{-70,-20},{-61,-20}},
      color={0,0,255},
      smooth=Smooth.None));

注意到connect语句后带有标注。尤其要注意,这是一个Line标注。我们此前已经讨论过Line。标注数据是在这里与当时的数据一致。