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

Zeit zwischen zwei Flanken messen

 

PHEV
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2013, 11:21     Titel: Zeit zwischen zwei Flanken messen
  Antworten mit Zitat      
Hallo,

wie kann ich die Zeit Zwischen zwei Flanken bzw Bits messen?

Wie kann ich die Zeit allgemein mit Simulink messen?

Ich habe schon einige Zeit gesucht und recherchiert, aber mit clock kann ich irgendwie nichts anfangen.

Ich möchte z.B. die Zeit messen, zwischen einem Bit=1 und einem anderen =1.

Danke

Edit:

Ok ich habe nun recherchiert, dass es wohl mit den Befehlen tic und toc geht. Leider weiß ich nicht genau wie man dieses anwendent.

Ich müsste dann ja so etwas schreiben wie:

tic

if(Variablex=1)

toc

if (Variabley=1)

oder sowas.

Ich bin in matlab leider wirklich neu
Private Nachricht senden Benutzer-Profile anzeigen


knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 08:57     Titel:
  Antworten mit Zitat      
Kannst du nicht zwei Variablen nehmen und bei einer Flanke die Zeit aus der Clock in die Variable speichern. Jedes mal wenn du eine gerade Anzahl an Flanken detektiert hast, nimmst du die Differenz der Zeiten in den Variablen.
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 09:30     Titel:
  Antworten mit Zitat      
Hallo,

ich weiß nicht mal wie ich die Zeit aus einer Variable in eine clock speichere bei einer steigenden Flanke.

Ich arbeite diese woche zum ersten mal mit simulink und matlab
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 10:06     Titel:
  Antworten mit Zitat      
Wenn du eine Matlab Function nimmst, dann kannst du die Zeit z.B. so speichern:
Code:
function [zeitDiff] = fcn(flanke,zeit)
%#codegen
persistent time;
if isempty(time)
    time = zeros(1,2);%Kann zwei Zeiten speichern
end
if flanke == 1 % Flanke detektiert
    circshift(time,1);
    time(1) = zeit; % Zuletzt gespeicherte Zeit ist immer in time(1)
end
zeitDiff = 0;
% Ab hier was mit den Zeiten machen und mit zeitDiff ausgeben.
 

So kannst du die letzten zwei Zeiten speichern, bei denen du eine Flanke detektiert hast. Die Frage ist, was soll ausgegeben werden nachdem eine Zeit berechnet wurde? Solange die alte Zeitdifferenz bis was neues berechnet wurde?
Ich gehe davon aus die Verschaltung des Matlab Function Blocks ist offensichtlich.
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 12:44     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Hilfe schonmal.

Ich habe den Code mal in einen function Block eingefügt.

Leider kommt zum einen der Fehlercode:

Code:
Function 'circshift' implicitly resolved in the MATLAB workspace. This feature is deprecated. Please declare this function extrinsic using eml.extrinsic('circshift'), or call it using feval.

Function 'Embedded MATLAB Function' (#61.182.199), line 8, column 5:
"circshift(time,1)"
 


Andereseits muss ich gestehen bin ich denke ich noch lange nicht fit genug um das ganze korrekt zu integrieren. Ich habe mal ein Bild angefügt wie ich das ganze eingebunden habe.

Die Funktionsweise von clock ist mir auch nicht ganz klar.

Mein Problem ist ebenfalls, dass ich nicht weiß wie ich mit den Ausgängen out1, out2 usw umegehen soll.

Die Eingänge kann ich ja unter configurate Parameters/Data import Export einstellen. Wie ich jedoch mehrere Ausgänge bekomme weiß ich auch nicht . Ich bekomme immer alle Ausgänge als Vektor in yout. Ich hätte die Ausgänge aber lieber einzeln, so wie die Eingäne ebenfalls.

12.PNG
 Beschreibung:

Download
 Dateiname:  12.PNG
 Dateigröße:  10.89 KB
 Heruntergeladen:  723 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 13:29     Titel:
  Antworten mit Zitat      
In der zweiten Zeile habe ich das %#codegen vergessen zu löschen. Hier etwas leicht geändert.
Code:
function zeitDiff  = fcn(flanke,zeit)
persistent time;
if isempty(time)
    time = zeros(2,1);%Kann zwei Zeiten speichern
end
if flanke == 1 % Flanke detektiert
    time=circshift(time,1);
    time(1) = zeit; % Zuletzt gespeicherte Zeit ist immer in time(1)
end
zeitDiff = time(1)-time(2);

Ich hab mal eine Simulation gemacht. Berechnet die Zeit zwischen den zwei Pulsen (hier die Breite des Rechtecks). Zeitdifferenz ist hier konstant, da ein Periodisches Signal.

test.slx
 Beschreibung:

Download
 Dateiname:  test.slx
 Dateigröße:  14.74 KB
 Heruntergeladen:  513 mal
test2.png
 Beschreibung:

Download
 Dateiname:  test2.png
 Dateigröße:  56.42 KB
 Heruntergeladen:  773 mal
test1.png
 Beschreibung:
Modell

Download
 Dateiname:  test1.png
 Dateigröße:  10.14 KB
 Heruntergeladen:  726 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 13:40     Titel:
  Antworten mit Zitat      
danke aber ich habe noch diesesn Fehlercode:

C:\Users\..........\sfun\src>"c:\program files\matlab\r2007b\sys\lcc\bin\lccmake" -f test_sfun.lmk
Das System kann den angegebenen Pfad nicht finden.


Und nach etwas recherche kommt raus das mir irgendein compiler fehlt.

Den kann ich wohl hier

http://www.microsoft.com/en-us/download/confirmation.aspx?id=8279

runterladen. Das geht jedoch nicht da ich an einem Rechner arbeite auf der Arbeit ( ich schreib hier meine Abschlussarbeit) und da habe ich zwar die berechtigung was zu installieren und runterzulade, aber der webinstaller darf scheinbar nicht ausgeführt werden.

Was mach ich denn jetzt?

Ich hab win7 und 64bit
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2013, 15:35     Titel:
  Antworten mit Zitat      
nachdem ich die 32bit Matlab version installiert habe geht es!


Danke für die Super Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 11:00     Titel:
  Antworten mit Zitat      
Hallo ich muss nochmal fragen:

Wenn ich den Ausgang Zeitdiff in den Workspace lade, gibt er mir einen Vektor aus der immer 0 ist, bis die Steigende Flanke kommt, dann ist er 0,25.
Die Flanke selbst ist ja auch nur ein Vektor der von 0 auf 1 geht.

Ich habe keine Ahnung wie ich daraus die Zeit ermitten soll, die vergeht, bis die Flanke steigt.

Im Scope sieht man dass die Flanke bei z.B. 55 sek steigt. Diesen wert, also 55sec möchte ich auslesen.

Und weiterhin dann zwei flanken einlesen und die Differenz dazwischen messen.

Die Funktion macht aus meiner eingehenden Flanke eine neue...



Ich brauche denke ich eher sowas wie:

Wenn flanke1 =1
speichere aktuelle Zeit in Variable t1;

Wenn flanke2=1
speichere aktuelle Zeit in Variable t2;

Zeitdiff= t2-t1


Ich weiß aber nicht wie ich die Zeit speichere zu genau dem Zeitpunkt wenn die Flanke 1 wird.
Code:
function zeitDiff  = fcn(flanke,flanke2,zeit)
persistent time;
if isempty(time)
    time = zeros(2,1);%Kann zwei Zeiten speichern
end
if flanke == 1 % Flanke detektiert
    time(1)=zeit;
end
   
   
if flanke2 == 1 % Flanke detektiert
   
    time(2) = zeit;
end
zeitDiff = time(1)-time(2);



So wird die Zeit ja dauerhaft gespeichert.


Leider weiß ich nicht was der Befehl circshift genau macht. Ich habe mir dazu die beschreibung durchgelesen, aber nicht verstanden, was dazu in meinem Beispiel gebraucht wird.

Warum time in einem array gespeichert werden muss und wie dieses genau funktioniert weiß ich auch nicht.

Über eine erklärung wäre ich sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 12:33     Titel:
  Antworten mit Zitat      
Kannst du mal deine Flankensignale als *.mat exportieren und hochladen? (to workspace block).

Zitat:
Ich habe keine Ahnung wie ich daraus die Zeit ermitteln soll, die vergeht, bis die Flanke steigt.

Redest du hier jetzt von einer Anstiegszeit? Bei Flanke denke ich an etwas, das von 0 auf 1 wechselt (sofort).

Zitat:
Im Scope sieht man dass die Flanke bei z.B. 55 sek steigt. Diesen wert, also 55sec möchte ich auslesen.

Das machst du mit:
Code:

If flanke == 1
    time = zeit;
End
 


Mein Beispiel bezog sich darauf, dass du gefragt hast wie man die Zeit speichern könnte und nicht auf dein Problem mit zwei verschiedenen Flankensignalen.

In deinem Codebeispiel machst du es ja eigentlich richtig. Du speicherst die Zeit, wenn Flanke 1 ist. Die Differenz wird zu jedem Zeitschritt berechnet, d.h. es die Berechnung ist einmal richtig (nach dem 2. Flanke detektiert wurde) aber danach ist die Ausgabe nur Wiederholung. Du kannst das jetzt so machen, dass du entweder für Wiederholungen eine -1 ausgibst oder du benutzt Enbaled Subsystem. Dieses Subsystem kannst du z.B. einmal ausführen um etwas zu berechnen und danach deaktiviert lassen.

Die Funktion circshift "dreht" einen Vektor/Matrix um eine bestimmte Anzahl von Komponenten. In meinem Beispiel (Vektor mit 2 Komponenten) habe ich alle Werte im Vektor um 1 nach unten geschoben, der letzte Wert ist dann auf den ersten Platz gewandert. Danach habe ich den ersten Wert überschrieben, d.h. der aktuellste Wert war in meinem Vektor ganz oben.

Array habe ich genommen weil mehr als eine Zeit brauchst. Du kannst natürlich auch so machen:
Code:

persistent time1;
if isempty(time1)
    time1 = 0;
end
persistent time2;
if isempty(time2)
    time2 = 0;
end
 

Ein Vektor zu nehmen ist viel kürzer, vor allem wenn du mehr Zeiten speichern willst.
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 13:08     Titel:
  Antworten mit Zitat      
Also ich möchte die Zeit von einem Wechsel von 0 auf 1 seit einem ereignis. Einmal start der diagnose einmal eine andere Flanke. Nicht wie lange der Flankenwechsel dauert Very Happy


Zitat:
if flanke == 1
time = zeit;
End



damit geht es auch nicht.


Ich möchte ja dass zu dem Zeitpunkt wenn die Flanke auf 1 geht der wert der Zeit ausgegeben wird. Nur dann sonst nicht.

Ich bekomme immer nur genau das selbe raus, wie dass was eingeht.

Mit meinem Code bekomme ich wie du gesagt hast, die werte kontinuierlich berechnet. Ich möchte sie aber nur zu dem zeitpunkt.

Ich weiß nicht wie ich das bei einem enabeld subsystem mache, oder wie ich die berechnungschritte auf eins stelle. Letzteres kann mir denke ich aber dann in die suppe spucken, wenn mehrere Flanken wechsel kommen.

Ich weiß auch nicht wo ich das nachlesen kann.

Arrays und circshift habe ich jetzt denke ich verstanden.

Ich hätte desweiteren auch gerne die möglichkeit die zeit aufzusummieren in der eine Flanke True (1) ist. Dann könnte ich quasie so lange eine Flanke auf true ist die zeit aufaddieren.

(Ich arbeite mit diagnosen, welche durch einschaltbedingungen immer an und aus gehen. Ich möchte die Diagnose verkürzen und benötige daher unter anderem die Zeit, die sie wenn die EB erfüllt sind benötigt um fertig zu werden)



Vielen dank auch für die ausführlichen erklärungen das hilft mir echt sehr die art und weise wie man programmiert zu verstehen. Ich habe da leider noch gar keine ahnung von wie man sieht.

Ich habe mal drei Datein angehängt. Zwei Flanken und die Zeit t

dreiDateein.zip
 Beschreibung:

Download
 Dateiname:  dreiDateein.zip
 Dateigröße:  2.28 KB
 Heruntergeladen:  330 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 13:16     Titel:
  Antworten mit Zitat      
Andere Frage:

Ich habe ja den Zeitvektor und den Flankenvektor.

Kann man nicht auch sowas machen wie:

if Flankenvektor(:,1)==1
BenötigteZeit=t(:, Flankenvektor(:,1)==1)

end

und in die klammer von t muss die anweisung dass er aus dem vektor genau den wert ausließt der in der Zeile steht die erste 1 in dem Flankenvekort steht.

Ich bekomme das einfach nicht hin
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 14:24     Titel:
  Antworten mit Zitat      
Die Vektoren kannst du so auswerten, wenn die Simulation vorbei ist. Während der Simulation hast keinen Vektor, sondern zu jedem Zeitschritt ein Wert pro Signal.

Ein Signal geht bei dir bei ~29 s auf 1 und das andere ~57 s auf 1. Was soll eigentlich vor 57 s ausgegeben werden? Was soll ab 57.1 s ausgegeben werden? Nach deiner Beschreibung müsste deine Auswertung immer aus sein und geht zum Zeitpunkt 57 s einmal ein zu Berechnung und danach nie wieder. Sind bei dir die andere Modell auch getriggert. Im Simulink Library Browser findest du bei Ports & Subsystems das Enabled Subsystem. Kannst das mal Testen.
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 15:41     Titel:
  Antworten mit Zitat      
Das enabled subsystem kenne ich aber ich weiß nicht was ich damit machen muss.

Zu meiner Auswertung:

Wie ich das mache weiß ich nicht daher frage ich hier.

Ich möchte einfach überprüfen wie lange es Dauert bis eine Flanke steigt.

Steigt die Flanke soll zu diesesm Zeitpunkt die Zeit ausgegeben werden oder so ähnlich.

Ich finde das eigentlich sehr einfach zu verstehen nur weiß ich nicht wie ich es umsetzten soll.


In dem Bild z.B. :

ich möchte t1-5 wissen.

Diese dann auswerten. Das sollte doch möglich sein oder nicht???

abc.png
 Beschreibung:

Download
 Dateiname:  abc.png
 Dateigröße:  8.15 KB
 Heruntergeladen:  587 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
PHEV
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 10.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2013, 09:25     Titel:
  Antworten mit Zitat      
Hallo,


oben steht dass das Thema beantwortet sei, das Problem besteht aber immernoch.

Ich wäre für eine Hilfe sehr dankbar
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.