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

Compiler, Data Aquisition Toolbox, AD-Karte + Labwindows

 

signalspy
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 09:47     Titel: Compiler, Data Aquisition Toolbox, AD-Karte + Labwindows
  Antworten mit Zitat      
Auf einem Mess-PC sollen mit Hilfe einer AD-Wandlerkarte (ADLINK DAQ-2016) Messdaten erfasst (2Kanäle + externer Trigger) und ausgewertet werden. Die Parametrierung, Messung und Datenanalyse soll mit Matlab erfolgen. Auf dem Mess-PC ist jedoch kein Matlab installiert. Die Matlab-Anwendung wird auf einem Entwicklungs-PC realisiert und mit dem Matlab-Compiler als C Shared Libary (dll) übersetzt. Diese dll wird dem Mess-PC zur Verfügung gestellt und dort mittels einer StandAlone Applikation angesteuert. Diese Applikation ist mittels LabWindows/CVI 2010 (National Intruments) generiert worden.

Der ADLINK-Treiber wurde sowohl auf dem Mess-PC als auch auf dem EntwicklungsPC installiert.
Matlab Info vom Entwicklungs-PC: ADLINK_INFO = AdaptorDllName: 'C:\ADLINK\DAQ-MTLB\DLL\mwADLINK.dll', AdaptorDllVersion: '1, 3, 0, 0'

Wird die Matlab Funktion zu einer Standalone Applikation (.exe) übersetzt, läuft diese wie gewünscht auf dem Mess-PC.
Wird die gleiche Matlab-Funktion jedoch als dll übersetzt, so tritt beim Aufruf der dll ein Fehler auf.

Fehler:
Die LabWindows-Applikation tritt ordnungsgemäß in die übersetzte Matlab-dll ein, konfiguriert die ADLINK-Karte und löst m.E. eine Messung aus (Matlab Code Zeile 27 start(ai_device))
Im darauffolgenden try-catch Gebilde springt das Programm in den catch-Pfad (Matlab Code Zeile 37: „Timeout“) und die Messung bricht ab. In der LabWindows-Applikation gibt die Matlab-Funktion den entsprechenden Rückgabewert aus.
Dieser Fehler tritt immer dann auf, wenn man die Applikation direkt aus der Entwicklungsumgebung (LabWindows) heraus startet. (Compile+Run)
Erzeugt man aus LabWindows eine exe und startet dann diese direkt, so funktioniert die Anwendung ordnungsgemäß.

Die nicht ideale Konstellation Matlab, Adlink und LabWindoes ist leider so vorgegeben.
Wer hat eine ähnliche Anwendung schon einmal zum laufen gebracht? Wäre toll, wenn mir hier jemand weiterhelfen könnte.

Umgebung:
Entwicklungs-PC:
Windows XP Prof. 32Bit SP3.
Matlab R2011a mit MatlabCompiler 4.15 und Data Aquisition Toolbox 2.18

Mess-PC:
Windows XP Prof. 32Bit SP3.
ADLINK DAQ-2016
Development System: National instruments LabWindows/CVI 2010

Code:

Code:
function  ret = f_callADlink(N)
ret=0;
retstr= ' ';

N=1000;
SR=1000;
Range=5;

try
    ai_device = analoginput('mwadlink', 0);
catch
    errordlg('no ADC card found!','Error');
    ret = -1;
    retstr= 'no card found';
end

if ret == 0,
    ai_channel0 = addchannel(ai_device, 0);
    ai_channel1 = addchannel(ai_device, 1);
   
    set(ai_channel0, 'InputRange', [-Range Range]);
    set(ai_channel1, 'InputRange', [-Range Range]);
   
    try
        set(ai_device, 'SampleRate', SR);
        set(ai_device, 'SamplesPerTrigger', N);
        start(ai_device);
    catch
        errordlg('System error or this card not support!','Error');
        ret = -2;
        retstr= 'card not support';
    end
end
if ret == 0,
    try
        wait(ai_device, 20);
    catch
        errordlg('Timeout!','Error');
        ret = -3;
        retstr= 'Timeout';
    end
end
if ret == 0,
    data = getdata(ai_device);
else
    stop(ai_device);
    ret = -4;
    retstr= 'Daten nicht abgeholt';
end

delete (ai_channel0);
delete (ai_channel1);

clear ai_channels;
delete (ai_device);
clear ai_device;

if ret == 0,
    t = (0:N-1)*1/SR;
    ch1 = data(:,1)';
    ch2 = data(:,2)';
   
    figure(1)
    hold('off')
    plot(t,ch1,'r')
    grid('on'), hold('on')
    plot(t,ch2,'k')
    xlabel('t [s]')
    ylabel('U [V]')
else
    errordlg(['return: ' num2str(ret) ' (' retstr ')' ' N=' num2str(N)],'Error');
end

 
Private Nachricht senden Benutzer-Profile anzeigen


guy incognito

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 10:35     Titel: Einige Gedanken
  Antworten mit Zitat      
Hallo,

Ich kenne mich leider nicht mit der LabWindows Umgebung aus.
Es hört sich aber danach an, als würde das Compile + Run in einer Art Debug Mode ablaufen. Kann es sein, dass LabWindows versucht die Kommunikation mit dem externen Gerät zu überwachen/zu loggen und dadurch ein timeout verursacht? Es funktioniert ja außerhalb der LabWindows Umgebung.

Kann man Einstellungen vornehmen, die den Compile + Run Modus betreffen? Wenn ja welche? Ein Screenshot der Einstellungsmöglichkeiten würde auch helfen. Welche Aussagen gibt es von NI bezüglich des Ablaufs von Compile + Run? Es scheint ja etwas anders zu sein im Gegensatz zum Start außerhalb der LabWindows Umgebung.
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 06.07.2011, 10:35     Titel:
  Antworten mit Zitat      
Hallo,

ein solches System habe ich leider nicht zum ausprobieren. Ein Tipp, der (vielleicht) helfen könnte: in der kompilierten Anwendung ist nicht immer leicht rauszubekommen, was nun schief gegangen ist.
Hilfreich war mir dabei schon häufiger folgendes Vorgehen: in der catch-Anweisung den Fehler speichern und in MATLAB anschauen, d.h.
Code:

try
  wait(ai_device, 20);
catch ME
  save('C:\temp\errormsg.mat', 'ME');
  errordlg('Timeout!','Error');
  ret = -3;
  retstr= 'Timeout';
end
 

und dann in MATLAB nachher einladen. Hier allerdings wird nicht viel zu holen sein, denn dass der Fehler zwei Zeilen höher auftritt, ist ziemlich eindeutig. Vielleicht aber sagt die Fehlermeldung in ME irgendwas, was hilfreich ist ...

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
signalspy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 12:12     Titel:
  Antworten mit Zitat      
Vielen Dank für die prompte Antwort

@ guy incognito:

Aussagen von NI zum Debug-Ablauf liegen mir (noch) keine vor.

Das Labwindows die AD-Karte überwacht ist eher unwahrscheinlich. Strenggenommen "weis" die LabWindows-Umgebung nichts von der Karte. Die Steuerung übernimmt die Matlab-dll vollständig über das "ai_device"-Objekt.

Den compile/build prozess kann man beeinflussen (siehe Anhang), aber leider kenne ich mich hier zu wenig aus. Eine Idee?

@ titus: save exception wird gleich getestet...

build_options.PNG
 Beschreibung:

Download
 Dateiname:  build_options.PNG
 Dateigröße:  75.82 KB
 Heruntergeladen:  670 mal
target-setting.PNG
 Beschreibung:

Download
 Dateiname:  target-setting.PNG
 Dateigröße:  32.5 KB
 Heruntergeladen:  640 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
signalspy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 07:41     Titel:
  Antworten mit Zitat      
Hallo titus,

vielen dank für den catch-Tip.
Hat mich auf eine heiße Spur gebracht. Der Timer in wait läuft einfach aus, bevor das ai_device-Objekt "fertig" ist (siehe unten). Offenbar läuft die LabWindows Apllikation im compile+run-Modus wesentlich langsamer als die exe-Version (was ja auch irgendwie einleuchtet, da die Debug-Funktionalität wegfällt). Der Fehler tritt nicht mehr auf, wenn ich die Intialisierung, Start und Auslesen innerhalb der Matlab-Funktion als Statutsmaschine realisiere, die ich über LabWindows steuere. Dazu sind die relevanten Objekte persistent ausgeführt. Im Status 1 wird das ai_device erzeugt, im Status 2 initialisiert, Status 3 startet eine Messung, Startus 4 liest die Daten aus usw.
Warum der Timer in der Compile+Run Version genau zuschlägt, erschließt sich mir noch nicht, aber immerhin habe ich jetzt ein lauffähiges System. Very Happy

Vielleicht hat ja jemand eine ähnliche Erfahrung gemacht, damit klar wird, was genau hier die Ursache ist?


Code:
% catch message
Properties:
    identifier: 'daq:wait:timeout'
       message: 'WAIT reached its timeout before OBJ stopped running.'
         cause: {}
         stack: [2x1 struct] : D  : D
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 - 2025 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.