使用 Simulink Coder(或接受来自多个源的输入)时如何使用 Matlab 函数更改可调参数?
How to change a tunable parameter with a Matlab function when using Simulink Coder (or accept input from multiple sources)?
我们有一个在 dSPACE 盒子上编译和 运行 的 Simulink 模型。我们需要能够
- 使用 dSPACE ControlDesk 和
更改参数值
- 使用模型内部的 Matlab 函数更改参数值(或类似 Simulink 块的等效项)
(1) 对于常量块是可能的,只需输入一个数字。您可以在 dSPACE 中更改 Constant 块的值。也可以在 Constant 块中输入像 FOO 这样的变量名,并将该值 FOO 更改为 可调参数 。
(2) 到目前为止还不可能。 'set_param' 之类的似乎不起作用,因为所有内容都是使用 Simulink Coder 编译的。
任何能够从模型内部更改参数 FOO 的方法都适用于我们。
应用程序/为什么?:我们有像 "target x position of robot" 这样的值。有时,这个值是手动设置的,但有时,它是由不同的参与者自动设置的('Drive straight'、'Drive curves',等等)。如果能在一个确定的位置看到当前的目标 x 位置,而不必担心手动将控制从手动模式切换到演员 1、演员 2 等,那就太好了(当然我们需要确保只有一个演员在每个时间步)。如果需要而我们的想法是不可能的,我们至少想要一种优雅的方式来切换控制。
当前解决方法(有问题):
我们当前的方法检测设置值的变化(可能来自不同的参与者)。 Actor 1 设置值 u1=10,则 y=u1=10。然后 Actor 2 设置值 u2=30,然后 y=u2=30。但是如果 actor 1 然后再次设置 u1=10,则没有检测到任何变化,y 仍然是 u2=30。
您可以使用 "Data Store Memory",您可以在运行时从 MATLAB 函数块中更改它。
在 M 函数中,您将 FOO 声明为 global
变量。
function fcn(u)
%#codegen
global FOO
% Do something foo...
if u < 10
FOO = 1;
else
FOO = 2;
end
要做到这一点,您必须首先通过 "Ports and Data Manager".
将此全局变量附加到 M 函数
然后您还必须双击模型中的 "Data Store Memory" 和块参数中的 "Signal Attribute" 部分,您必须将以下参数设置为定义的值 - 自动检测此处不允许:
- 初始值
- 数据类型
- 维度
- 信号类型(复杂度)
但我仍然建议使用 M 函数的输出来驱动 OUTPORT 26!
我们有一个在 dSPACE 盒子上编译和 运行 的 Simulink 模型。我们需要能够
- 使用 dSPACE ControlDesk 和 更改参数值
- 使用模型内部的 Matlab 函数更改参数值(或类似 Simulink 块的等效项)
(1) 对于常量块是可能的,只需输入一个数字。您可以在 dSPACE 中更改 Constant 块的值。也可以在 Constant 块中输入像 FOO 这样的变量名,并将该值 FOO 更改为 可调参数 。
(2) 到目前为止还不可能。 'set_param' 之类的似乎不起作用,因为所有内容都是使用 Simulink Coder 编译的。
任何能够从模型内部更改参数 FOO 的方法都适用于我们。
应用程序/为什么?:我们有像 "target x position of robot" 这样的值。有时,这个值是手动设置的,但有时,它是由不同的参与者自动设置的('Drive straight'、'Drive curves',等等)。如果能在一个确定的位置看到当前的目标 x 位置,而不必担心手动将控制从手动模式切换到演员 1、演员 2 等,那就太好了(当然我们需要确保只有一个演员在每个时间步)。如果需要而我们的想法是不可能的,我们至少想要一种优雅的方式来切换控制。
当前解决方法(有问题):
我们当前的方法检测设置值的变化(可能来自不同的参与者)。 Actor 1 设置值 u1=10,则 y=u1=10。然后 Actor 2 设置值 u2=30,然后 y=u2=30。但是如果 actor 1 然后再次设置 u1=10,则没有检测到任何变化,y 仍然是 u2=30。
您可以使用 "Data Store Memory",您可以在运行时从 MATLAB 函数块中更改它。
在 M 函数中,您将 FOO 声明为 global
变量。
function fcn(u)
%#codegen
global FOO
% Do something foo...
if u < 10
FOO = 1;
else
FOO = 2;
end
要做到这一点,您必须首先通过 "Ports and Data Manager".
将此全局变量附加到 M 函数然后您还必须双击模型中的 "Data Store Memory" 和块参数中的 "Signal Attribute" 部分,您必须将以下参数设置为定义的值 - 自动检测此处不允许:
- 初始值
- 数据类型
- 维度
- 信号类型(复杂度)
但我仍然建议使用 M 函数的输出来驱动 OUTPORT 26!