用Modelica建模一个简单的嵌入式系统

3
我希望能够从更逻辑(或基于行为)的角度而非低层次(电气)的角度,在Modelica(OpenModelica)中建模一个非常简单的嵌入式系统。对我来说,主要问题是我以前从未使用过Modelica,我真的很难理解如何正确地查看事物以进行建模。
该系统应该非常简单,起始时只包括一个通过总线连接到控制器的传感器。系统的期望行为是:传感器周期性地生成值,并通过中断通知控制器。控制器应该对该中断作出反应并提取该值。对我来说,这个例子的目的是首先理解如何在Modelica中查看事物的思路,并获得一个最初的(可能不是非常有用的)工作示例,我可以逐步将其扩展为更复杂的示例。
以下是我目前建模的系统:
传感器模型:
model ES_Sensor
    parameter Integer id = 1;
    parameter Real frequency = 1.0;
    Integer reg_temperature = 0;
    ES_Interface interface;
algorithm
    when sample(0, 1 / frequency) then
        reg_temperature := reg_temperature + 1;
        interface.interrupt := 1;
    end when;
    when interface.address == id then
        interface.data := reg_temperature;
    end when;
end ES_Sensor;

接口连接器:

connector ES_Interface
    flow Real dummy1;
    flow Real dummy2;
    flow Real dummy3;
    Integer address = 0;
    Integer data = 0;
    Integer interrupt = 0;
end ES_Interface;

总线模型:

model ES_Bus
    ES_Interface master;
    ES_Interface slave;
equation
    master.data = slave.data;
    master.address = slave.address;
    master.interrupt = slave.interrupt;
end ES_Bus;

控制器模型:

 model ES_Controller
     ES_Interface interface1;
     Integer reg_a = 0;
 algorithm
     when
          interface1.interrupt == 1 then
          interface1.interrupt := 0;
          interface1.address := 1;
          reg_a := interface1.data;
          interface1.address := 0;
     end when
 end ES_Controller;

系统模型:


 model Simple_System
     ES_Sensor Sensor;
     ES_Bus Bus;
 equation
     connect(Controller.interface1, Bus.master);
     connect(Bus.slave, Sensor.interface);
 end Simple_System;

如果我尝试模拟“Simple_System”,基本上会出现两个错误。其中一个告诉我系统超规格(35个方程式对26个变量),另一个说:“找到没有时间相关变量的方程式:Controller.interface1.interrupt = 0.0”。
第一个我理解,但我完全不知道如何解决它。第二个我根本不理解。
任何帮助都将不胜感激!如果有人能至少向我推荐一些有用的文献,我也将非常感谢。
1个回答

5

嗯,我建议您多阅读Modelica相关的内容。

您可以阅读规范: https://modelica.org/documents

或者阅读Michael T免费的书籍: http://book.xogeny.com/

或者获取Peter F的一些书籍: http://www.amazon.com/s?ie=UTF8&page=1&rh=n%3A283155%2Cp_27%3APeter%20Fritzson

由于您有非物理连接器,因此应从连接器中删除流变量。 此外,在方程式内使用reinit。

connector ES_Interface
    Integer address;
    Integer data;
    Integer interrupt;
end ES_Interface;

model ES_Sensor
    parameter Integer id = 1;
    parameter Real frequency = 1.0;
    Integer reg_temperature = 0;
    ES_Interface interface;
algorithm
    when sample(0, 1 / frequency) then
        reinit(reg_temperature, reg_temperature + 1);
        reinit(interface.interrupt, 1);
    end when;
    when interface.address == id then
        reinit(interface.data, reg_temperature);
    end when;
end ES_Sensor;

model ES_Bus
    ES_Interface master;
    ES_Interface slave;
equation
    master.data = slave.data;
    master.address = slave.address;
    master.interrupt = slave.interrupt;
end ES_Bus;

model ES_Controller
     ES_Interface interface1;
     Integer reg_a = 0;
 algorithm
     when interface1.interrupt == 1 then
          reinit(interface1.interrupt, 0);
          reinit(interface1.address, 1);
          reinit(reg_a, interface1.data);
     end when;
end ES_Controller;

model Simple_System
     ES_Sensor Sensor;
     ES_Bus Bus;
     ES_Controller Controller;
equation
     connect(Controller.interface1, Bus.master);
     connect(Bus.slave, Sensor.interface);
end Simple_System;

现在,如果您实例化该模型,则会得到以下结果:
class Simple_System
  parameter Integer Sensor.id = 1;
  parameter Real Sensor.frequency = 1.0;
  Integer Sensor.reg_temperature = 0;
  Integer Sensor.interface.address;
  Integer Sensor.interface.data;
  Integer Sensor.interface.interrupt;
  Integer Bus.master.address;
  Integer Bus.master.data;
  Integer Bus.master.interrupt;
  Integer Bus.slave.address;
  Integer Bus.slave.data;
  Integer Bus.slave.interrupt;
  Integer Controller.interface1.address;
  Integer Controller.interface1.data;
  Integer Controller.interface1.interrupt;
  Integer Controller.reg_a = 0;
equation
  Bus.master.data = Bus.slave.data;
  Bus.master.address = Bus.slave.address;
  Bus.master.interrupt = Bus.slave.interrupt;
  Bus.master.address = Controller.interface1.address;
  Bus.master.data = Controller.interface1.data;
  Bus.master.interrupt = Controller.interface1.interrupt;
  Bus.slave.address = Sensor.interface.address;
  Bus.slave.data = Sensor.interface.data;
  Bus.slave.interrupt = Sensor.interface.interrupt;
algorithm
  when sample(0.0, 1.0 / Sensor.frequency) then
    reinit(/*Real*/(Sensor.reg_temperature), /*Real*/(1 + Sensor.reg_temperature));
    reinit(/*Real*/(Sensor.interface.interrupt), 1.0);
  end when;
  when Sensor.interface.address == Sensor.id then
    reinit(/*Real*/(Sensor.interface.data), /*Real*/(Sensor.reg_temperature));
  end when;
algorithm
  when Controller.interface1.interrupt == 1 then
    reinit(/*Real*/(Controller.interface1.interrupt), 0.0);
    reinit(/*Real*/(Controller.interface1.address), 1.0);
    reinit(/*Real*/(Controller.reg_a), /*Real*/(Controller.interface1.data));
  end when;
end Simple_System;

这个模型有11个方程和14个变量。 为了模拟某些变量的行为,您需要更多的方程。 请注意,当方程只在某个时间点上激活时, 它们不算作方程。这就是为什么您需要向模型中添加 更多的方程来说明变量如何在时间上连续变化。


这对我而言相当令人困惑。您基本上说我的模型需要更多方程,但错误信息明显表示相反的情况。此外,我无法确定哪些变量尚未由方程式描述。我看到变量“Controller.reg_a”和“Sensor.reg_temperature”在方程式部分中缺失,但据我了解,这些变量是“离散”的,因为它们是整数类型,因此在事件之间保持其值恒定。您能否举个例子告诉我可以添加哪些方程式? - Tru3m4n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接