2014-12-04 28 views
3

我想從更邏輯(或基於行爲)的角度而不是低級(電子)角度對Modelica(OpenModelica)中的一個非常簡單的嵌入式系統進行建模。對我來說主要的問題是,我以前從來沒有和Modelica一起工作過,而且我真的有困難去理解如何看待這些想法,並認爲它們是正確的。在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」。

第一個我明白,但我現在已經完全明白如何解決它。第二個我根本聽不懂。

任何幫助,將不勝感激!如果有人能夠至少推薦我一些有用的文獻,我也會很感激。

回答

5

嗯,我建議你多讀一點Modelica。

可以讀取規格: https://modelica.org/documents

或讀免費書由邁克爾·T: http://book.xogeny.com/

或者由彼得·得到一些書: 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個變量。 您將需要更多方程來模擬某些變量的行爲。 請注意,當方程式僅在特定時間點 處於活動狀態時,它們不會被視爲方程式。這就是爲什麼你需要在模型中增加 更多的方程,這將告訴我們一個變量如何連續變化。

+0

這對我來說很困惑。你基本上說,我的模型需要更多的方程,但錯誤信息清楚地說明了相反的情況。此外,我無法確定尚未由方程式描述的那些變量。我發現變量「Controller.reg_a」和「Sensor.reg_temperature」在公式部分中缺失,但根據我的理解,這些變量是「離散的」,因爲它們是Integer類型的,所以它們的值在事件之間保持不變。你能否給我舉個例子說明我可以添加到模型中的方程式? – Tru3m4n 2014-12-09 09:54:19