如何在 Simulink 中迭代嵌入式 Matlab 函数中的结构?

发布于 2024-12-12 14:50:18 字数 1488 浏览 6 评论 0原文

我遇到了一个障碍,我试图迭代 SIMULINK 中 EML(嵌入式 Matlab)功能块内的 MATLAB 工作区中形成的结构。以下是一些示例代码:

% Matlab code to create workspace structure variables
% Create the Elements
MyElements = struct;
MyElements.Element1 = struct;
MyElements.Element1.var1 = 1;
MyElements.Element1.type = 1;
MyElements.Element2 = struct;
MyElements.Element2.var2 = 2;
MyElements.Element2.type = 2;
MyElements.Element3 = struct;
MyElements.Element3.var3 = 3;
MyElements.Element3.type = 3;

% Get the number of root Elements
numElements = length(fieldnames(MyElements));

MyElements 是 SIMULINK 中 MATLAB 功能块 (EML) 的总线类型参数。以下是我遇到麻烦的区域。我知道结构体中元素的数量,也知道名称,但元素的数量可以随任何配置而变化。所以我无法根据元素名称进行硬编码。我必须迭代 EML 块内的结构。

function output = fcn(MyElements, numElements)
%#codegen
persistent p_Elements; 

% Assign the variable and make persistent on first run
if isempty(p_Elements)
    p_Elements = MyElements;    
end

% Prepare the output to hold the vars found for the number of Elements that exist
output= zeros(numElements,1);

% Go through each Element and get its data 
for i=1:numElements
   element = p_Elements.['Element' num2str(i)];  % This doesn't work in SIMULINK 
   if (element.type == 1)
       output(i) = element.var1;
   else if (element.type == 2)
       output(i) = element.var2;
   else if (element.type == 3)
       output(i) = element.var3;
   else
       output(i) = -1;
   end
end

关于如何在 SIMULINK 中迭代结构类型有什么想法吗?另外,我不能使用像 num2str 这样的任何外部函数,因为这是要在目标系统上编译的。

I have hit a roadblock where I am trying to iterate through a structure formed in the MATLAB workspace inside an EML (Embedded Matlab) function block in SIMULINK. Here is some example code:

% Matlab code to create workspace structure variables
% Create the Elements
MyElements = struct;
MyElements.Element1 = struct;
MyElements.Element1.var1 = 1;
MyElements.Element1.type = 1;
MyElements.Element2 = struct;
MyElements.Element2.var2 = 2;
MyElements.Element2.type = 2;
MyElements.Element3 = struct;
MyElements.Element3.var3 = 3;
MyElements.Element3.type = 3;

% Get the number of root Elements
numElements = length(fieldnames(MyElements));

MyElements is a Bus type Parameter for the MATLAB Function Block (EML) in SIMULINK. Below is the area I am running into trouble with. I know the number of elements inside my struct and I know the names, but the number of elements can change with any configuration. So I cannot hardcode based on the Element names. I have to iterate through the struct inside the EML block.

function output = fcn(MyElements, numElements)
%#codegen
persistent p_Elements; 

% Assign the variable and make persistent on first run
if isempty(p_Elements)
    p_Elements = MyElements;    
end

% Prepare the output to hold the vars found for the number of Elements that exist
output= zeros(numElements,1);

% Go through each Element and get its data 
for i=1:numElements
   element = p_Elements.['Element' num2str(i)];  % This doesn't work in SIMULINK 
   if (element.type == 1)
       output(i) = element.var1;
   else if (element.type == 2)
       output(i) = element.var2;
   else if (element.type == 3)
       output(i) = element.var3;
   else
       output(i) = -1;
   end
end

Any thoughts on how I can iterate through a struct type in SIMULINK? Also, I cannot use any extrinsic functions like num2str because this is to be compiled on a target system.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最笨的告白 2024-12-19 14:50:19

我相信您正在尝试使用 dynamic结构的字段名称。正确的语法应该是:

element = p_Elements.( sprintf('Element%d',i) );
type = element.type;
%# ...

I believe you are trying to use dynamic field names for structures. The correct syntax should be:

element = p_Elements.( sprintf('Element%d',i) );
type = element.type;
%# ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文