【问题标题】:How to select from two identical bus signals in Simulink?如何在 Simulink 中选择两个相同的总线信号?
【发布时间】:2018-12-13 16:58:57
【问题描述】:

我在 Simulink 中有两个相同的总线结构,但具有不同的值。一个是来自真实车辆的 (CAN) 总线,另一个是 Simulink 中相同的模拟 (CAN) 总线。我想用这些组成一个混合的、相同的输出总线,其中一些信号来自第一条总线,而另一些来自第二条总线,如图所示。

我想用第三条相同的总线进行切换,每个信号都包含一个值,用于确定将信号切换到总线 1 或总线 2 的输出。从示意图上看,它看起来像灰色部分:

如您所见,第一个信号 (Rpm, 3) 取自车辆总线,第二个信号 (Spd, 6) 取自模拟总线。关于结构,输出总线与两条输入总线相同。原理图中的原理有效,但我有超过 500 个信号,所以这种方法不再适用。

如何在无需手动路由 500 个信号的情况下做到这一点?
我正在考虑一个 MATLAB 功能块,但欢迎提出建议。

【问题讨论】:

  • 我相信 MATLAB Function 块是最简单的做法。
  • @PhilGoddard 这就是我的想法,但我真的不知道如何解决这个问题。总线信号被解释为功能块中的结构,因此通过所有元素的 for 循环可能是一种解决方案,但我不知道如何,而且我认为它不会有效。
  • 看起来您应该能够使用logical indexing 来完成作业,而不是循环。但无论哪种方式,请注意带有 MATLAB Function 块的代码正在转换为 C 并编译,它没有在解释器中运行,因此速度应该不是问题。

标签: matlab data-structures struct simulink bus


【解决方案1】:

我找到了解决这个问题的方法。这几乎不是最优雅的方式,但它确实有效。

由于总线在 MATLAB 功能块中作为结构体处理,因此我对所有字段和元素进行了 for 循环,以便为输出总线中的每个元素选择所需的源,如下所示:

subbus = fieldnames(SLCT);
for i=1:+1:11
    signal = fieldnames(SLCT.(subbus{i}))
    for j=1:+1:5
        switch SLCT.(subbus{i}).(signal{j})
            case 0
                TRGT.(subbus{i}).(signal{j}) = SRCA.(subbus{i}).(signal{j});
            case 1
                TRGT.(subbus{i}).(signal{j}) = SRCB.(subbus{i}).(signal{j});
            otherwise
                TRGT.(subbus{i}).(signal{j}) = SRCC.(subbus{i}).(signal{j});
        end
    end
end

我确信一定有更好、更快的方法,但这很有效,而且对于我的应用程序来说已经足够快了。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多