如何在S函数构建器中构建临时结构变量?

时间:2019-06-18 04:22:00

标签: matlab function simulink

我在s函数生成器中遇到问题,我必须使用temp结构变量将输入传输到扩展的C函数。

背景:csolve函数是CVXGEN针对我的QP问题生成的二次编程求解器,我已经在2级matlab s-fun中测试了该函数。现在,我想使用s函数生成器来生成支持嵌入式代码生成的TLC文件。

我的问题: 1)我必须在输入中使用临时结构变量'params'才能在输出面板中解决功能,请您能帮我解决这个问题吗? 2)我发现在cvxgen文件夹中包含一个包含“ tic”和“ toc”函数的头文件,如何在s函数生成器中使用这些函数?

params.Aeq=Aeq;
params.beq=beq;
params.Aineq=Aineq;
params.bineq=bineq;
params.Smat=Smat;
params.Wmat=Wmat;
params.alpha=alpha;

[vars, status] = csolve(params)

y0=vars.x;
converge=status.converge;

enter image description here

enter image description here

enter image description here

有关附件,请参见here

1 个答案:

答案 0 :(得分:0)

首先,您应该了解一些背景信息:

Matlab和C的工作原理完全不同,并且使用不同类型的数据类型。为了从Matlab调用C代码,会生成所谓的“ mex函数”。 Matlab使用名为mxArray的特殊数据类型在Matlab与这些用C编写的“ mex函数”之间交换数据。

在C程序中,类型mxArray的元素(例如变量)表示任何数据类型的Matlab值。 Matlab提供了一些函数(如mxGetData())来从C函数访问Matlab数据元素的实际数据:有一些函数可以检查mxArray是表示浮点值还是字符串。如果元素具有浮点值,则可以使用另一个函数将值从mxArray转换为double

[vars, status] = csolve(params)

这意味着您要从“ S函数”调用“ mex函数”。

从理论上讲,这是可能的,但这并不像您想的那么简单:

首先,两种类型的函数的入口点在C代码中被命名为mexFunction()。这意味着您不能简单地组合两个函数的C代码,因为在这种情况下,您的S函数中将有两个具有相同名称(mexFunction)的函数。

您可以调用函数mexCallMATLAB;但是Mathworks写道,不应从S函数调用此函数。

另一种可能性是使用DLL函数(在Windows中为LoadLibraryGetProcAddressFreeLibrary)加载DLL函数,然后调用mex的函数mexFunction()功能指针使用功能。

但是,在这种情况下,您必须将所有C数据类型转换为mxArray数据,并且必须将从mex函数返回的数据转换回...

  

...嵌入式编码器中所需的TLC文件

访问mxArray类型的数据的功能仅在Matlab运行时可用。

如果生成的代码可以在Matlab外部执行,则不能使用mxArray,因此不能调用mex函数。

文件csolve.c定义了四个结构变量:

Vars vars;
Params params;
Workspace work;
Settings settings;

文件实际执行的操作如下:

  • 读取结构paramsmxArray数据类型),将这些内容转换为C数据类型,并将数据写入上面的四个结构变量中
  • 调用以下代码:

    steps = solve();
    for (i = 0; i < extra_solves; i++)
        solve();
    

    函数solve()在项目的其他.c文件中定义。

  • 取四个结构变量的值和step返回的值solve()并将数据转换为mxArray

  • 将结果返回为[vars, status]

您可以在S函数代码中定义四个变量,以与文件csolve.c相同的方式填充这些结构,调用如上所示的solve()函数并读取其中的数据varsstatus直接来自四个变量。

您从项目中删除了csolve.c,并将mex函数的其他.c文件添加到S函数。