gpt4 book ai didi

c - 在读取/覆盖模式下从 Modelica 访问外部 C 模块中的数据

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:36 24 4
gpt4 key购买 nike

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

它实现了一组表示温度的数值(“温度”),可以通过“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 模块中定义的数组的第一个元素的起始值)。

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

最佳答案

两个等式之间没有因果关系,因此它们可以按任意顺序执行。如果你想在 Modelica 中使用全局可变变量,我建议使用内部/外部概念而不是外部 C。(或者可能使用外部对象来强制执行顺序)

关于c - 在读取/覆盖模式下从 Modelica 访问外部 C 模块中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44291114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com