【问题标题】:Modeling a simple Embedded System in Modelica在 Modelica 中为简单的嵌入式系统建模
【发布时间】:2014-12-04 08:45:43
【问题描述】:

我想在 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”。

我确实了解第一个问题,但我现在完全知道如何解决它。第二个我完全不明白。

任何帮助将不胜感激!如果有人至少可以向我推荐一些有用的文献,我也将不胜感激。

【问题讨论】:

    标签: embedded system modelica


    【解决方案1】:

    好吧,我建议您多阅读一些有关 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

    由于您有非物理连接器,您应该从连接器中删除流变量。 另外,在 when 方程中使用 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”,但根据我的理解,这些变量是“离散的”,因为它们是整数类型,所以它们在事件之间保持它们的值不变.您能否举例说明我可以在模型中添加哪些方程?
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多