Embedded 在Modelica中建模一个简单的嵌入式系统

Embedded 在Modelica中建模一个简单的嵌入式系统,embedded,system,modelica,Embedded,System,Modelica,我想用Modelica(OpenModelica)对一个非常简单的嵌入式系统进行建模,从更符合逻辑(或基于行为)的角度进行建模,而不是从低级(电气)角度进行建模。对我来说,主要的问题是,我以前从未与Modelica合作过,我真的很难理解如何看待思考以正确建模 该系统应非常简单,用于启动,并由一个传感器组成,该传感器通过总线与控制器相连。系统的预期行为应该是,传感器定期生成值,并通过中断通知控制器。作为回报,控制器应对该中断作出反应并获取值。对于我来说,这个例子的目的是,正如我已经提到的,首先掌握

我想用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;
如果我尝试模拟“简单的_系统”,我基本上会得到两个错误。其中一个告诉我系统被过度指定(35个方程vs.26个变量),另一个说:“找到了没有时间相关变量的方程:Controller.interface1.interrupt=0.0”

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


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

好吧,我建议你多读一些关于Modelica的书

您可以阅读规范:

或者阅读Michael T的免费书籍:

或者买一些彼得·F的书:

由于您有非物理连接器,您应该从连接器中删除流变量。 此外,在方程中使用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”,但据我了解,这些变量是“离散”的,因为它们是整数类型,因此它们在事件之间保持值不变。你能给我举个例子,说明我可以在模型中添加哪些方程式吗?