【问题标题】:Pass Simulink.Parameter to C S-function将 Simulink.Parameter 传递给 C S-Function
【发布时间】:2014-04-04 10:03:02
【问题描述】:

如何将Simulink.Parameter 结构(在我的例子中是结构的结构)传递给C S-function

编辑:

Simulink.Parameter的信息

您可以通过这种方式创建 Simulink.Parameter 对象:

modelParameters = Simulink.Parameter;
modelParameters.Value = myStruct;
modelParameters.CoderInfo.StorageClass = 'ExportedGlobal';

myStruct 值是结构的常规 matlab 结构。这就是我的情况:

这是一种用于将参数传递给 Simulink 的特殊对象类型,我正在寻找一种机制来从 C S-function 访问它。

下载来自hereMnWE

编辑 2: 我是这样读取参数的:

modelParameters_T *modelParameters = (modelParameters_T*)mxGetPr(ssGetSFcnParam(S, PARAM_STRUCT));

但我明白为什么这种方法不起作用 - Matlab 中的结构对象与 C 结构不同,即在内存中不连续并且也包含其他属性。我想我会将 Matlab 结构转换为一个数组,然后将 C 中的数组转换为我的结构定义。

【问题讨论】:

  • 您可以通过模块掩码将参数传递到 S-Function,但我不确定这如何与分层 Simulink.Parameters 一起使用(我猜您的意思是总线对象类型)。跨度>
  • @pmb 有 Simulink.Parameter 数据类型。我通过 S-Function 块掩码传递了那个,但是我如何在 C 代码中读取它呢?我不认为这是一个连续的内存块,因为获取指向它的指针并读取第一个双精度并没有给出正确的值。
  • 但是您的 Simulink.Parameter 的类型是 Bus Object 类型...我不确定为什么这不起作用。我认为总线对象是简单的 C 结构。
  • 您可以将总线作为输入传递,但不能作为参数传递。将总线对象设置为输入时,您必须使用 ssSetInputPortRequiredContiguous(S, INPUT_PORT_BUS, true);然后您可以将其转换为 C 结构。默认情况下,这些总线在内存中是不连续的。无论如何,我找不到将参数设置为内存连续的函数。
  • 这与您的问题有点不同,但是您能否发布 Simulink.Parameter 结构的属性的屏幕截图?如果没有 Bus Objects,我不太明白你是如何做到这一点的(我也有兴趣使用它!)。

标签: simulink s-function


【解决方案1】:

mxGetPr 不是访问对象类型参数的正确方法。它不是结构类型。即使它是结构类型,您也需要使用 mxArray API 来访问结构字段。您需要使用类似下面的代码来访问这些字段。

mxArray* param = ssGetSFcnParam(S, PARAM_STRUCT);
mxArray* prop = mxGetProperty(param, 0, "Value"); // Get Value property from param object
// If prop is double precision use the following line to get its value
double* prop = *(mxGetPr(prop));

查看文档中的 mxArray API 以访问不同类型的 mxArray。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2016-04-27
    相关资源
    最近更新 更多