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

srl_write in Funktion aufrufen in OctaveGUI

 

Axel_S
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2018, 11:52     Titel: srl_write in Funktion aufrufen in OctaveGUI
  Antworten mit Zitat      
Hallo,

ich habe eine Frage zum srl_write Befehl in einer Octae GUI.
Die GUI habe ich nach Vorlage von http://www.gomatlab.de/gui-in-octave-erstellen-t44037.html aufgebaut. Funktioniert auch soweit. Die Funktionen srl_write srl_read etc habe ich nach Vorlage von https://www.google.de/url?sa=t&.....Vaw0mPvDHrFrkDIlMhGyXkwIX aufgebaut. Funktioniert soweit auch.

Wenn ich aber beides zusammen nutzen möchte geht es nicht mehr Sad
Ich habe folgendes Minimalbeispiel erstellt:

Code:

pkg load instrument-control

figure('NumberTitle','off', ...   % don't show the figure and number
             'Resize','off', ...
             'NumberTitle','off', ...
             'Name','Test GUI', ... %
            'Resize','on', ...
             'toolbar', 'none', ...
         'Color','white',...
         'Position',get(0, 'screensize')- [0 -40 0 90]);

         
h.ax = axes ('position', [0.05 0.45 0.5 0.4],'fontsize',15);                                        
                   
# Initialisieren der Geräte ____________________________________________________                  
com_WIKA = serial("\\\\.\\COM5");
pause(0.2);
% Set the port parameters
set(com_WIKA, 'baudrate', 9600);     % See List Below
set(com_WIKA, 'bytesize', 8);        % 5, 6, 7 or 8
set(com_WIKA, 'parity', 'n');        % 'n' or 'y'
set(com_WIKA, 'stopbits', 1);        % 1 or 2
set(com_WIKA, 'timeout', 20);
srl_flush(com_WIKA);
           
#_______________________________________________________________________________
       
function start_kalibration(obj,com_WIKA)  
 
  srl_write(com_WIKA,"S  02820\r\n"); % Sollwert setzen
  srl_write(com_WIKA,"GO\r\n");         % Pumpe anschalten


  fclose(com_WIKA);
end  
                           
h.print_pushbutton = uicontrol ('style', 'pushbutton',
                                'units', 'normalized',
                                'string', 'Starte Kalibrierung',
                                'callback', @start_kalibration,
                                'position', [0.6 0.45 0.35 0.09]);                                                      


guidata (gcf, h);
 


Leider erhalte ich aber immer folgenden Fehler wenn ich in der GUI auf den Knopf "Starte Kalibrierung" drücke:
Code:
error: Invalid call to srl_write.  Correct usage is:

 -- Loadable Function: N = srl_write (SERIAL, DATA)
execution error in graphics callback function


Wenn ich die einzelnen Codezeilen nacheinander außerhalb der Funktion ausführe (F9), tut das Gerät was es soll. Wenn ich die Initialisierung mit in die Funktion einbinde auch. Warum ich den Serialhandle nicht einfach übergeben kann, verstehe ich nicht.

Hat jemand eine Idee?

Danke und Gruß,
Axel
Private Nachricht senden Benutzer-Profile anzeigen


StephanIIe

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2018, 12:34     Titel: versuch es mit guidata nochmal.
  Antworten mit Zitat      
Hi,

du kannst das COMport handle auch in guidata speichern da dieses handle nicht
global ist, ist es in der callbackfunktion unbekannt, versuch es mal so:
Code:

pkg load instrument-control

figure('NumberTitle','off', ...   % don't show the figure and number
             'Resize','off', ...
             'NumberTitle','off', ...
             'Name','Test GUI', ... %
            'Resize','on', ...
             'toolbar', 'none', ...
         'Color','white',...
         'Position',get(0, 'screensize')- [0 -40 0 90]);

         
h.ax = axes ('position', [0.05 0.45 0.5 0.4],'fontsize',15);                                        
                   
# Initialisieren der Geräte ____________________________________________________                  
h.com_WIKA = serial("\\\\.\\COM5"); % diese COMPORT Handle auch als guidata speichern
pause(0.2);
% Set the port parameters
set(h.com_WIKA, 'baudrate', 9600);     % See List Below
set(h.com_WIKA, 'bytesize', 8);        % 5, 6, 7 or 8
set(h.com_WIKA, 'parity', 'n');        % 'n' or 'y'
set(h.com_WIKA, 'stopbits', 1);        % 1 or 2
set(h.com_WIKA, 'timeout', 20);
srl_flush(h.com_WIKA);
           
#_______________________________________________________________________________
       
function start_kalibration(obj,com_WIKA)  
  h = guidata (gcf); % die guidata daten in die funktion holen
  srl_write(h.com_WIKA,"S  02820\r\n"); % Sollwert setzen
  srl_write(h.com_WIKA,"GO\r\n");       % Pumpe anschalten

  % nachfolgend musst du überlegen wenn du fclose machst das handle danach mit delete( h.com_WIKA) und
  % h = rmfield(h,'com_WIKA'); aus h zu entfernen, und später neu öffnen und in h neu anlegen usw.
  fclose(h.com_WIKA);
  guidata (gcf, h); % h zurückspeichern für den nächsten oder anderen aufruf in einer Funktion
end  
                           
h.print_pushbutton = uicontrol ('style', 'pushbutton',
                                'units', 'normalized',
                                'string', 'Starte Kalibrierung',
                                'callback', @start_kalibration,
                                'position', [0.6 0.45 0.35 0.09]);                                                      


guidata (gcf, h);  


es gibt aber noch eine 2 Möglichkeit userdaten zu speichern mit userdata(h,xx)

Gruß

Stephan
 
AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2018, 18:01     Titel:
  Antworten mit Zitat      
Die Funktionsdeklaration
Code:
start_kalibration(obj,com_WIKA)


Bekommt beim Aufruf durch den Callback ein Event als zweiter Parameter (siehe Doku, das kann z.B. gedrückter Mausbutton sein)

Willst du "com_WIKA" bis in den callback durchreichen mache es wie von Stehan gezeigt mit guidata oder du kannst auch "userdata" der figure verwenden

Oder du machst com_WIKA global, was aber IMHO dirty wäre

Gruß Andy, happy hacking
 
Axel_S
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2018, 11:07     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Infos. Hat geklapt.

Viele Grüße,
Axel
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.