WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

GUI "Variable Calling" Problem

 

hermano
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 14.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2016, 14:55     Titel: GUI "Variable Calling" Problem
  Antworten mit Zitat      
Hallo zusammen,

ich habe schon ein Code fertig für ein spezifisches Programm, und wollte jetzt es in einer GUI schreiben.

Ich brauche 4 Matrizen für dieses Programm, und habe den in der GUI herstellt (sind alle editierbar). Zwei Parameter müssen auch gefolgt werden, welche habe ich mit 2 Radiobuttons herstellt. Folgt diesen Funktionen und Callbacks:


Code:
--- Executes on button press in EM_null.
function EM_null_Callback(hObject, eventdata, handles)
% hObject    handle to EM_null (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of EM_null
if (get(hObject,'Value') == get(hObject,'Max'))
    EM_Welle = 0;
else
    disp('Bitte T_VKM (Matlab-Programm) = T_VKM (Realität) + T_EM (Realität) verwenden')
end


% --- Executes on button press in Abtriebs_2.
function Abtriebs_2_Callback(hObject, eventdata, handles)
% hObject    handle to Abtriebs_2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Abtriebs_2
if (get(hObject,'Value') == get(hObject,'Max'))
    Abtriebswelle = 2;
else
    disp('Fehler! Bitte Abtriebswelle als 2 verwenden')
end



% --- Executes when entered data in editable cell(s) in RS_Matrix.
function RS_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to RS_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_RS = get(hObject,'Data');
RS = [data_RS];



% --- Executes when entered data in editable cell(s) in SM_Matrix.
function SM_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to SM_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_SM = get(hObject,'Data');
SM = [data_SM] ;



% --- Executes when entered data in editable cell(s) in SE_Matrix.
function SE_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to SE_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_SE = get(hObject,'Data');
SE = [data_SE];




% --- Executes when entered data in editable cell(s) in Geartype_Matrix.
function Geartype_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to Geartype_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_GT = get(hObject,'Data');
GearType = [data_GT];


% --- Executes on button press in Solve_push.
function Solve_push_Callback(hObject, eventdata, handles)
% hObject    handle to Solve_push (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% --- Outputs from this function are returned to the command line.

 
Ab hier folgt das originelles Programm/Code, das als Eingabeparameter hat :
RS, SE, SM (Matrizen), GearType (Vektor), EM_Welle (=0, habe als Parameter geschrieben), Abtriebswelle (=2, auch Parameter).

Wenn ich versuche das Programm/GUI zu benutzen, ich fülle die Tabellen aber bekomme diese Antwort:
gui_RS_Berechnung_1
Undefined function or variable "RS".

Error in gui_RS_Berechnung_1>Solve_push_Callback (line 189)
nRS = size(RS, 2); % Anzahl der Radsätze

Error in gui_mainfcn (line 96)
feval(varargin{:});

Error in gui_RS_Berechnung_1 (line 42)
gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)gui_RS_Berechnung_1('Solve_push_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating uicontrol Callback


Rolling Eyes

So, ich weiß es nicht ob ich muss eine neue Funktion für jeder Eingabeparameter schreiben, oder eine Callfunction (@beispieleFunktion) benutzen, oder was.

Hab schon im Internet gesucht, aber die Beispiele für GUI sind immer einfach Sachen oder haben kein Sinn für mich.


Danke im Voraus und entschuldigung mich für mein schlechtes Deutsch (Ausländer hier Razz )

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]

Unbenannt.PNG
 Beschreibung:

Download
 Dateiname:  Unbenannt.PNG
 Dateigröße:  25.96 KB
 Heruntergeladen:  427 mal

_________________

Viele Grüße,
Hermano
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.04.2016, 16:23     Titel: Re: GUI "Variable Calling" Problem
  Antworten mit Zitat      
Hallo hermano,

Du hast genau den Code, der die Probleme erzeugt, nicht gepostet. Das ist unpraktisch.

Jede Funktion hat in Matlab ihren eigenen Workspace, also eine Liste von Variablen. Wenn die Funktion verlassen wird, werden die Variablen gelöscht, wenn sie nicht als Output zurückgegeben werden.
Variablen in einem Callback zu erzeugen, bewirkt deshalb grundsätzlich gar nichts außerhalb des Callbacks. Das könnte auch in den einfachen GUI-Beispielen ersichtlich sein.
Eine Lösung ist es, die Variablen im handles-Struct zu speichern:
Code:
function EM_null_Callback(hObject, eventdata, handles)
handles = guidata(hObject);  % Obtain current value of struct
if (get(hObject,'Value') == get(hObject,'Max'))
    handles.EM_Welle = 0;
else
    disp('Bitte T_VKM (Matlab-Programm) = T_VKM (Realität) + T_EM (Realität) verwenden')
end
guidata(hObject, handles);  % Store struct

function Solve_push_Callback(hObject, eventdata, handles)
handles = guidata(hObject);
EM_Welle = handles.EM_Welle;
RS = handles.RS;
etc...
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
hermano
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 14.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2016, 14:22     Titel:
  Antworten mit Zitat      
Hi Jan...Danke für die Hinweis...

Ich habe es erneut versucht, aber klappt auch nicht mit dieser neuen Struktur.

Code:
function varargout = gui_RS_Berechnung_1(varargin)
% GUI_RS_BERECHNUNG_1 MATLAB code for gui_RS_Berechnung_1.fig
%      GUI_RS_BERECHNUNG_1, by itself, creates a new GUI_RS_BERECHNUNG_1 or raises the existing
%      singleton*.
%
%      H = GUI_RS_BERECHNUNG_1 returns the handle to a new GUI_RS_BERECHNUNG_1 or the handle to
%      the existing singleton*.
%
%      GUI_RS_BERECHNUNG_1('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI_RS_BERECHNUNG_1.M with the given input arguments.
%
%      GUI_RS_BERECHNUNG_1('Property','Value',...) creates a new GUI_RS_BERECHNUNG_1 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before gui_RS_Berechnung_1_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to gui_RS_Berechnung_1_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help gui_RS_Berechnung_1

% Last Modified by GUIDE v2.5 14-Apr-2016 15:55:47

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @gui_RS_Berechnung_1_OpeningFcn, ...
                   'gui_OutputFcn',  @gui_RS_Berechnung_1_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before gui_RS_Berechnung_1 is made visible.
function gui_RS_Berechnung_1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui_RS_Berechnung_1 (see VARARGIN)

% Choose default command line output for gui_RS_Berechnung_1
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes gui_RS_Berechnung_1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = gui_RS_Berechnung_1_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

 

% --------------------------------------------------------------------


% --- Executes on button press in EM_null.
function EM_null_Callback(hObject, eventdata, handles)
% hObject    handle to EM_null (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of EM_null
if (get(hObject,'Value') == get(hObject,'Max'))
    handles.EM_Welle = 0;
else
    disp('Bitte T_VKM (Matlab-Programm) = T_VKM (Realität) + T_EM (Realität) verwenden')
end
guidata(hObject, handles); %Struktur speichern

% --- Executes on button press in Abtriebs_2.
function Abtriebs_2_Callback(hObject, eventdata, handles)
% hObject    handle to Abtriebs_2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Abtriebs_2
if (get(hObject,'Value') == get(hObject,'Max'))
    handles.Abtriebswelle = 2;
else
    disp('Fehler! Bitte Abtriebswelle als 2 verwenden')
end
guidata(hObject, handles);


% --- Executes when entered data in editable cell(s) in RS_Matrix.
function RS_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to RS_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_RS = get(hObject,'Data');
handles.RS = [data_RS];
guidata(hObject, handles);



% --- Executes when entered data in editable cell(s) in SM_Matrix.
function SM_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to SM_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_SM = get(hObject,'Data');
handles.SM = [data_SM] ;
guidata(hObject, handles);



% --- Executes when entered data in editable cell(s) in SE_Matrix.
function SE_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to SE_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_SE = get(hObject,'Data');
handles.SE = [data_SE];
guidata(hObject, handles);



% --- Executes when entered data in editable cell(s) in Geartype_Matrix.
function Geartype_Matrix_CellEditCallback(hObject, eventdata, handles)
% hObject    handle to Geartype_Matrix (see GCBO)
% eventdata  structure with the following fields (see UITABLE)
%   Indices: row and column indices of the cell(s) edited
%   PreviousData: previous data for the cell(s) edited
%   EditData: string(s) entered by the user
%   NewData: EditData or its converted form set on the Data property. Empty if Data was not changed
%   Error: error string when failed to convert EditData to appropriate value for Data
% handles    structure with handles and user data (see GUIDATA)
data_GT = get(hObject,'Data');
handles.GearType = [data_GT];
guidata(hObject, handles)

% --- Executes on button press in Solve_push.
function Solve_push_Callback(hObject, eventdata, handles)
% hObject    handle to Solve_push (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% --- Outputs from this function are returned to the command line.

handles = guidata(hObject);
EM_Welle = handles.EM_Welle;
Abtriebswelle = handles.Abtriebswelle;
RS = handles.RS;
SE = handles.SE;
SM = handles.SM;
GearType = handles.GearType;    


%Hauptfunktion
%%% ENDE von "Werte vorgeben" %%%
% Ab hier stehen nur noch Informationen bzgl. des Programm- bzw.
% Berechnungsablauf. Alle Informationen, die ein Getriebe charaktersisieren
% sollen oberhalb dieser Zeilen stehen.
% --> Wichtige Ausnahmen: Unter dem Punkt "%%% Mögliche Korrektur einzelner
% Größen:" kann einzelnen Variablen (insbes. abgeleiteten Größen) noch ein
% anderer Wert zugewiesen werden, z.B. nRS, um Motorstart-Übersetzungen
% nicht zu beachten, oder zur Fehlersuche.
%%% Abgeleitete Größen:
nRS = size(RS, 2); % Anzahl der Radsätze
nSE = size(SE, 2); % Anzahl der Schaltelemente
nSZ = size(SM, 1); % Anzahl der Schaltzustände (= Gänge)
% Anzahl der Wellen (= größte Zahl aus den ersten drei Zeilen von RS):
nWellen =  max(max(RS(1:3, :)));
nWellen = max([nWellen EM_Welle]); % Wenn die EM_Welle nicht direkt mit einem RS verbunden ist, könnte dies auch die größte Wellen-Nr. sein.
% Zeilen für die Matrix A in Abhängigkeit des geschlossenen Schaltelements
% vorbereiten:
SEA = zeros(size(SE, 2), nWellen);
for i1 = 1:size(SE, 2)
    if SE(1, i1) > 0
        SEA(i1, SE(1, i1)) = 1;
    end
    if SE(2, i1) > 0
        SEA(i1, SE(2, i1)) = -1;
    end
end


%%% Mögliche Korrektur einzelner Größen:
%nSZ = 9; % Möglich wäre z.B.: Zunächst sollen nur die 8 VKM-Gänge betrachtet werden.
%nSZ = 9; % nSZ = 9; --> Nur VKM-Gänge betrachten. Den 4. Gang gibt es zweimal.

%%% Berechnung der Matrix A, die das Gleichungssystem beschreibt:
% 1. Zeile von A: omega1 := 1
% Nächste Zeilen: Für jeden Radsatz einmal die Willis-Gl. hinzufügen.
% (Die Definition der Zeilen für geschlosse Radsätze erfolgt später.)

% Die Winkelgeschwindigkeit jeder Welle ist eine Unbekannte. Also muss es
% auch genausoviele Gleichungen geben, um das Gleichungssystem zu lösen:
A = zeros(nWellen); % Matrix des Gleichungssystems
b = zeros(nWellen, 1); % Rechte Seite des Gl.-Systems
% Gesuchter Lösungsvektor sind die Winkelgeschwindigkeiten.

% omega1 = 1 setzen ODER omega_EM = 1 setzen (für EM-Gänge):
% A(1,1) = 1; % Wird später definiert, um auch EM-Gänge berücksichtigen zu können.
b (1) = 1;

% Für jeden Radsatz gilt die Willis-Gleichung:
for i1 = 1:nRS
    for i2 = 1:3
        if RS(i2, i1) > 0 % Gehäuse steht fest. --> Omega0 = 0 --> Kein Eintrag in Matrix A.
         switch i2
             case 1
                 EintragInA = abs(RS(4, i1)); % Hohlrad hat Radius |i0|
             case 2
                 EintragInA = - (1+abs(RS(4, i1))); % Planetenträger hat Radius 1 + |i0| sowie negatives Vorzeichen.
             case 3
                 EintragInA = 1; % Sonnenwelle hat Radius 1.
         end
         A(i1+1, RS(i2, i1)) = EintragInA;
        end
    end
end

% Für jede geschlossene Kupplung/Bremse sind die Drehzahlen gleich:
% -- Dies erfolgt später, da sich ja bei jedem Gang die geschlossenen
% Schaltelemente ändern. --


%%% Berechnung der Lösung:
for i1 = 1:nSZ
    % Für jeden Schaltzustand/Gang die Matrix A bzgl. der geschlossenen
    % Schaltelemente vervollständigen:
    AktuelleZeileInA = nRS + 2;
    A(AktuelleZeileInA:size(A, 1), :) = 0; % Die letzten Zeilen von A wieder löschen.
    for i2 = 1:nSE
        if SM(i1, i2) == 1
            A(AktuelleZeileInA, :) = SEA(i2, :);
            AktuelleZeileInA = AktuelleZeileInA + 1;
        end
    end
    % Prüfen, ob der aktuelle Schaltzustand/Gang ein EM-Gang ist.
    % Wenn ja, dann wird omega_EM := 1 gesetzt, ansonsten gilt omega1 := 1
    A(1, :) = 0; % Die erste Zeile von Matrix A wieder löschen.
    if AktuelleZeileInA <= size(A, 1)
        % Bei EM-Gängen besagt die letzte Zeile von Matrix A: omega1 = NaN (also nicht definiert).
        A(size(A, 1), :) = 0; % Die letzte Zeile von Matrix A wieder löschen.
        b(size(A, 1)) = 0; % Den letzten Eintrag von b wieder löschen.
    end
    switch GearType(i1)
        case 1
            A(1, 1) = 1;
        case 2
            A(1, EM_Welle) = 1;
            if AktuelleZeileInA <= size(A, 1)
                A(size(A, 1), 1) = 1;
                b(size(A, 1)) = 0;
            end
    end
    % Berechnung der Winkelgeschwindigkeiten aller Wellen im aktuellen
    % Schaltzustand/Gang:
    omega = A\b;
    % Ergebnis (= alle Winkelgeschwindigkeiten im gewählten Gang) in
    % Lösungsmatrix schreiben:
    LsgMatrixOmega(:, i1) = omega;
end


%%% Lösungsmatrix für Winkelgeschwindigkeiten ausgeben:
% Jede Zeile gibt alle Winkelgeschindigkeiten der ENTSPRECHENDEN Welle an.
% Jede Spalte gibt alle Winkelgeschwindigen des GEWÄHLTEN
%   Gangs/Schaltzustands an.
%LsgMatrixOmega

%%% LsgMatrixOmega um die Übersetzungen i_VKM, i_EM und i_mm erweitern:
LsgMatrix = LsgMatrixOmega;
LsgMatrix(size(LsgMatrixOmega, 1)+1, :) = LsgMatrix(1, :) ./ LsgMatrix(Abtriebswelle, :); % i_VKM = omega1 / omega2
if EM_Welle~=0
LsgMatrix(size(LsgMatrixOmega, 1)+2, :) = LsgMatrix(EM_Welle, :) ./ LsgMatrix(Abtriebswelle, :); % i_EM = omega7 / omega2
LsgMatrix(size(LsgMatrixOmega, 1)+3, :) = LsgMatrix(EM_Welle, :) ./ LsgMatrix(1, :); % i_mm = omega7 / omega1 = i_EM / i_VKM
end
LsgMatrix;


%%% Berechnung der Drehmomente an allen Wellen und Radsätzen

% Die Anzahl der unbekannten Drehmomente berechnet sich folgendermaßen:
%   - 3 pro Radsatz (Sonne, Planetenträger, Hohlrad) --> Bei 2 RS:  6
%   - Getriebeeingang: VKM --> schon bekannt
%   - Getreibeeingang: EM  --> schon bekannt
%   - Getriebeausgang:                                              1
%   - 1 pro Schaltelement --> Bei 5 Schaltelementen:                5
%                                                                 ----
%                                                          SUMME:  12
%                                                         =============
%
% Anzahl der Gleichungen zur Lösung des Gleichungssystems:
%   - 2 pro Radsatz (Summe aller Momente = 0; Summe eingehender/ausgehender
%     Leistungen = 0) --> Bei 2 RS:                                 4
%   - 1 pro Welle (Summe aller Momente = 0) --> bei 7 Wellen:       5
%   - 1 pro OFFENES Schaltelement:
%     --> Bei 3 offenen Schaltelementen in VKM-Gängen:              3
%     --> Bei 4 offenen Schaltelementen in EM-Gängen:              (4)
%         Frage: Ist das System dann überbestimmt? --> Ich werde es sehen.
%                                                                 ----
%                                                          SUMME:  12
%                                                         =============

% Benennung der unbekannten Momente im Vektor T:
% T:  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21
%     H1 T1 S1 H2 T2 S2 GA E1 E2 E3 E4 E5
%
% Abkürzungen:
%   H1: Hohlrad von Radsatz 1
%   T1: Planetenträger/Steg von Radsatz 1
%   S1: Sonne von Radsatz 1
%   GA: Getriebeausgang, Getriebeabtrieb
%   E1: Schaltelement 1

% Definition von T_VKM und T_EM (als Symbole):
syms T_VKM T_EM real

% Festlegen der Größe von T:
%         3x Anzahl RS    Abtrieb  Anzahl Schaltelemente
LaengeT = 3.*size(RS, 2)  +  1  +  size(SE, 2);
% bT = zeros(LaengeT, 1); % Hinweis beachten.
% Hinweis: Wenn bT über zeros(...) erzeugt wird, kann später über bT(1) =
% T_VKM kein Wert mehr zugewiesen werden. Warum dies so ist, weiß ich
% nicht. Deshalb folgende "Umgehungslösung":
bT = T_VKM .* zeros(LaengeT, 1);
% Aufstellen der Matrix AT, um das Gleichungssystem AT*T=bT auflösen zu
% können und so alle gesuchten Momente T (Vektor) zu berechnen.
AT = zeros(LaengeT);

% Gleichungen/Zeilen in AT, die unabhängig vom gewählten Gang gelten,
% festlegen:
for i1 = 1:nRS
    % Für jeden Radsatz in jedem Gang gilt: Summe aller Momente = 0.
    AT(i1, (3.*(i1-1)+1):(3.*(i1-1)+3)) = 1;
end

% Nachträglich eingefügt: Kriterium (2b): T_Hohlrad + i_0 * T_Sonne = 0
for i1 = 1:nRS
    AT(nRS+i1, 3.*(i1-1)+1) = 1;
    AT(nRS+i1, 3.*(i1-1)+3) = RS(4, i1);
end

% Für jede Welle in jedem Gang gilt: Summe aller Momente = 0.
% Drehmomente, die über die Radsätze in die Wellen ein-/ausgeleitet werden:
for i1 = 1:nWellen
    for i2 = 1:3
        for i3 = 1:nRS
            if RS(i2, i3) == i1
                %  Zeile      Spalte
                AT(2.*nRS+i1, 3.*(i3-1)+i2) = 1;
            end
        end
    end
end
% Drehmomente, die über Schaltelemente in die Wellen ein-/ausgeleitet
% werden:
for i1 = 1:nSE
    %  Zeile             Spalte
    if SE(1, i1) > 0
        AT(2.*nRS+SE(1, i1), 3.*nRS + 1 + i1) =  1;
    end
    if SE(2, i1) > 0
        AT(2.*nRS+SE(2, i1), 3.*nRS + 1 + i1) = -1;
    end
end
% Berücksichtigung des Abtriebsdrehmoments auf der entsprechenden Welle.
% (I.d.R. ist dies Welle 2.)
AT(2.*nRS+Abtriebswelle, 3.*nRS+1) = 1;
% Berücksichtigung der Antriebsmomente auf den entsprechenden Wellen:
% (Aufstellen von bT um das Gleichungssystem AT*T=bT lösen zu können.)
% Konvention: Die Welle mit der VKM ist Welle 1.
% Nur, wenn es eine elektrische Maschine gibt (EM_Welle > 0), und nur, wenn
% die elektrische Maschine auf einer anderen Welle als der
% Verbrennungsmotor sitzt (EM_Welle > 1), wird das Drehmoment der
% elektrischen Maschine auf eine andere Welle übertragen.
% ("Echte" Parallelhybride mit EM_Welle = 1 werden so behandelt, dass gilt
% T_VKM (Matlab-Programm) = T_VKM (Realität) + T_EM (Realität)
% Damit für die Berechnung unterschieden wird ob ein Hybrid oder E-Gang
% vorliegt, wird in der Berechnungsschleife das VKM-Moment jeweils gesetzt oder
% nicht.
if EM_Welle > 1
    bT(2.*nRS + EM_Welle) = T_EM;
end

% Aufstellen der Gleichungen, die vom gewählten Gang abhängen, und
% Berechung der Ergebnisse:
%nSZ = 4; % nSZ = 2; (Nur zu Testzwecken)
for i1 = 1:nSZ
    % Vorbereitung: Gangabhängige Zeilen in Matrix AT löschen:
    %AT((nRS+1):(2.*nRS), :) = 0; % Nur für Kriterium (2a) verwenden. NICHT bei Kriterium (2b) verwenden.
    AT((2.*nRS+nWellen+1):size(AT, 1), :) = 0;
    % Für jeden Radsatz in jedem Gang gilt: Summe ein-/ausgehender Leistungen = 0. (= Kriterium 2a)
    % --> Dies soll ersetzt werden durch Kriterium (2b): T_Hohlrad + i_0 * T_Sonne = 0
    %for i2 = 1:nRS
    %    for i3 = 1:3
    %        if RS(i3, i2) > 0
    %            AT(nRS+i2, 3.*(i2-1)+i3) = LsgMatrix(RS(i3, i2), i1);
    %        end
    %    end
    %end
    % Für jeden Gang (zumindest für jeden VKM-Gang) gilt:
    % Kupplungsmomente offener Kupplungen = 0.
    AktuelleZeileInAT = 2.*nRS + nWellen + 1;
    for i2 = 1:nSE
        if SM(i1, i2) == 0
            %  Zeile              Spalte
            AT(AktuelleZeileInAT, 3.*nRS + 1 + i2) = 1; % --> Moment der offenen Kupplung zu null setzen.
            AktuelleZeileInAT = AktuelleZeileInAT + 1;
        end
    end
    % Setzen des VKM-Moments abhängig vom Gangtyp
    switch GearType(i1)
        case 1
            bT(2.*nRS + 1) = T_VKM;
        case 2
            bT(2.*nRS + 1) = 0;
    end
    AT
    % Lösen des Gleichungssystems AT*T=bT
    T = AT\bT;
    % Ergebnis (= alle auftretenden Drehmomente im gewählten Gang) in
    % Lösungsmatrix schreiben:
    LsgMatrixT(:, i1) = T;
end

vpa(LsgMatrixT, 5);
LsgMatrix_komplett = [LsgMatrix; LsgMatrixT];
vpa(LsgMatrix_komplett, 5)

 




Mein Programm funktioniert wenn ich es benutze ohne die GUI Tabelle. Ich habe gedacht, dass vieleicht der handles.EM_Welle = 0 Befehl wurde nicht für RS , SE, SM, und GearType funktionieren, da sie Werte aus einer Tabelle sind.


Ich wollte auch eine Tabelle herstellen, welche man konnte verschiedene Größe Matritzen erstellen, wie zum Beispiel nicht nur diese 5x5 Matrix, sondern auch zB eine 7x8 oder so. RS wird immer 4 Zeilen haben, aber mehrere Spalten sind auch möglich. GearType immer 1 Zeile, aber mehrere Spalten sind auch möglich.
Ich versuche zuerst das einfacher Programm zu schreiben, ohne Tabelle Änderüngen, aber bekomme ich diese Probleme...

Nochmals vielen dank für deine Hilfe !

Grüße
_________________

Viele Grüße,
Hermano
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.04.2016, 17:11     Titel:
  Antworten mit Zitat      
Hallo hermano,

"Klappt nicht" ist keine Beschreibung des Problems, die es erlaubt nachzuvollziehen, was genau passiert. Bitte erkläre das Problem mit Details.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
hermano
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 14.04.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2016, 10:06     Titel:
  Antworten mit Zitat      
Hi Jan,

natürlich das ist keine Beschreibung...mein Fehler!

Immer wenn ich das Programm verwende, bekomme ich die folgende Antwort:

Undefined function 'max' for input arguments of type 'cell'.

Error in gui_RS_Berechnung_1>Solve_push_Callback (line 202)
nWellen = max(max(RS(1:3, : )));

Error in gui_mainfcn (line 96)
feval(varargin{:});

Error in gui_RS_Berechnung_1 (line 42)
gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)gui_RS_Berechnung_1('Solve_push_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating uicontrol Callback



Dann denke ich, ich ein Befehl wie "cell2struct" benutzen sollte, um die Werte in den Tabellen im Programm zu haben. (hab daran gedacht wegen den Fehler, der sagt "max" ist keine Funktion bei der GUI).

Ich kann auch nich verstehen, was ist mit dem Fehler "feval (varargin)" los....

Auf jeden Fall, danke für die Zeit und Hilfe
_________________

Viele Grüße,
Hermano
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.04.2016, 23:19     Titel:
  Antworten mit Zitat      
Hallo hermano,

Code:
Value = cell2mat(RS(1:3, : ));
nWellen = max(Value(:));


In "feval(varargin{:})" gibt es gar keinen Fehler, sondern Matlab gibt die Kette von Befehlen an, auf der man zu der Zeile mit dem Error kam. Das ist der "Calling Stack".

Das Posten der Fehlermeldung hätte hier also ausgereicht. Kompakte Fragen werden häufiger gelesen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.