2015-07-28 39 views
0

我有一臺用Python設置的服務器,並且已經成功地建立了一個簡單的通信協議,其中一個客戶端運行在Matlab腳本中。我需要在Simulink模型中運行此函數,以測試我正在開發的一些控制器。由於UDP不支持代碼生成,我已經嘗試設置功能外在如下: 使用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的大小。我對「字節」,「temp」和「bytepack」都有同樣的看法。

除非您可以指出我可以通過內置Simulink UDP模塊發送不同字符串的方式,否則我寧願不要沿着該路線走,因爲我將按名稱調用在python服務器上調用函數。

回答

1

有兩個支持代碼生成的System對象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函數中。

爲了使這一切更容易,最好將所有與udp相關的代碼放在一個MATLAB函數中,並調用外部函數。在這個函數中,你應該聲明udp對象是持久的。

如果您可以使用dsp.UDPSender,那將是最簡單的方法。

+0

好的,謝謝你的提示。我正在使用UDPSender對象成功發送字節。我現在遇到的問題是,由於所有內容都以字節爲單位進行編寫,因此我發現恢復服務器端的所有內容會稍微複雜一些。有任何想法嗎? – RYS

+0

無視我最後的評論。我正在迭代我的字節數組,並使用步驟發送它。看起來像步驟也適用,如果你只是傳遞一個數組。這解決了我的問題。問候。 – RYS