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

Com-Schnittstellenprotokoll unverständlich

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 13.02.2015, 19:52     Titel: Com-Schnittstellenprotokoll unverständlich
  Antworten mit Zitat      
Liebe Leute,

zur Weiterverarbeitung der Daten eines VC960-DMM würde ich gern selbige über die COM-Schnittstelle einlesen. Das einzige, was ich als Doku hierzu finde ist

http://www.produktinfo.conrad.com/d.....t_Protokoll_VC960_DMM.pdf

Nun habe ich das Gerät auf "Send" gestellt und folgendes versucht:

Code:

s = serial('com7');
set(s, 'DataBits', 8);
set(s, 'Parity', 'Odd');
set(s, 'StopBits', 1);
set(s, 'BaudRate', 2400);
set(s, 'Timeout', 2);

fopen(s);

   while s.Bytesavailable==0
   pause(0.5);
   end

   a = fread(s);

fclose(s);
 


Ein Verändern des Timeouts bringt auch nichts und ich erhalte nur die Meldung:

Zitat:

Warning: Unsuccessful read: The specified amount of data was not returned within the Timeout period.


Leider kapiere ich auch das Protokoll nur teilweise. Da das Gerät auf "Send" gestellt ist, gehe ich mal davon aus, dass ich nicht erst eine Anfrage schicken muss (abgesehen davon, dass für mich auch nicht ersichtlich ist, wie dieser Anfragestring lauten sollte). Ich vermute, dass die Schnittstelle noch nicht korrekt modifiziert ist. Auch über TeraTerm erhalte ich keine Daten.

Hat jemand einen Tipp für mich? Seitens des Verkäufers wurde mir mitgeteilt, dass es keine weitere Doku hierzu gibt.

Beste Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen


pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 13.02.2015, 23:08     Titel:
  Antworten mit Zitat      
Ich habe jetzt herausgefunden, dass mit folgenden zusätzlichen Einstellungen etwas empfangen wird:

Code:

set(s, 'DataTerminalReady', 'on')
set(s, 'RequestToSend', 'off')
 


Allerdings verstehe ich die Datenstruktur nicht. Offensichtlich sind die Daten in hex zu wandeln. Als Beispiel von 22 eingelesenen Werten erhalte ich:

Zitat:

3F
B0
38
B5
3F
B3
32
B0
3F
B3
B0
34
0D
3F
8A
3F
B0
38
3F
B5
B3
B3


Nun findet sich unter

[url]
http://blog.dest-unreach.be/2009/05.....otocol-reverse-engineered
[/url]

ein *.pl-file, welches die Daten dekodiert. Leider verstehe ich es nicht. Kann mir am folgenden Beispiel jemand die Vorgehensweise erläutern, damit ich es in Matlab umsetzen kann?

Zitat:

# % of 4-20mA measurement
my @digit = map { tr/ac/ L/; $_; } @_[1,3,5,7,9];
my $value = "";
my $decimal_point = 3; # fixed point
my $negative = (($_[17] & 0x04) == 0x04 ? 1 : 0);
print STDERR "WARNING: negative percentage is impossible\n" if $negative;
$value = ($negative ? "-" : " ");
$value .= join('', @digit[0..$decimal_point-1]);
$value .= ".";
$value .= join('', @digit[$decimal_point..$#digit]);

print "$value mA%\n";
},


Über Rückantwort freue ich mich jederzeit.

Beste Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn es sich um ein Perl-Skript handelt, dann kannst du das direkt aus MATLAB heraus ausführen:
http://de.mathworks.com/help/matlab/ref/perl.html

Erklären kann ich es leider nicht, da ich keine Ahnung von Perl habe.

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

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 14.02.2015, 11:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Leider bekomme ich nach

Code:
result = perl('receive.pl')


folgende Fehlermeldung:

Zitat:
Error using perl (line 80)
System error: Can't locate Device/SerialPort.pm in @INC (@INC contains: C:/Program Files
(x86)/MATLAB/R2012a/sys/perl/win32/site/lib C:/Program Files
(x86)/MATLAB/R2012a/sys/perl/win32/lib .) at receive.pl line 6.
BEGIN failed--compilation aborted at receive.pl line 6.
Command executed: perl receive.pl


Was bedeutet das? Findet er den Port nicht? Muss ich vielleicht neben dem Aufruf auch noch diverse Argumente übergeben?

Viele Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 14.02.2015, 15:59     Titel:
  Antworten mit Zitat      
Ich bin jetzt schon viel viel weiter. Folgenden Code konnte ich am Gerät schon erfolgreich testen:

Code:

function [messwert] = vc960_auslesen(com, n_messungen)
clc
% Funktion zum Auslesen des DMM VC960 Voltcraft
% Beispielaufruf: [messwert] = vc960_auslesen('com7', 10)

% Initialisierung der Schnittstelle
s = serial(com);
    set(s, 'DataBits', 8);
    set(s, 'Parity', 'Odd');
    set(s, 'StopBits', 1);
    set(s, 'BaudRate', 2400);
    set(s, 'Timeout', 2);
    set(s, 'DataTerminalReady', 'on')
    set(s, 'RequestToSend', 'off')
% Öffnen der seriellen Schnittstelle
fopen(s);

% Vorbelegung
messwert = zeros(1,n_messungen);
zeit = zeros(1,n_messungen);
% Zeitmessung starten
tic

for i = 1:n_messungen
    out_dec = fread(s,11);
    out_bin = dec2bin(out_dec);
    % Messgröße und Messbereich abfragen
    type_of_measurement = bin2dec(out_bin(7, 5:end));
    range_of_measurement = bin2dec(out_bin(6, 5:end));
    switch type_of_measurement
        case 0
            type_of_measurement = 'AC_mV';
        case 1
            type_of_measurement = 'DCV';
            switch range_of_measurement
                case 1
                    range_of_measurement = 1/10000;
                    disp('Range: 4 V')
                case 2
                    range_of_measurement = 1/1000;
                    disp('Range: 40 V')
                case 3
                    range_of_measurement = 1/100;
                    disp('Range: 400 V')
                case 4
                    range_of_measurement = 1/10;
                    disp('Range: 1000 V')
            end
        case 2
            type_of_measurement = 'ACV';
            switch range_of_measurement
                case 1
                    range_of_measurement = 1/10000;
                    disp('Range: 4 V')
                case 2
                    range_of_measurement = 1/1000;
                    disp('Range: 40 V')
                case 3
                    range_of_measurement = 1/100;
                    disp('Range: 400 V')
                case 4
                    range_of_measurement = 1/10;
                    disp('Range: 750 V')
            end
           
        case 3
            type_of_measurement = 'DC_mV';
            switch range_of_measurement
                case 0
                    range_of_measurement = 1/100;
                    ordinate = 'U in mV';
                    disp('Range: 400 mV')
            end
        case 4
            type_of_measurement = 'Ohm';
        case 5
            type_of_measurement = 'nF';
        case 6
            type_of_measurement = 'C';
        case 7
            type_of_measurement = 'uA';
        case 8
            type_of_measurement = 'mA';
            switch range_of_measurement
                case 0
                    range_of_measurement = 1/1000;
                    disp('Range: 40 mA')
                case 1
                    range_of_measurement = 1/100;
                    disp('Range: 400 mA')
            end
        case 9
            type_of_measurement = 'A';
        case 10
            type_of_measurement = 'Fm';
        case 11
            type_of_measurement = 'Diode';
        case 12
            type_of_measurement = 'Hz';
        case 13
            type_of_measurement = ' ';
        case 14
            type_of_measurement = 'unspecified';
        case 15
            type_of_measurement = '%4-20mA';
    end
    disp(type_of_measurement)
    % Status abfragen
    state_acdc = out_bin(8, 5:end);
    if strcmp(state_acdc, '0000')
        state_acdc = 'OFF';
    elseif strcmp(state_acdc, '0001')
        state_acdc = 'AC';
    elseif strcmp(state_acdc, '0010')
        state_acdc = 'DC';
    elseif strcmp(state_acdc, '0011')
        state_acdc = 'AC+DC';
    else
        disp('String nicht definiert.')
        return
    end
    disp(state_acdc)
    % Vorzeichen abfragen
    vorzeichen = out_bin(9, 5:6);
    if strcmp(vorzeichen, '00')
        vorzeichen = '+';
    elseif strcmp(vorzeichen, '01')
        vorzeichen = '-';
    end
    zahlenwert = bin2dec(out_bin(1:5, (5:end)));
    % Zusammensetzen des Messwertes aus Vorzeichen, Zahlenwert und
    % Kommastelle
    messwert(i) = str2double([num2str(vorzeichen) num2str(zahlenwert(1)) num2str(zahlenwert(2)) num2str(zahlenwert(3)) num2str(zahlenwert(4)) num2str(zahlenwert(5))]) * range_of_measurement;
    zeit(i) = toc;
    % Datenplot
    plot(zeit, messwert, 'ko-')
    grid
    xlabel('t in s')
    ylabel(ordinate)
    title('Zeitverlauf')
    drawnow
end

disp('Messung erfolgreich durchgeführt.')
% Schließen der seriellen Schnittstelle
fclose(s);


Für Hinweise zur eleganteren Umsetzung bin ich jederzeit dankbar:

- das Zusammensetzen des Messwertes geht sicher besser, sicher auch mein Hin- und Herwandeln der Daten
- wie kann ich diese Funktion in Dauerschleife laufen lassen und durch einen Tastendruck (z. B. ESC) beenden?

Viele Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich würde eine kleine GUI dafür bauen. Dann kann man nach Belieben die Messung starten und beenden, die Daten weiterverarbeiten etc.

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

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 16.03.2015, 12:21     Titel:
  Antworten mit Zitat      
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.