以读取/覆盖模式

时间:2017-05-31 17:22:38

标签: c modelica openmodelica

我正在开发一个名为“ 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;

定义:

  • GetTemperature ”和“ SetTemperature ”函数,它们调用相应的外部C函数;
  • SingleTemperatureOverwrite ”模型,该模型在初始时用指定的新值覆盖指定索引处的数组值(参数“ index ”和“分别是 newVal “。

测试”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模块中定义的数组的第一个元素的起始值)。

有人可以解释一下我做错了吗?

3 个答案:

答案 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代码。