2017-04-05 3 views
1

Ich erstelle eine MATLAB-GUI mit dem App-Designer (sehr ähnlich, aber besser als GUIDE), den ich verwenden möchte, um die Datenausgabe meines Simulink-Modells in Echtzeit zu überwachen. Mit anderen Worten, ich habe ein Simulink-Modell und eine GUI, die beide in der gleichen MATLAB-Instanz laufen, und ich möchte Pakete über UDP vom Simulink-Modell senden und diese Daten in meiner GUI zum Aktualisieren von Plots verwenden. Ich weiß jedoch nicht, wie man die Daten aus dem UDP-Paket ohne Blockierung liest.Nicht blockierender UDP-Empfänger in Matlab GUI

Gibt es eine Möglichkeit, einen Handler zu binden, wenn ein Paket empfangen wird, damit ich eine Funktion zum Aktualisieren von Plots/Feldern ausführen kann?

+0

Wenn Sie über UDP kommunizieren, führen Sie die GUI einfach in einer separaten Instanz von MATLAB aus. – Suever

+0

@Suever Weil ich von der GUI aus auch auf mein Simulink-Modell zugreifen kann, um seinen Modell-Arbeitsbereich zu schreiben – Ortix92

Antwort

0

Natürlich hat Matlab neben BytesAvailableFcn die datagramreceivedfcn, um Ihre benutzerdefinierte Funktion auf neue Dagtrams aufzurufen, die nicht blockierend ist, während fread/fscanf (vorübergehend) blockiert.

In Bezug auf Rückrufe in Matlab lesen events and cbs

kompilierbare eigenständige aussehen könnte:

%% standalone main 
%{ 
    see docs/* 
%} 

function exitcode = main(port, remotePort) 

% sanitize input 
if(~exist('port','var') || ~exist('remotePort','var')) 
    disp(['args: port remotePort']); 
    exit(1); 
end 

if ischar(port) 
    port=str2num(port); 
end 
if ischar(remotePort) 
    remotePort=str2num(remotePort); 
end 

% create udp object 
u = udp('127.0.0.1',remotePort, 'LocalPort', port); 

% connect the UDP object to the host 
fopen(u); 
exitcode = 0; 

% since we poll, suppress warning 
warning('off','instrument:fscanf:unsuccessfulRead'); 
warning VERBOSE 

% specify callback on datagram 
while true 
    msgEnc= fscanf(u); 
    % timed out without datagram 
    if isempty(msgEnc) 
     continue 
    end 
    % do sth with msgEnc (which is a readable string) 
    fprintf(u, 'heard sth'); %answer 
end 
end 

Wenn Sie Simulink-Block verwenden möchten udpreceive , die eine nicht-blokcking Fähigkeit

A hat First In First Out (FIFO) -Puffer empfängt die Daten. Zu jedem Zeitpunkt Schritt, der Datenport gibt die angeforderten Werte aus dem Puffer. In einem nicht blockierenden Modus zeigt der Status-Port an, ob der Block neue Daten empfangen hat.