ich habe folgendes Problem. Ich habe verschiedene Radio-Buttons in meiner GUI.
Gleichzeitig lese ich Werte aus Simulink ein und stelle diese in einem Edit-Feld dar. Je nach Größe des Wertes färbt sich das Edit-Feld grün oder rot.
Nun soll aber, abhängig vom Zustand der Buttons, die Grenze bei der Entscheidung, ob rot oder grün, variieren.
z.B.: Ist als Auswahl "maennlich" gesetzt, so soll die Grenze bei dem Wert 200 liegen, ist die Person weiblich, so soll der Grenzwert 180 sein.
Das Auslesen des Edit-Feldes und der Radio-Buttons klappt wunderbar. Ich weiß nur nicht, wie ich beides verbinden kann, da das Edit-Feld in der "function varargout = Gruppeneinteilung(varargin)" gleich zu Beginn generiert wird und das Auslesen der Buttons in einer extra Funktion erfolgt, auf welche zuvor in der opening_fcn der m.file wurde.
% Edit Feld auslesen und einfärben
y = get(statestxt,'string');
y2 = str2num(y);
if y2<200.0000 set(statestxt,'BackgroundColor','red') elseset(statestxt,'BackgroundColor','green') end
Hey,
also normalerweise solltest du alles in der opening fcn initialisieren und dort kannst du alles in die handles übernehemen. Dann kannst du natürlich auch wie gemacht in der initialisierungs fcn aber das bringt nicht die volle Funktionalität der GUI mit sich. Nicht umsonst steht dort DO NOT EDIT...
Also einfach:
Code:
function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin)
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
str = num2str(handles.rto.OutputPort(1).Data);
statestxt = findobj('Tag','curState');% hier kannste auch mit handles arbeiten set(statestxt,'string',str);
% Edit Feld auslesen und einfärben
y = get(statestxt,'string');
y2 = str2num(y);
if y2<200.0000 set(statestxt,'BackgroundColor','red') elseset(statestxt,'BackgroundColor','green') end
handles.output = hObject;
Und dann hast du in deiner Geschlecht_group_SelectionChangeFcn alles zur Verfügung... Wobei du eigentlich sowieso einiges an Code hier sparen kannst weil du von double zu string und wieder zu double springst...
müsste ich ja in die Geschlecht_group_SelectionChangeFcn schreiben, also in den Case 'maennlich', eine Farbänderung tritt jetzt aber nicht mehr auf.
Die andere Sache ist, dass mit dem Durchlauf der Matlab-Datei, die GUI nicht mehr automatisch geöffnet wird, sondern nur noch, wenn ich das Simulink-Modell manuell starte.
end % Einfärben if handles.rto.OutputPort(1).Data<200% auslesen und vergleichen set(handles.curState,'BackgroundColor','red') else set(handles.curState,'BackgroundColor','green') end
Da ich nicht mit Simulink arbeite weiß ich nicht was du bei get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject') bekommst. Ist das ein handle oder ein Struct? Wo und wie oft soll das Simulinkobjekt überhaupt ausgelesen werden? Wo updatest du denn die Werte in deiner GUI, die du vom Simulinkmodel bekommst? Oder muss dieses nur einmal eigeladen werden und danach ändert sich nix?
Prinzipiell solltest du in die Opening_Fcn alles rein schreiben, sodass beim ersten Aufruf auch alle GUIobjekte gesetzt werden können. In diesem Fall wäre es die komplette function Geschlecht_group_SelectionChangeFcn.
Code:
function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin) % Speichern in handlestruct
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
% Editfeld mit Wert setzen set(handles.curState,'String',handles.rto.OutputPort(1).Data)
% Startwert für Radiobuttons ifget(handles.radiobutton_maennlich,'Value') set(handles.static_text,'String','maennlich');
else set(handles.static_text,'String','weiblich');
end % Einfärben des Editfeldes if handles.rto.OutputPort(1).Data<200% auslesen und vergleichen set(handles.curState,'BackgroundColor','red') else set(handles.curState,'BackgroundColor','green') end
Zudem weiß ich auch nicht was bei rto.OutputPort(1).Data ist. Nur ein Double oder ein Array? Der Fall oben ist bezogen auf nur ein Double. Ich hoffe das hilft dir weiter...
eingelesen. Es wird das Runtime Object, also die sich ändernden Werte mit Hilfe eines Listeners ausgelesen und ständig aktualisiert. Oder was meintest du?
Das Problem ist, wenn ich zuvor alles in die opening_fcn schreibe, dann wird auch nur das ausgeführt. Welche if-Bedingung ich in der Geschlecht_group_SelectionChangeFcn stehen habe, ist vollkommen egal, da es "übergangen" wird. Ich dachte ja, es ist möglich folgendes
in der opening_fcn zu definieren und dann im späteren Verlauf wieder auf y2 zurückzugreifen, dort, wo ich die if-Bedingung eigentlich verwenden möchte, also in der Geschlecht_group_SelectionChangeFcn.
Code:
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
str = num2str(handles.rto.OutputPort(1).Data);
statestxt = findobj('Tag','curState');% hier kannste auch mit handles arbeiten set(statestxt,'string',str);
% Edit Feld auslesen und einfärben
y = get(statestxt,'string');
y2 = str2num(y);
Mein eigentlich Ziel ist es ja die if-Bedingung mit dem Case 'maennlich' bzw. 'weiblich' zu verbinden und das klappt eben nicht, weil in der opening_fcn schon alles festgelegt ist. Wie kann ich es denn machen, dass y2 nicht nur für die opening_fcn sondern auch für die nächsten Funktionen zur Verfügung steht? In einen Workspace speichern klappt glaube ich doch nur, wenn man die Werte nicht in Echtzeit benötigt, oder?
entweder verstehst du mich nicht oder ich dich nicht. Alles was du benötigst habe ich doch oben dargestellt. Nur ist bei mir
handles.rto.OutputPort(1).Data dein y2.
Ich habe es in das handles Struct in der opening_fcn übernommen, sodass du das in dem Geschlecht_group_SelectionChangeFcn zu Verfügung hast.
Allerdings habe ich vergessen in der Opening_Fcn den den CB für deine Radios zu setzen...
Code:
function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin) % Speichern in handlestruct
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
% Editfeld mit Wert setzen set(handles.curState,'String',handles.rto.OutputPort(1).Data)
% Startwert für Radiobuttons ifget(handles.radiobutton_maennlich,'Value') set(handles.static_text,'String','maennlich');
else set(handles.static_text,'String','weiblich');
end % Einfärben des Editfeldes if handles.rto.OutputPort(1).Data<200% auslesen und vergleichen set(handles.curState,'BackgroundColor','red') else set(handles.curState,'BackgroundColor','green') end
..ich glaube ich habe dich schon verstanden. aber wie gesagt es funktioniert nicht.
so wie du es aufgeschrieben hast, wird doch der Grenzwert nicht in Abhängigkeit zur Auswahl der Radiobuttons festgelegt, sondern noch immer separat. Er würde also noch immer bei 200 liegen, egal, ob es sich um eine Frau oder einen Mann handelt.
Ah wer lesen kann (hab die 180 für weiblich überlesen)...
Dann schreib den Fall doch einfach in die Abfrage bzw. definiere eine neue Variable...
Code:
function Gruppeneinteilung_OpeningFcn(hObject, eventdata, handles, varargin) % Speichern in handlestruct
handles.rto = get_param('HerzfrequenzFehlerPfad2/Num','RuntimeObject');
% Editfeld mit Wert setzen set(handles.curState,'String',handles.rto.OutputPort(1).Data)
% Startwert für Radiobuttons ifget(handles.radiobutton_maennlich,'Value') set(handles.static_text,'String','maennlich');
x = 200;
else
x = 180;
set(handles.static_text,'String','weiblich');
end
% Einfärben des Editfeldes if handles.rto.OutputPort(1).Data<x% auslesen und vergleichen set(handles.curState,'BackgroundColor','red') else set(handles.curState,'BackgroundColor','green') end set(handles.Geschlecht_group,'SelectionChangeFcn',@Geschlecht_group_SelectionChangeFcn);
guidata(hObject, handles);
function Geschlecht_group_SelectionChangeFcn(hObject, eventdata)
handles = guidata(hObject);
switchget(eventdata.NewValue,'Tag')% Get Tag of selected object case 'radiobutton_maennlich'
x = 200;
set(handles.static_text,'String','maennlich');
case 'radiobutton_weiblich'
x = 180;
set(handles.static_text,'String','weiblich');
end % Einfärben if handles.rto.OutputPort(1).Data<x% auslesen und vergleichen set(handles.curState,'BackgroundColor','red') else set(handles.curState,'BackgroundColor','green') end
Entschuldigung, dass ich mich erst jetzt melde. Mein Mainboard und Netzteil haben letzte Woche den Geist aufgegeben.
...
Super!
Es scheint zu funktionieren!
Vielen vielen Dank!
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.