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

Mehrere Matlab-Funtkionen gleichzeitig

 

janh
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2014, 13:25     Titel: Mehrere Matlab-Funtkionen gleichzeitig
  Antworten mit Zitat      
Hallo zusammen,

ich habe leider noch nicht so viel Erfahrung mit Matlab und komme deswegen gerade nicht weiter. Embarassed

Ich habe eine GUI erstellt, bei der über einen Startknopf mehrere Funktionen gestart werden sollen. Die gestarten Funktionen sollen gleichzeitg laufen.

So soll z. B. beim Drücken des Startbutton die Funktion "sende Triggersignal" und die Funktion "abfrage Messinstrument" gestartet werden.
Die Funktion "sende Triggersignal" sendet kontinuierlich ein Signal an ein Messgerät, gleichzeitig soll "abfrage Messinstrument" das Messgerät nach Messwerten abfragen lassen.
Über einen Stopbutton sollen die beiden Funktion ggf. beendet werden können.

Ich habe schon das Forum und die Matlab-Hilfe durchsucht, bin aber leider nur auf die Parallel Computing Toolbox gestoßen. In der Toolbox finde ich leider irgendwie keinen Befehl der auf meine Anwendung zutrifft.

Könnt ihr mir da vielleicht jemand weiterhelfen?

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.05.2014, 20:37     Titel:
  Antworten mit Zitat      
Hallo,

die Parallel Computing Toolbox ist die Toolbox schlechthin für die gleichzeitige Ausführung mehrerer Programme.

Welche Befehle hast du dir angesehen, und inwiefern leisten sie nicht das, was du benötigst?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 11:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

Vielen Dank für deine Antwort.

Habe mir die Batch-Funktion angeschaut und ausprobiert. Die Funktion wirkt beim ausprobieren etwas träge bzw. Funktion innerhalb der der Batch-Funktion werden Funktionen relativ langsam ausgeführt. Kann es sein oder kommt es nur mir so vor?

Wei? leider nicht welche Funktione:

    batch
    createjob
    spmd
    parfo


Die optimale Lösung für meinen Fall ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.05.2014, 11:16     Titel:
  Antworten mit Zitat      
Hallo,

mit batch müssen zunächst weitere MATLAB-Sitzungen gestartet werden. Danach sollte alles flott laufen.

Was ich versuchen würde:

Code:
parpool(2) % in älteren MATLAB-Versionen matlabpool verwenden
while (stop nicht gedrückt)
spmd
switch labindex
case 1
% sende Triggersignal
case 2
% abfrage Messinstrument
end
end


Die andere Frage ist natürlich, ob das Messgerät überhaupt von zwei Prozessen gleichzeitig angesteuert werden kann.

Zu Parallel Computing gibt es auch eine Tutorial-Reihe:
http://www.mathworks.de/products/pa.....-computing/tutorials.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 20:51     Titel:
  Antworten mit Zitat      
Hallo,

werde dein Vorschlag mal versuchen. Leider kann ich es erst am Montag machen.

Hab mal mir auch die Tutorial-Reihe angeschaut. Die batch-Funktion ist eigentlich schon das ich bräucht: Ich stecke z. B. eine Funktion in eine eigene Matlab-Sitzung. Die Matlab-Sitzung läuft dann so lange, bis die Sitzung beendet wird.

Ist dann wie bei C++ und der Thread bildung.. oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.05.2014, 21:43     Titel:
  Antworten mit Zitat      
Hallo,

den Nachteil bei batch sehe ich darin, dass du während des Batch-Jobs schlecht von außen abbrechen kannst - außer du brauchst keine Ergebnisse mehr von dort, dann kannst du den Batch-Job mit delete "abschießen".
Batch-Jobs in einer for-Schleife (ähnlich wie bei meinem Vorschlag mit spmd) wären nicht sinnvoll, da die MATLAB-Sitzungen ja jedes Mal von neuem gestartet werden müssen.
Meine Tendenz ginge zum spmd-Ansatz.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 22:33     Titel:
  Antworten mit Zitat      
hmmm...

ich könnte die batch am Anfang des Programms initialisieren. In der batch läuft dann eine Schleife zum abfragen der Messwerte. Am Ende Programms lasse ich mir dann Messwerte zurückgegeben und beende die batch.

Müsste doch gehen oder?

Harald, vielen Dank für deine Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.05.2014, 22:40     Titel:
  Antworten mit Zitat      
Hallo,

du hast anfangs geschrieben:
Zitat:
Über einen Stopbutton sollen die beiden Funktion ggf. beendet werden können.

Die Information, ob der Stopbutton gedrückt wurde, dürfte innerhalb der batch-Session aber schwer zugänglich sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 22:44     Titel:
  Antworten mit Zitat      
Meinst du mit "schwierig" unmöglich oder nur schwierig? Smile

Ich mache mal eine Beispiel und probier es auch aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2014, 15:06     Titel:
  Antworten mit Zitat      
Hallo,

habs heute noch mit einer anderen Möglichkeit probiert und zwar mit "createJob" und "Task".

Habe dafür beim Programmstart einen Job intialisiert:

Code:

global c
global j

c = parcluster;
j = createJob(c);
 


Bei beim Startbutton drücken wird ein Funktion mit einem Task ausgeführt:

Code:
function fctMeasuring(handles, typeMeasuring)

t = createTask(j, @fctQuery, 1,{handles});    
submit(j);

while(get(handles.pushStopMeasuring,'Value') == 0)
 function TfctTriggersignal(); %Ruft Funktion für Triggersignal auf
end

wait(j);
taskoutput = fetchOutputs(j);

disp(taskoutput);
delete(t);

 



Function für die Abfrage der Messwerte, die in dem Task gestartet wird (ist ein Test ob der Task beim drücken der Stoptaste beendet wird)

Code:

function d = fctQuery(handles)
a = 0
b = 0

while (get(handles.pushStopMeasuring,'Value') == 0)  
 a = b +10;
end

d = a;
 




Es funktioniert leider nicht Sad Ist es überhauptmöglich von außen auf den Task zuzugreifen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.05.2014, 18:02     Titel:
  Antworten mit Zitat      
Hallo,

genau das meinte ich. Dir muss klar sein, dass die Tasks separate Prozesse sind, die theoretisch sogar auf anderen Rechnern laufen könnten.

Die einzige Möglichkeit, die ich sehen würde: bei Stopbutton eine Datei schreiben, und in der Task abfragen, ob die Datei schon erstellt ist. Das funktioniert aber nur auf einem Rechner bzw. bei Rechnern, die ein gemeinsames Netzlaufwerk oder ähnliches haben.

Aber sag mal: was hält dich denn davon ab, den spmd-Ansatz zu verwenden?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2014, 20:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die Bestätigung, dann brauch ich nicht mehr probieren irgendwelche Werte an den Task zu geben.

Mit deinem spmd-Ansatz habe ich es leider noch ned Probiert. Ich müsste in z. B. in case 1 eine Funktion aufrufen können:

Code:
timeTriggerHigh = 0.05 % 0.05 sec
timeTriggerLow = 0.025 % 0.025 sec


Code:
function triggersignal()

while (Bedienung== true)
    putvalue(dio.Line(1:2),pluseTriggerHigh);
    pause(timeTriggerHigh);
    putvalue(dio.Line(1:2),pluseTriggerLow);
    pause(timeTriggerLow);  
end


Möchte damit ein kontinuierliches Rechtecksignal erzeugen und das dann gleichzeitig aber wieder abfragen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.05.2014, 20:42     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Mit deinem spmd-Ansatz habe ich es leider noch ned Probiert.

Dann mach das doch mal :)

Zitat:
Ich müsste in z. B. in case 1 eine Funktion aufrufen können:

Kannst du ja. In case 1 kann alles stehen, was du willst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2014, 21:18     Titel:
  Antworten mit Zitat      
Zitat:

Dann mach das doch mal Smile



Ich werde es morgen probieren Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
janh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 26.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2014, 09:10     Titel:
  Antworten mit Zitat      
Schau mir gerade den spmd-Anschatz an.

Code:
parpool(2) % in älteren MATLAB-Versionen matlabpool verwenden
while (stop nicht gedrückt)
spmd
     switch labindex
                case 1
                % sende Triggersignal
                case 2
                % abfrage Messinstrument
      end
end


Nur zum Verständnis für mich. Mit der spmd Funktion wird dem Worker 1 und dem Worker 2 jeweils die die switch-Anschweisung zugewiesen und je nach Worker-Nummer wird case 1 oder case 2 ausgeführt . Dies wird so lange gemacht bis Stop gleich z. B. false.

Worker 1:
Code:
switch labindex
                case 1
                % sende Triggersignal
                case 2
                % abfrage Messinstrument
      end
 

Führt case 1 aus

Worker 2:
Code:
switch labindex
                case 1
                % sende Triggersignal
                case 2
                % abfrage Messinstrument
      end

Führt case 2 aus

Start ich dann immer neue Task in dem Job? Denke ich da richtig?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.