我正在开发一个名为“ MyLib ”的Modelica库(在OpenModelica环境中)。
我编写了以下外部C模块(“ ExtTempDataLib.c ”):
#ifndef __EXT_LIB_C
#define __EXT_LIB_C
double temperatures [] = {25, 18, 30, 21, 16};
double GetTemperature(int index)
{
// Modelica indexes start from 1
return temperatures[index - 1];
}
void SetTemperature(int index, double newTempVal)
{
// Modelica indexes start from 1
temperatures[index - 1] = newTempVal;
}
#endif
它实现了一个表示温度的数值数组(“ temperature ”),可通过“ GetTemperature(...)”和“ GetTemperature(...)”来读取/覆盖 SetTemperature(...)“函数。
目标是向Modelica库提供一组全局数据(即所有型号均可访问)不恒定。
否则,我可以简单地将数组声明为我的“ MyData2 ”Modelica包中的常量:
constant Real temperatures [:] = {25, 18, 30, 21, 16};
然后只需输入以下内容即可从任何模型直接访问其任何元素(显然只读模式):
MyLib.MyData2.temperatures[index];
“ MyData ”Modelica包:
within MyLib;
package MyData
model SingleTemperatureOverwrite
parameter Integer index = 1 "Temperature data index";
parameter Real newVal = 50 "New temperature value";
algorithm
when initial() then
MyLib.MyData.SetTemperature(index, newVal);
end when;
end SingleTemperatureOverwrite;
function GetTemperature
input Integer index;
output Real temperature;
external "C" temperature = GetTemperature(index);
annotation(Include = "#include \"ExtTempDataLib.c\"");
end GetTemperature;
function SetTemperature
input Integer index;
input Real newTempVal;
external "C" SetTemperature(index, newTempVal);
annotation(Include = "#include \"ExtTempDataLib.c\"");
end SetTemperature;
end MyData;
定义:
“测试”Modelica包:
within MyLib;
package Test
model TemperatureTest
parameter Integer index = 1 "Temperature data index";
Real temperature (start = 0) "Temperature value";
equation
temperature = MyLib.MyData.GetTemperature(index);
end TemperatureTest;
end Test;
定义“ TemperatureTest ”模型,该模型读取指定索引处的数组值(“ index ”参数)并将其“复制”到“温度“变量。
我创建了一个Modelica测试模型,只包含一个“ SingleTemperatureOverwrite ”实例和一个“ TemperatureTest ”(“ singleTemperatureOverwrite1 ”)和分别为“ temperatureTest1 ”,将所有参数保留为默认值。
模型正确编译并执行但是,当我绘制“ temperatureTest1 ”的“ temperature ”变量时,而不是像我预期的那样得到“50”,我得到“25”(即外部C模块中定义的数组的第一个元素的起始值)。
有人可以解释一下我做错了吗?
答案 0 :(得分:2)
两个方程之间没有因果关系,因此它们可以以任意顺序执行。如果你想在Modelica中使用全局的,可变的变量,我建议使用内部/外部概念而不是外部C.(或者可能使用外部对象来强制执行命令)
答案 1 :(得分:0)
以下是否适合您?
package GlobalParameter
model ExampleComponent
outer parameter Real tValue[5];
end ExampleComponent;
model TestT
ExampleComponent component1;
ExampleComponent component2;
inner parameter Real tValue=1:5;
end TestT;
end GlobalParameter;
答案 2 :(得分:0)
好的,那么:
package GlobalParameter
model SetTValue
outer Real tValue[5];
parameter Integer index;
parameter Real value;
equation
tValue[index] = value;
end SetTValue;
model TestT
SetTValue set1(index=1, value=1);
SetTValue set2(index=2, value=2);
SetTValue set3(index=3, value=3);
SetTValue set4(index=4, value=4);
SetTValue set5(index=5, value=5);
inner Real tValue[5];
end TestT;
end GlobalParameter;
您不需要使用组件#(其中#是1-5),但可以使用它们作为设置tValue元素的方法。
此方法的缺点是SetTValue模型也不平衡,无法设置创建SetTValue实例所需的索引。但是,这种方法避免使用外部C代码。