从Modelica中的外部函数返回多个输出的最小工作示例

ndasle7k  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(92)

我的问题类似于Is it possible to return multiple values from an external file to Dymola?,所以它是这样的:
如何在不使用Record的情况下从外部函数返回多个输出(如果可能的话)?如果不使用记录是不可能的-你能解释一下如何使用记录吗?我对使用外部函数还比较陌生,所以这里可能缺少一些非常基本的东西。
我已经写了一个示例模型(如下),希望能更全面地给予我试图实现的目标。
提前感谢您的帮助!

model ExampleMultipleOutputs "Example model to output multiple values"

  parameter Real a = 1 "Example real parameter";
  parameter Integer b = 2 "Example integer parameter";

  Real y1 "Declare output y1";
  Real y2 "Declare output y2";
  Real y3 "Declare output y3";
protected 
  function threeOut "Output three Real values from external function"
    input Real a;
    input Integer b;

    output Real y1 "Output 1";
    output Real y2 "Output 2";
    output Real y3 "Output 3";

  external"C" three_Out(
        a,
        b);
    annotation (
      Include="
        
        void three_Out(double a, int b, double* y1, double* y2, double* y3){
               
            *y1 = a;
            *y2 = b;
            *y3 = a+a;  
        
        }
      ");
  end threeOut;

equation 
    (y1, y2, y3) = threeOut(a=a, b=b);

end ExampleMultipleOutputs;

来自这个示例模型的编译器消息声明“dsmodel。c(69):错误C2198:'three_Out':调用的参数太少”,这让我觉得我的C代码不正确,我设置函数的方式不正确,或者以上所有。很有可能,因为我不经常写C。

11dmarpk

11dmarpk1#

不知道为什么这不是点击几个小时前,但我发现了一个解决方案,工程。我只是不得不盯着this previous post看了一会儿。希望这个完整的例子对其他人有帮助。

model ExampleMultipleOutputs "Example model to output multiple values"

  parameter Real a = 1 "Example real parameter";
  parameter Integer b = 2 "Example integer parameter";

  record recDef
    Real y1 "Declare output y1";
    Real y2 "Declare output y2";
    Real y3 "Declare output y3";
  end recDef;

  recDef rec;
protected 
  function threeOut "Output three real values from external function"
    input Real a;
    input Integer b;

    output recDef r;
  external"C" three_Out(a,b,r);
    annotation (
      Include="
      
        struct point{
          double y1;
          double y2;
          double y3;
        };
      
        void three_Out(double a, int b, void* result){
            struct point *pt = result;     
            pt->y1 = a;
            pt->y2 = a+a;  
            pt->y3 = a+a+a; 
        
        };
      ");
  end threeOut;

equation 
    rec = threeOut(a=a, b=b);

end ExampleMultipleOutputs;

相关问题