首页 文章

使用Matlab功能块在Simulink中进行UDP

提问于
浏览
0

我有一个使用Python设置的服务器,并且已经成功地与运行在Matlab脚本中的客户端 Build 了一个简单的通信协议 . 我需要在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 回答

  • 1

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

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

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

    t.BytesAvailable不能直接从外部数据访问 . 如果可以使用get函数,或者将其包含在另一个MATLAB函数中,则需要使用get函数 .

    为了使这一切变得更容易,最好将所有与udp相关的代码放在一个单独的MATLAB函数中并将其称为外部函数 . 在该函数中,您应该将udp对象声明为持久性 .

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

相关问题