Embedded 在Modelica中建模一个简单的嵌入式系统
我想用Modelica(OpenModelica)对一个非常简单的嵌入式系统进行建模,从更符合逻辑(或基于行为)的角度进行建模,而不是从低级(电气)角度进行建模。对我来说,主要的问题是,我以前从未与Modelica合作过,我真的很难理解如何看待思考以正确建模 该系统应非常简单,用于启动,并由一个传感器组成,该传感器通过总线与控制器相连。系统的预期行为应该是,传感器定期生成值,并通过中断通知控制器。作为回报,控制器应对该中断作出反应并获取值。对于我来说,这个例子的目的是,正如我已经提到的,首先掌握如何在Modelica中看待思考的概念,并获得一个初始的(可能不是非常有用的)工作示例,我可以迭代地扩展到一个更复杂的示例 以下是我迄今为止建模的系统: 传感器型号:Embedded 在Modelica中建模一个简单的嵌入式系统,embedded,system,modelica,Embedded,System,Modelica,我想用Modelica(OpenModelica)对一个非常简单的嵌入式系统进行建模,从更符合逻辑(或基于行为)的角度进行建模,而不是从低级(电气)角度进行建模。对我来说,主要的问题是,我以前从未与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”,但据我了解,这些变量是“离散”的,因为它们是整数类型,因此它们在事件之间保持值不变。你能给我举个例子,说明我可以在模型中添加哪些方程式吗?