Simulink 中的 UDP 使用 Matlab 功能块
UDP in Simulink using Matlab Function Block
我用 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);
我遇到了一些无法解决的错误;即 "Attempt to extract field 'BytesAvailable' from 'mxArray'" 我猜是因为我需要以某种方式预定义 t 的大小。我对 'bytes'、'temp' 和 'bytepack.'
得到同样的结果
除非你能指出我可以通过内置的 Simulink UDP 块发送不同字符串的方法,否则我宁愿不走那条路,因为我将在 python 服务器名称。
有两个系统对象 dsp.UDPSender 和 dsp.UDPReceiver 支持代码生成。两者都可用于 DSP 系统工具箱。您应该能够在 MATLAB Function 块中使用它。
如果您需要将 udp 用作外部函数,您可以遵循一些规则来使其工作。外部函数的输出是 mxArrays,您需要预先分配它们以启用这些 mxArrays 到内置类型的自动转换。但这不适用于对象类型。您可以将类型 t 保留为 mxArray。您还可以在此 mxArray 对象上调用方法。这些方法也将自动成为外部方法。如果您需要这些方法的 return 值用于代码的其余部分或 return 作为输出,那么您需要预先分配它们。一个简单的预分配是,
bytes = zeros(bytesAvailable,1);
bytes = fread(t, [bytesAvailable, 1], 'char');
t.BytesAvailable 不能直接从外部数据访问。如果可行,您需要使用 get 函数,或者将其包装在另一个 MATLAB 函数中以获取值。
为了使这一切变得更容易,最好将所有与 udp 相关的代码放在一个 MATLAB 函数中并调用该外部函数。在该函数中,您应该将 udp 对象声明为持久对象。
如果您可以使用 dsp.UDPSender,那将是最简单的方法。
我用 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);
我遇到了一些无法解决的错误;即 "Attempt to extract field 'BytesAvailable' from 'mxArray'" 我猜是因为我需要以某种方式预定义 t 的大小。我对 'bytes'、'temp' 和 'bytepack.'
得到同样的结果除非你能指出我可以通过内置的 Simulink UDP 块发送不同字符串的方法,否则我宁愿不走那条路,因为我将在 python 服务器名称。
有两个系统对象 dsp.UDPSender 和 dsp.UDPReceiver 支持代码生成。两者都可用于 DSP 系统工具箱。您应该能够在 MATLAB Function 块中使用它。
如果您需要将 udp 用作外部函数,您可以遵循一些规则来使其工作。外部函数的输出是 mxArrays,您需要预先分配它们以启用这些 mxArrays 到内置类型的自动转换。但这不适用于对象类型。您可以将类型 t 保留为 mxArray。您还可以在此 mxArray 对象上调用方法。这些方法也将自动成为外部方法。如果您需要这些方法的 return 值用于代码的其余部分或 return 作为输出,那么您需要预先分配它们。一个简单的预分配是,
bytes = zeros(bytesAvailable,1); bytes = fread(t, [bytesAvailable, 1], 'char');
t.BytesAvailable 不能直接从外部数据访问。如果可行,您需要使用 get 函数,或者将其包装在另一个 MATLAB 函数中以获取值。
为了使这一切变得更容易,最好将所有与 udp 相关的代码放在一个 MATLAB 函数中并调用该外部函数。在该函数中,您应该将 udp 对象声明为持久对象。
如果您可以使用 dsp.UDPSender,那将是最简单的方法。