Beiträge von aybabtu

    Ist es eine Tabelle oder sind es spaltenweise verschiedene Messdaten/physikalische Größen?

    Ich würde die Daten erstmal in FAMOS laden (ASCII-Import-Assistent beim Datei-Typ auswählen).

    Anschließend kannst du Datensätze mit der Funktion "sum" (oder "Summe") aufsummieren.

    Warum holst du die Werte mit "MatrixGet" ?

    Warum gehst du nicht über den normalen Index?

    Hast du mal das "h" und die 1 bzw. das "a" und die 1 getauscht?


    Code
    singleValue = dataset[i]


    Zu den Begrifflichkeiten.

    In imc FAMOS haben wir "normale Datensätze", welches in der Regel Kanäle sind. Man könnte diese als Vektoren bezeichnen. Dieser normale Datensatz hat die y-Werte in äquidistanten x-Abständen (idR Zeit) vorliegen. Daher werden hier (intern) auch nur die y-Werte und die Abtastzeit gespeichert. (Hinzu kommt noch ein x-Offset).

    Das Wort "Tabelle" ist irritierend und könnte eher auf "segmentierte Datensätze" passen, die z.B. aus einer FFT mit gleitendem Fenster über das Signal entstehen.


    Performanter könnte man dein Bespiel auch so machen, dass man den Datensatz verschoben von sich abzieht und Nullen sucht.


    Code
    d1 = cutIndex(dataset, 1, N-1)
    d2 = cutIndex(dataset, 2, N)
    d = d2-d1
    ; PosiEx, SearchLevel, etc. to find "d = 0"


    PS.: Ich weiß nicht, welche FAMOS Version du nutzt, aber es gibt schon etwas länger die "FOR"-Schleife.

    Das Symbol sieht anders aus, weil es XY-Datensätze sind. Die zeitlichen Abstände sind nicht zwangsweise gleich.

    Man könnte auch mit XYdt einen äquidistanten Kanal daraus machen.


    Allgemein kann man auch einfach abfragen, welche Daten oberhalb einer Schwelle liegen und das Aufsummieren, multipliziert mit der Abtastzeit.


    Code
    block20 = 20 < temperature AND temperature <= 30
    t_20 = sum(block20) * xdel?(temperature)


    Für die 1°C Bereiche wäre natürlich eine Schleife besser. Hier müssten aber die Namen automatisch generiert werden.

    Code
    ; whereas i_loop is the counter of the FOR-loop; you can also use STEP 10 for other blocks
    blockName = "block_" + Tform(i_loop, "")
    timeName = "t_" + Tform(i_loop, "")
    <blockName> = i_loop < temperature AND temperature <= (i_loop + 1)
    <timeName> = sum(<blockName>) * xdel?(temperature)


    Mit den spitzen Klammern (< >) machst du aus dem Inhalt einer Textvariablen eine Variable.

    Hallo und herzlich Willkommen in der Welt von imc FAMOS. :-)


    Wie liegen die Daten vor? Famos-Datei, CSV, ...

    Wie liegen die Daten in FAMOS vor?

    Oder ist es ein normaler Datensatz der Temperatur? (äquidistante Zeitbassis)


    Möchtest du nur eine Darstellung oder wie sollte sich das gestalten?

    Möchtest du nur eine Gesamtzeit wissen? Oder möchtest du alle Zeitintervalle der Temperatur von 10°C - 20°C haben?

    Eine Schwierigkeit wird auch sein, was mit den Grenzwerten ist. Also offenes oder geschlossenes Intervall.


    Man könnte natürlich mit einem Mittelwertfilter über das "Zeit-Temperatur-Signal) drüber gehen.


    Wenn es ein Temperatur-Signal ist, kannst du dir auch mit "SuchePegel" die Start und Endpunkte suchen und daraus die Differenzen bilden.

    Wird nur schwer bei doppelten Intervallen die richtig zuzuordnen, man müsste ja dann die Zeiten entsprechend aufaddieren.


    Mit den Intervall-Funktionen habe ich noch nichts gemacht, aber die könnten ggf. auch interessant sein.

    Ich habe bei mir ein Import-Filter für MDF4 und ein Export-Filter für RPC3.


    Die Dateien per Hand oder mit FileLoad und dem MDF4-Format laden und die Variablen per Hand oder mit FileSave wieder speichern.

    Bei den File-Befehlen wird als Parameter das entsprechende Filter angegeben. -> Funktionsassistent oder Autovervollständigung nutzen.


    Welche FAMOS-Version nutzt du? Nur für den Fall, dass da noch eine 6 vor dem Punkt steht. ;-)

    Leider sehe ich in der Funktion "SetOption" keine Möglichkeit.


    Die Einstellung wird wohl in der Registry gespeichert. Zumindest finde ich da den Schalter und den Pfad wieder.

    Du müsstest somit eine *.reg Datei erstellen, die ausgeführt werden muss; wenn die IT das zulässt.
    Alternativ "Mini"-Programm schreiben, welches das tut und in Famos per "Execute" ausführen. Aber auch hier ist fraglich, wie das mit den Admin-Rechten ist.


    Reg-Pfad: HKCU\SOFTWARE\imc Measurement and Control\Default\Famos\Defaults\

    FileFilterSync

    FileFilterSyncFolder64

    Hallo Roland,


    welche Version von "imc FAMOS" benutzt du?

    Wie lange dauert es mit dem "FileLoad"-Befehl?

    Welche Optionen hast du beim "Import" ausgewählt? (z.B. im Datei-Öffnen-Dialog beim Laden von Variablen oder direkt in den Optionen bei den Importfiltern) -> ggf. macht hier "Vector CANape" etwas anders.


    Falls alles nicht gewinnbringend ist, kontaktiere die Hotline von imc Test&Measurement (hotline@imc-tm.de).

    Wird dann nur herausfordernd einen Beispieldatensatz zu übermitteln.

    Okay,

    na die Perioden haben doch eine feste Breite.

    Also kennst du doch die jeweiligen x-Werte


    Code
    i * periodWidth + x


    Bzw. kannst du dir mit dem "perio" Befehl ja auch die einzelnen Perioden holen.

    Und dann kannst du dort wiederum mit Value dir den x-Wert holen. Hier musst du nur auf den x-Offset aufpassen.

    Was genau meinst du mit "zwei Werte Spalten"?

    Dein Beispiel-Datensatz ist segmentiert und ich konnte die MatrixIPol-Funktion (technisch) darauf anwenden.

    Erweitert wurde die Matrix (bei meinen Einstellungen mit "1,1") nicht, sie hatte noch die gleiche Größe. Du hast aber Recht, verändert man hier die Faktoren, erhält man eine größere Matrix.


    ABER nun erkenne ich aber das Problem.

    Bei o.g. Interpolation sind für ihn die "0"-Werte ebenfalls Stützstellen. Und es wird versucht zwischen den Stellen zu interpolirieren.

    Das möchtest du ja aber nicht.

    Die Frage ist, woher soll ein PC das wissen, dass für dich die "0 Werte" nicht relevant sind? ;-)

    Es gibt ja leider kein "NaN", welches "ignoriert" werden könnte. Denn 0 ist ja ein Wert.


    Ansonsten hätte ich ja noch vorgeschlagen, via "FOREACH" jedes Segment einzeln zu interpolieren.


    Wie ist denn dieser Datensatz entstanden? Woher stammen die 0 Werte?
    Und was soll an den Rändern passieren? Die würden dann ja 0 bleiben, da der erste Wert "irgendwo" ist.


    Mir würde spontan nur einfallen jedes Segment einzeln zu nehmen.

    Das Segment dann in einen XY-Datensatz zu bringen und diesen zu interpolieren, zu resamplen und in eine Ergebnismatrix zurückzuschreiben.


    Das alles ergibt natürlich nur Sinn, wenn deine Interpolation segmentweise möglich ist.
    Es klang aber eher, dass du eine 2D-Interpolation möchtest, er also auch die "andere Richtung" berücksichtigen soll.


    Alles in allem ist mir die Deutung des Ergebnisses auch nicht klar - ich komme aber nicht aus der Mechanik-Ecke.


    Ansonsten kannst du natürlich dich auch an die hotline von imc wenden:
    Auf der Webseite http://www.imc-tm.de gibt es einen "Sofort-Kontakt" (Telefon/Mail)

    Manchmal haben die ja sowas auf Lager. Oder haben noch andere Ideen.
    Beschreibe da aber genau, was du machen willst. ;-)

    Es gibt die folgenden Funktionen speziell für Matritzen/segmentierte Daten:


    MatrixFromLine(,,,)

    MatrixIpol(,,,)


    Ansonsten kann natürlich auch jedes Segment mit den vorhandenen Interpolationsfunktionen verrechnet werden.

    ---

    Welche Famos-Version hast du?
    Ggf. sind o.g. Funktionen erst in neueren Versionen vorhanden.

    Ebenso die Funktionssuchfunktion mit der man leichter die Interpolationsfunktionen finden kann.

    t_sample= Xdel?(channel) ; Abtastzeit für normale Datensätze

    Diff wäre die Ableitung der Werte...


    Wenn du allerdings einen XY-Datensatz hast, wird es etwas tricky.

    Aber hier würde ich einfach die x-Komponente nehmen, von 1 bis N-1 ausschneiden und vom Ausschnitt 2 bis N abziehen.

    Was passiert, wenn du die FileLoad-Methode anwendest? Auch hier gibst du ja das Einlesefilter an.

    Ansonsten kann es natürlich sein, dass dein Dateiformat nicht dem obigen entspricht und das Einlesefilter deswegen nicht so funktionieren kann.

    Der Beitrag ist ja auch schon 9 Jahre alt. Nicht dass sich da etwas am *.lvm-Format seitens Matlab getan hat.


    Hast du noch Alternativen zu diesem Dateiformat? Also kannst du seitens des Quellprogramms in einem anderen Format speichern, dass (dein) FAMOS eher akzeptiert?


    Allerdings ist es interessant, dass im Debug-Fall es bei dir funktioniert und sonst nicht. :/

    Die Frage ist doch auch, was bei Excel eingestellt ist. Also wie viele Nachkommastellen hier angezeigt werden.

    Ansonsten stimmt es schon, dass durch die Auflösung nun mal mehrere Nachkommastellen hinzukommen.


    "meine Messwerte bis auf die 8te Nachkommastell gleich sein"

    Warum sollte das nicht der Fall sein?

    Es geht doch nur um eine Zahlendarstellung bzw. eine Analog-Digital-Umsetzung.


    Konkret betrachtet werden unendlich viele Messwerte (in einem kleinen Bereich) in den gleichen Messwert dargestellt bzw. "umgewandelt", weil einfach nicht "feiner" aufgelöst werden kann.

    Bei mir hat es mit folgendem funktioniert:

    x= {<VariablenName>}


    Welche Fehlermeldung kommt dann bei dir? Immer noch die gleiche?

    Welchen Wert hat "VariablenName" ?


    Es gibt noch "TReplace", "TxReplace", "TxRegexReplace".

    Ansonsten hat FAMOS ab der 7.2 oder 7.3 auch für die Funktionen eine Suchfunktion.

    Und in "PA (2)" ist ein Leerzeichen.

    Beim Verwenden der spitzen Klammern würde dort die Zeile

    x = PA (2) ; ausgelöst

    stehen.


    Ergo:

    x = {<VariablenName>}

    Mit geschweiften Klammern kannst du auch "ungültige" Zeichen in Variablennamen verwenden.


    Dann müsstest es klappen und eine Variable mit Leerzeichen enthalten.

    Ich würde aber allgemein auf Leerzeichen in VariablenNamen verzichten.

    Hierbei kann auch TxGetValidVarName() helfen, welche in neueren Versionen vorhanden ist, sowie der Rename-Befehl.


    Mich wundert nur gerade, dass es mit einer *.dat-Datei geklappt hat. Oder hatte die kein Leerzeichen?

    Bei mir funktioniert dein Code auch mit einer *.raw Datei.


    Kannst du bitte den echten originalen Code hier reinstellen?

    Du scheinst mit Parametern zu arbeiten.

    Zudem denke ich, dass "funktioniert nur bei .dat" nicht in der Fehlermeldung steht. Das hat mich nämlich verwirrt.

    Weil deine Zeile 5 im obigen Code nichts mit *.dat-Dateien zu tun hat.

    VariableName sollte demnach auch keinen Punkt enthalten.


    Wenn aber dein Dateiname einen weiteren Punkt enthält, müsstest du das mit geschweiften Klammern "escapen".


    x = {<VariablenName>}


    Ich denke, es liegt eher ein Tippfehler vor. Es heißt ja "unbekanntes ... Objekt". Ergo kennt er die Variable zu dem Zeitpunkt nicht.

    Oder du hast keinen zweiten(?) Parameter übergeben.



    PS:

    Löblich dein Hinzufügen der Anführungszeichen um der Pfad-Leerzeichen-Problematik aus dem Wege zu gehen.

    Bei FileLoad und FsSplitPath ist das aber nicht notwendig. Notwendig ist dies u.a. für den alten "Laden" Befehl.

    1) Dazu müsstest du dir die Messwerte anschauen. Die Kurve verbindet standardmäßig auch nur die einzelnen Punkte. Du kannst das in den Linien-Einstellungen ändern um z.B. nur die Messpunkte anzeigen zu lassen. Oder Messpunkte mit Linien.

    2) Dazu fehlt mir persönlich die Erfahrung.

    3) Ok. Das bügelt schonmal kleine Änderungen weg - auch wenn es natürlich ggf. das Signal verfälscht. Kommt aber auf die Anwendung drauf an.


    Was ich immer anderen sage ist u.a.

    "Man sollte nicht die Glättungsbreite verändern, nur damit das Signal "schön" aussieht."

    Was ich damit sagen will ist, man muss immer wissen, was man da tut und sollte sich nicht seine Signale aufbereiten, nur damit sie "schön" aussehen.


    Und wenn du "ungewollte Treppenform" meinst, dann klingt das erstmal für mich nach etwas visuellem.

    Genaueres bringen dann die Messwerte.

    Die Treppen kommen aber eher durch gleiche nacheinanderfolgende Werte zu stande.

    Also war deine Idee mit dem sampleweisen Vergleich schon ganz okay.

    Die Frage ist, was du tust, wenn ein kleiner "Riffle" (minimale Änderungen) auf der "Treppen-Horizontalen" vorhanden sind. Ist es dann auch noch eine Treppenform? Also, gibt es da für dich ein Toleranzbereich?

    Ansonsten kannst du natürlich diff() nutzen und schauen, wo der Wert 0 ist (bzw. nicht 0).


    Die Frage ist auch, was willst du dann mit dieser Aussage weiter machen?

    Ohne jetzt groß was über Stick-Slip zu wissen ... wäre auch mal interessant, was genau das ist - in deinen eigenen Worten.

    Bzw. stelle dir die Frage, wie du selbst vorgehen würdest, um dies zu erkennen. Oder fängt hier schon die Herausforderung an? :-)


    1. Ist es nun eine Kennlinie oder sind es Messwerte? Das ist für mich ein wesentlicher Unterschied (s.u.)
    2. Sind deine beiden Methoden der allgemeine offizielle Weg dies zu berechnen oder ist genau das deine Frage?
    3. Wurde das Messsignal vorher geglättet oder anders aufbereitet?


    Ansonsten halte ich es (hier) für fragwürdig direktaufeinanderfolgende Samples von Messwerten miteinander zu vergleichen um daraus eine große Aussage oder gar "Erkennung" zu treffen. Wenn es sich um eine Kennlinie handelt, sieht es sicher anders aus.

    Laut deiner Methode 2 würde ja nur bei Gleichheit kein Stick-Slip entstehen.