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

Lesen einer *.vcd file in Simulink/ Matlab

 

Hammy_1703

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 11:38     Titel: Lesen einer *.vcd file in Simulink/ Matlab
  Antworten mit Zitat      
Seit gegrüßt,

ich möchte gern eine *.vcd file in Simulink als Eingabeparameter nutzen.
dabei sieht die Datei folgendermaßen aus:

Code:

$date
   Wed Oct 25 11:34:09 2017
$end
$version
   GTKWave Analyzer v3.3.83 (w)1999-2017 BSI
$end
$timescale
   1ns
$end
$scope module RaspiTracer $end
$var real 1 " Temperature $end
$upscope $end
$enddefinitions $end
$dumpvars
#1502892707426292
r293 "
#1502892707481317
r295 "
#1502892707526267
r297 "
#1502892707582158
r298 "


Dabei entspricht die "# Zeile" der Zeit in ns und die Zeile mit dem Buchstaben "r" einem Temperaturmesswert. Das Entfernen des Headers sollte soweit nicht das Problem sein. Jedoch das Anordnen der Zeilen zu jeweiligen Spalten gestaltet sich sehr schwierig. Hat vll. jmd. einen Ansatz?
Grüße


Harald
Forum-Meister

Forum-Meister


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

ich würde es mit einer Schleife über fgetl-Statements versuchen.
Hast du denn schon etwas versucht? Kannst du den Code dazu posten und die Probleme, die dabei aufgetreten sind?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 12:14     Titel:
  Antworten mit Zitat      
Die Kopfzeile würde ich so entfernen und entprechend zwei Spalten für die Werte definieren.
Code:

%Kopfzeilen entfernen
fmt = repmat('%f',1,2);
fid = fopen('test.csv.vcd','rt');
datacell = textscan(fid, fmt,'Delimiter',',','HeaderLines',14,'CollectOutput',1);


Dann hört es allerdings bereits auf mit der Kenntnis. Confused
 
Harald
Forum-Meister

Forum-Meister


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

meine Empfehlung ist wie gesagt fgetl. Auf die Schnelle:

Code:
fid = fopen('test.csv.vcd');
for k = 1:14
    fgetl(fid);
end

t = [];
Temp = [];
while ~feof(fid)
    timerow = fgetl(fid);
    t = [t; str2double(timerow(2:end))];
    temprow = fgetl(fid);
    Temp = [Temp; str2double(temprow(2:end-2))];
end    
fclose(fid);


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 13:35     Titel:
  Antworten mit Zitat      
Vielen Dank Harald, es funktioniert super.

Allerdings würde ich es auch gern verstehen wollen.
Code:


t = [];                                                   % Array für die Zeit
Temp = [];                                            % Array für die Temp
while ~feof(fid)                                      % prüfen ob noch Zeilen da sind
    timerow = fgetl(fid);                           % festlegen des Zeileninhalts : Zeit
    t = [t; str2double(timerow(2:end))];    % ???
    temprow = fgetl(fid);                          % festlegen des Zeileninhalts : Temp
    Temp = [Temp; str2double(temprow(2:end-2))];    % ???

 


Werden jetzt alle ungeraden Zeilen der Zeit und alle Geraden der Temperatur zugeordnet?
" " " die Anführungsstriche sind in diesem Fall der Identifier für die Temperatur. Wenn nun aber beispielsweise eine weitere Zeile sporadisch mit einem anderen Messwert, in der Datei, auftauchen würde.

Beispiel:
Code:


#1502892726182087    % timestamp
r301 "0                        % Messwert 1  "0
r0 "1                            % Messwert 2  "1
#1502892726182090    % timestamp
r304 "0                        % Messwert 1  "0
#1502892726182098    % timestamp
r302 "0                        % Messwert 1  "0
r3 "1                            % Messwert 2  "1
 


Wie kann ich meiner "Temprow" da die Temperatur zuweisen?

Grüße
 
Harald
Forum-Meister

Forum-Meister


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


Zitat:
Allerdings würde ich es auch gern verstehen wollen.

Das ist eine gute Idee :) Die Zeilen mit den ? :
Nimm entsprechenden Teil der Zeile, wandle ihn in einen Double um, und hänge ihn an die vorhandenen Daten an.

Zitat:
Werden jetzt alle ungeraden Zeilen der Zeit und alle Geraden der Temperatur zugeordnet?

Genau.

Zitat:
Wie kann ich meiner "Temprow" da die Temperatur zuweisen?

Wie erkennt man denn, welcher der Werte die Temperatur ist? An dem Wert hinter dem ", an dem Wertebereich, oder an was ganz anderem?

Generell wirst du dann die Zeilen immer mit einer if-Abfrage analysieren müssen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 14:36     Titel:
  Antworten mit Zitat      
Zitat:

Nimm entsprechenden Teil der Zeile, wandle ihn in einen Double um, und hänge ihn an die vorhandenen Daten an.


Dann hatte ich das richtig vermutet. Schön (:

Zitat:

Wie erkennt man denn, welcher der Werte die Temperatur ist? An dem Wert hinter dem ", an dem Wertebereich, oder an was ganz anderem?


rxxx steht für read und den entsprechenden Wert. Und der Teil der anschließend aufgezeichnet wird, entspricht dem Identifier des jeweiligen Messwerts.

als hoffentlich verständliches Beispiel:
Code:

r301 "0    % read Wert:301  Identifier: " "0 " = Temperatur
r23   A     % read Wert:23    Identifier: " A "  = Strom
 


Die Definitionen würden dann jeweils im Header stehen.

Zitat:

Generell wirst du dann die Zeilen immer mit einer if-Abfrage analysieren müssen.


Würde das ganze dann über " strfind " funktionieren?
Wenn ich:
Code:

    timerow = fgetl(fid);
    if (strfind (timerow, '"'))
    t = [t; str2double(timerow(2:end))];
    end
 

nutze, dann speichert er keinen Wert im t-Array.
 
Harald
Forum-Meister

Forum-Meister


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

du solltest ja auch nicht in timerow, sondern in temprow nach solchen Werten suchen?
Ich würde es dann so angehen:

Code:
t = [];
Temp = [];
while ~feof(fid)
    somerow = fgetl(fid);
    if (strfind (somerow, '#'))
        t = [t; str2double(somerow(2:end))];
    end
    if (strfind (somerow, '"0'))
        Temp = [Temp; str2double(somerow(2:end-2))];
    end
end    


Grüße,
Harald

Edit: Code Tags hinzugefügt

Zuletzt bearbeitet von Harald am 25.10.2017, 15:52, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Hammy_1703

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2017, 15:28     Titel:
  Antworten mit Zitat      
Da hast du natürlich recht. Embarassed
Funktioniert super - auch bei mehreren Variablen.

Vielen Dank Harald

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