使用 Matlab 功能块的 Simulink 中的 UDP

Posted

技术标签:

【中文标题】使用 Matlab 功能块的 Simulink 中的 UDP【英文标题】:UDP in Simulink using Matlab Function Block 【发布时间】:2015-07-28 09:03:02 【问题描述】:

我有一个用 Python 设置的服务器,并且已经成功地设置了一个简单的通信协议,一个在 Matlab 脚本中运行的客户端。我需要让这个函数在 Simulink 模型中运行,以便测试我正在开发的一些控制器。由于 UDP 不支持代码生成,我一直在尝试将函数设置为外部函数,如下所示:

function z = fcn(u)

elevationMatrix = zeros(3,3);

coder.extrinsic('udp', 'fwrite', 'fopen');  
% connect to the server

t = udp('localhost', 2002);
fopen(t);

% write a message
fwrite(t, 'This is a test message.');

% read the echo
bytes = fread(t, [t.BytesAvailable, 1], 'char');

%fit the data into a matrix
temp = reshape(bytes, [8 9]);
z = zeros(1,9);
for col = 1:9
        bytepack=uint64(0);
        for row = 1:8
                temp(9-row, col)
                bytepack = bitshift(temp(9 - row, col),8*(8-row));
                z(col) = bitor(bytepack,z(col));
                temp(row, col);
        end;
end;
z = reshape(z, [3,3])';

% close the connection
fclose(t);

我遇到了一些我无法解决的错误;即,“尝试从'mxArray'中提取字段'BytesAvailable'”我猜是因为我需要以某种方式预定义t的大小。对于“bytes”、“temp”和“bytepack”,我得到了同样的结果。

除非您能指出我可以通过内置 Simulink UDP 块发送不同字符串的方法,否则我不想走这条路线,因为我将按名称调用 python 服务器上的调用函数。

【问题讨论】:

【参考方案1】:

有两个系统对象 dsp.UDPSender 和 dsp.UDPReceiver 支持代码生成。两者都可用于 DSP System 工具箱。您应该可以在 MATLAB Function 块中使用它。

如果您需要将 udp 用作外部功能,您可以遵循一些规则来使其工作。外部函数的输出是 mxArrays,您需要预先分配它们以启用这些 mxArrays 到内置类型的自动转换。但这不适用于对象类型。您可以将类型 t 保留为 mxArray。您还可以调用此 mxArray 对象的方法。这些方法也将自动成为外部的。如果您需要这些方法的返回值在其余代码中使用或作为输出返回,那么您需要预先分配它们。一个简单的预分配是,

bytes = zeros(bytesAvailable,1); bytes = fread(t, [bytesAvailable, 1], 'char');

t.BytesAvailable 不能直接从外部数据访问。如果可行,您需要使用 get 函数,或者将其包装在另一个 MATLAB 函数中以获取该值。

为了使这一切变得更容易,最好将所有与 udp 相关的代码放在一个 MATLAB 函数中并调用该函数。在该函数中,您应该将 udp 对象声明为持久对象。

如果您可以使用 dsp.UDPSender,那将是您最简单的方法。

【讨论】:

好的,谢谢你的提示。我正在使用 UDPSender 对象成功发送字节。我现在遇到的问题是,由于所有内容都是按字节写入的,我发现在服务器端恢复所有内容有点复杂。有什么想法吗? 忽略我最后的评论。我正在迭代我的字节数组并使用 step 来发送它。看起来 step 如果你只是传递一个数组也可以工作。这解决了我的问题。问候。

以上是关于使用 Matlab 功能块的 Simulink 中的 UDP的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 simulink 中的 matlab 函数中的参数设置为可调吗?

如何在 Simulink 的 Matlab 功能块内运行引用模型?

Simulink、matlab 函数

从 Simulink 中的 Matlab 功能块调用的 sim 命令的 Simout 输出

Matlab Simulink系统仿真(01)

正确安装matlab后,其中simulink功能键是灰色的,在不卸装matlab情况,还有啥解决方法没