问题标签 [s-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
322 浏览

c - 在 MATLAB 中编译 C S-Function 多定义错误

我正在尝试使用 S-Function 构建器块和 minGW 64 位编译器在 MATLAB Simulink 中编译各种 C-Function。代码中的语法错误是不可能的,因为它是来自 ECU 的代码,它已经投入生产并运行了多年。

我的两个文件不断收到以下错误消息:

...example.obj:example.c:(.text+0x0): 'example' 的多重定义

...example.obj:example.c:(.text+0x0): 首先定义在这里

该错误使我感到困惑,因为它指的是与“第一个定义”相同的位置。在其他函数中,它是位置 ( .text+0x17a)。

有没有人遇到过同样的问题或知道如何解决它?会不会是编译器的bug?

来自德国的问候,乔纳森

0 投票
0 回答
158 浏览

matlab - 在S函数Matlab中设置不同的路径头

我想在 Matlab 的 S 函数中设置路径标题,以便 Matlab 去那些路径查找标题。我举个例子:路径1中的标题1(当前文件夹matlab)路径2中的标题2路径2中的标题3

我在 S 函数代码中调用标题,如下所示:

包括“header1.h”

然后 header1 有下一个包含:

包括“path2/header2.h”

然后 Matlab 得到很好的标题 2,但问题是当标题 2 像这样调用标题 3 时:

包括“header3.h”

因此,Matlab 尝试从当前文件夹(路径 1)中获取头 3,但头 3 在路径 2 中。

那么如何设置标题的路径?那么那个Matlab会在不同的路径中找到标题吗?

0 投票
2 回答
1107 浏览

matlab - 从工作区获取 S 函数中的变量

我想从 Matlab 的工作区获取 S-Function(.cpp 和 wrapper.cpp)中的变量。

我怎样才能做到这一点?

谢谢。

0 投票
0 回答
259 浏览

matlab - 来自结构的 MATLAB 总线

我想将数据从我的 MATLAB 工作区中的结构传递给 S-Function。为此,我创建了一个总线。代码编译没有任何错误。

当我开始模拟时,我收到以下错误消息:

在“无标题/来自工作区”中指定为工作区输入的结构格式变量无效。如果输入信号是总线信号,则变量必须是 MATLAB timeseries 对象的结构体。否则,变量必须包含“时间”和“信号”字段,并且“信号”字段必须是具有“值”字段的结构。

在我看来,时间序列对象没有意义,因为值都是恒定的。

还有其他方法可以在我的 S-Function 中导入 MATLAB 结构吗?

仅供参考:我正在使用 S-Function Builder,因为我没有任何 C 经验。

0 投票
1 回答
2809 浏览

matlab - 从 Simulink 调用 fmincon

我正在尝试在 Simulink-Matlab 框架中实现一种特定类型的模型预测控制。为此,我的计划是让 Simulink 中的动态模型调用一个外部 Matlab S-Function,该 S-Function 反过来运行一个调用不同 Simulink 文件的优化。因此,程序流程如下: Simulink -> Matlab (fminconquadprog) -> Simulink。

如您所见,Matlab S-function 会调用fminconor quadprog,但我想将 fmincon 用于我的特定控件类型。请忽略到目前为止与计算效率相关的任何问题。

我尝试了这种方法,但是有两个非常明显的问题: *首先,为了编译代码不会出错(基本上是获得一个.mex文件,我不需要用C编程),我添加了命令

coder.extrinsic('fmincon');

这是必需的,否则 Simulink 无法编译 mex 文件。但是,如果您这样做,则会收到以下错误:

我试图将调用 Simulink 的成本函数更改为另一个更简单的成本函数 ( x.^2),但仍然出现错误。

寻找问题的解决方案,我fmincon在 Mathworks 博客上发现了相同的问题(即如何从 Simulink 中的 Matlab 函数调用),但没有答案(https://uk.mathworks.com/matlabcentral/answers/65202 -optimization-calling-fmincon-in-simulink-embedded-block)。

谁能帮我一把?提前致谢!

0 投票
2 回答
940 浏览

matlab - Simulink S-Function Builder 中的静态变量

我目前正在使用 S-Function Builder 模块在 Simulink 模型中实现一些 C 代码。

该代码使用各种计时器和计数器,这些计时器和计数器被定义为静态变量,以便在以下模拟步骤中访问数据。

但是,如果我开始仿真 MATLAB 崩溃而没有错误消息(“致命异常”)。为了测试,我定义了没有“静态”语句的变量。模拟在这种情况下有效,但是 S-Function 的(逻辑上)错误结果。

有没有其他人遇到过类似的问题或知道如何在 Simulink 中声明静态变量?

附言

我知道我可以使用工作向量,但我不打算这样做,因为这样做会导致采用该功能需要付出巨大的努力。此外,我可以使用内存块在模型中简单地构建反馈循环。对于大约 100 个变量,此解决方案也非常不切实际。

0 投票
1 回答
886 浏览

matlab - 为什么S-Function只执行mdlInitializeSizes(),不执行mdlOutputs()、mdlStart()等?

#define S_FUNCTION_NAME myfunction_sFun

#define S_FUNCTION_LEVEL 2

#define MDL_INITIAL_SIZES

#define MDL_INITIALIZE_SAMPLE_TIMES

#include “tmwtypes.h”

#include “simstruc_types.h”

#包括“mex.h”

#include “simstruc.h”

无效 mdlInitializeSizes(SimStruct *S)

{

}

无效 mdlInitializeSampleTimes(SimStruct *S)

{

}

#define MDL_OUTPUTS

#ifdef MDL_OUTPUTS

void mdlOutputs(SimStruct *S, int_T tid)

{

}

#万一

#define MDL_START

#ifdef MDL_START

无效 mdlStart(SimStruct *S)

{

}

#万一

无效 mdlTerminate(SimStruct *S){}

/ ==============================

  • 所需的 S-function 拖车 *

    ============================== /

#ifdef MATLAB_MEX_FILE /* 这个文件是否被编译为 MEX 文件?*/

#include "simulink.c" /* MEX 文件接口机制 */

#别的

#include "cg_sfun.h" /* 代码生成注册函数 */

#万一

0 投票
0 回答
1308 浏览

matlab - 从 c-mex s-functions 输出结构数组

我正在尝试通过我的 c-mex s-function 中的 simulink 中的总线对象输出以下结构。以下代码片段来自我的主要 matlab 文件,如果我运行此脚本,slBus1则会创建 -simulink-bus-object 并将其放置在 matlab-workspace 中。

我使用 simulink s-function-builder 创建了以下代码,用于通过 simulink 总线输出结构a(或)。slBus1simulink 模型如下所示:

在此处输入图像描述

如您所见,总线选择器块的所有输出端口都具有奇怪的尺寸 [1x1],但子结构e应该具有尺寸 [3x1]。如果我在主结构中使用索引,也会发生这种行为,例如:

我只会a(1).b从 simulink 总线输出中获取。

你对如何解决这个问题有什么建议吗?我在文档或互联网的其他地方没有找到任何关于此的内容。谢谢!

0 投票
0 回答
535 浏览

c++ - 如何在 C++ S-Function 中使用 OpenCV

我想使用 OpenCV 函数 cvtColor 使用 Simulink 中的 S-Function 将图像从 RGB 更改为灰度,如下所示:

Simulink 图像

为了使输入与 OpenCV 一起使用,需要将其转换为 cv::Mat。我发现这可以通过OpenCV Interface C++ API来完成,但我不知道该怎么做。

我对 S-Functions 的了解有限,但据我所知,转换需要在mdlOutputs方法内完成。与此类似的东西:

我在正确的轨道上吗?你知道我在哪里可以找到这方面的一些例子吗?

谢谢

编辑:

非常感谢您的评论@Phil Goddard。在您的指导下,我现在能够编译 S-Function。现在我有一个不同的问题。每次我尝试运行 Simulink 时,程序都会崩溃,我会收到以下错误:


故障数:1

b:\matlab\foundation_libraries\src的 void __cdeclanonymous-namespace'::error(const struct匿名命名空间'::header *const ,const unsigned __int64,const void const ,const unsigned __int64,const class boost::basic_format,class std::allocator > &) 中的断言\fl\mem\alignment.cpp 第 323 行:传递给“vector_check”的指针无效,并且似乎不是来自以下任何例程:vector_malloc、vector_calloc、vector_realloc mxMalloc、mxCalloc*、mxRealloc*

这表明发生了以下情况之一:

  • 指针已经被释放
  • 指针来自不兼容的分配器(例如 new、malloc、utMalloc)
  • 指针不是来自任何分配器(例如堆栈、未初始化的内存)
  • 内存损坏破坏了指针或其标头

我也像这样更新了代码:

知道出了什么问题吗?

0 投票
0 回答
429 浏览

matlab - Matlab S-函数误差

我正在尝试使用 Matlab S-Function 构建跟踪器微分器。但是,它给了我一个错误,说“在 flag=3 调用期间 S-function 'han_td' 在 'ex_han/S-Function' 中返回的输出必须是长度为 2 的实向量”。

我看不出我做错了什么。下面是代码: