问题标签 [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.
simulink - 如何在 Simulink 库中以编程方式分发(排列)模块?
我正在使用 Simulink 的 Legacy Code Tool 从旧版 C 设备驱动程序为嵌入式目标生成 S-Function 模块驱动程序库。
驱动程序块通过 LCT 的子命令使用 MATLAB 脚本迭代生成并最终在库target_LCT_sfun_drivers中,例如:slblock_generate
脚本完成后,target_LCT_sfun_drivers保存了我所有的驱动程序块,但它们都堆叠在一起。
我可以向以编程方式分发块的脚本添加什么,以避免手动将它们拖出“堆栈”?
c - Simulink SFunction Builder 总线输入值
我正在尝试了解如何通过自定义 S-Function Blocks 访问和使用总线系统。我使用没有输入和一个总线输出的 S-Function Builder 构建了一个非常基本的 S-Function 。Bus 是一个结构,它只包含一个 double 类型的字段。这很好用。
不,我试图将它的输出连接到一个新创建的块(也在 S-Function Builder 的帮助下),它有一个 Bus input 而没有 output。它应该使用 . 将结构内唯一字段的值写入控制台mexPrintf
。但该值始终为 0(零)
我在输出包装函数中设置了第一个块的输出(工作正常):
我尝试像这样在另一个块中获取输入值(始终打印 0):
simulink - 在自定义系统目标文件中按条件启用 rtwoptions (Simulink Coder)
我正在创建一个自定义系统目标文件 (STF) 并添加一些需要配置的 RTW 选项。一些选项依赖于其他选项,并且可能有意义也可能没有意义,具体取决于它们的配置方式。在这些情况下,我想有条件地禁用它们(灰色)。
到目前为止,我有这样的东西(使用 MATLAB R2014a)
根据文档,通过调用 MATLAB 函数有条件 rtwoption 这样的东西,但我想让它依赖于另一个选项。
这必须是可能的,因为它是在代码生成 --> 报告选项卡中实现的(只有在启用“创建报告”时才启用“打开报告”)。
这个条件的语法是什么?我可以使用“tlcvariable”吗?
c++ - 如何编译具有“大量”信号的总线?
我有一个带有 c++ SFunction 的 simulink 模型,我想将一个大型嵌套总线发送到其中,但是编译器在大约十分钟后因缺少堆空间错误而崩溃。
这辆公共汽车里面有九辆公共汽车,里面还有一组公共汽车,一棵树总共有 49 辆公共汽车和 490 个信号。我已经生成了完整的总线定义,它们都在全局工作区中。我还在头文件中生成了完整的结构定义,49 个总线中的每一个都使用该头文件。
此 SFunction 自动生成的源代码约为 24000 行。
长时间编译此 SFunction 失败,抱怨第 2 遍堆空间不足。我使用的是 Visual C++ 2010 Express 附带的编译器。
我通过一个一个地用元素填充总线进行了实验,并且看到编译时间几乎呈指数增长到失败点。为什么性能会这么差,有没有办法用这种大小的总线编译?
matlab - 用于二维查找表的 S 函数,类似于“sfix_look1_dyn.mex32”
我需要一些关于“sfix_look1_dyn.mex32”文件的信息。目前我正在使用这个 mex 文件,在 masked s 功能块的帮助下。我仅将此块用于一维查找相关计算。但是,如果我想对二维查找表使用类似的逻辑,那么是否可以使用相同的 mex 文件?基本上我想知道是否有任何出路,以便对于 2 D 查找我可以将表数据的值作为输入。
c - Simulink:如何在 2 级 s 函数中使用局部变量?
我用 C 语言编写了一个 Simulink S-Function(级别 2)。生成的模块有一个输出和一个参数。此参数存储在一个变量中,该变量在设置块之后立即在文件范围内定义:
我在 mdlInitializeSizes 中分配它,并对它的值做一些操作:
我的问题是,变量 MASK_INDEX 似乎是全局的,并且在相同类型的所有块之间共享。因此,它对所有块都具有相同的值。
作为一种解决方法,我每次都重新加载它,然后重新执行操作,例如:
我怎样才能得到一个真正的“局部变量”,这样我就不必每次都重复这一切?
time - 显示 Simulink 当前仿真时间
伙计们!
我正在尝试显示 Simulink 当前仿真时间。我必须注意到,就我而言,一旦我使用 load_system,系统就无法查看,了解模拟的进展情况将非常有用。
为此,我已经读过我应该使用函数'ssGetT'。为了实现它,我使用了 S-function builder 块并且我成功了。我的意思是,我能够获得当前的模拟时间。
但是,我在这一点上被抓住了,因为我不知道如何以进度条或消息框或任何其他方式显示它。重要的是,从 S-Function builder 中的 C 环境显示。
如果有任何其他方法可以做到这一点,请告诉我。=)
如果有人可以帮助我,我将不胜感激。
c++ - 在次要时间步中未修复的内存块替代方案?
我有一个带有一些输入的模型,这些输入通过 Memory 模块馈送到 CMEX S-Function,S-Function 基于这些输入提供输出,这些输入被反馈到 S-Function。经典的代数环场景。我使用内存块来防止这种情况,因为我们的求解器通常是可变时间步长
根据Mathworks 文档,Memory Block 和 Unit Delay 模块的输出在较小的时间步内是固定的。我意识到输入可以是离散的或连续的,但输出只会在主要时间步中是连续的,并且在次要时间步中是固定的。
现在,由于各种原因,对我们来说重要的是模型中的所有内容都在次要和主要时间步中更新对我们来说很重要。我想出了一种使用 PWork 向量来存储状态点的先前值并将它们转发到我们使用的 CMEX S-Function 的方法。这可以防止发生代数循环,并确保在较小的时间步内连续,但并不像我想要的那样优雅。
有没有人有任何替代建议?
PS:顺便说一句,我认为无论我的求解器是固定步长还是可变步长,都最好使用内存块,因为它在内部将成为固定步长求解器的单位延迟块。这个假设正确吗?
c++ - 如何处理 Simulink 检测到的人工代数环?
这是一个有点复杂的问题,涉及一个稍微开放的问题。我知道 StackOverflow 不赞成这种做法,但正如您将看到的,我很难将其分解成更小的部分。
我有使用 CMEX S-Function 调用的 C++ 代码(使用 编译legacy_code
)。我手动修改了包装文件以使 S-Fn 在次要时间步中连续。这很重要,因为当它在次要步骤中修复时,我会在函数输出中看到类似楼梯的变化,而不是平滑线。自从让它连续,这个问题已经解决了。
不幸的是,我后来发现输入信号和 S-Function(我用来解决代数环)之间的内存块在次要时间步中是固定的。我之前问过一个问题(这里)关于是否有任何连续的替代方案,但似乎这个问题被埋没了。
所以相反,我参考了这个Mathworks 文档。他们声称 PWork 向量可用于在连续调用 S-Function 之间将值保持在内存中。我可以使用这个向量来做到这一点: 1. 为下一步存储当前时间步的值 2. 在下一步中,使用旧值 3. 计算后,将旧值更新为当前值 4. 重复
本质上,我在内部复制了内存块功能。我想我现在可以删除 Memory 块并用 Initial Condition 块替换它们。不幸的是,这样做会出现代数循环的警告。现在,我的模型有时会解决,有时不会。
这两种情况如下图所示:
S-Function
是CMEXS-Function2
对象。
我想也许 CMEX 函数对代数循环诊断代码很密集,而 Simulink 无法意识到实际上没有真正的代数循环,而只有一个人工循环?
我的问题是:我可以做些什么来告诉Simulink 实际上没有代数环吗?在这种情况下有什么最佳实践吗?
*编辑:原理图不准确,不能正确代表我的模型。更新了
c++ - 在 Simulink 中,mdlUpdate 是否也算作直接馈通?
我的 CMEX S-Function 有一个输入端口,我将其设置为没有直接馈通。但是,当我尝试在mdlUpdate
函数调用中使用来自输入端口的信号时,它会因分段违规而崩溃,并通知我最可能的原因是输入端口的直接馈通状态设置不正确。
在 mdlUpdate 中使用输入信号是否也算作直接馈通?