Sprung einer Steigung ermitteln

DennisBerger

Level-2
Beiträge
436
Reaktionspunkte
61
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich hab einen Motor der gegen eine Feder dreht.
Die Feder lässt einen Ventildruck durch

Am anfang ist der Druckanstieg zur zeit relativ linear, irgendwann aber springt der Druck ab..
also etwa so:
nach ist der druckwert
10 sek = 4,0bar (immer ca 0,1bar dazu)
11 sek = 4,12bar
12 sek = 4,25bar
13 sek = 4,33bar
14 sek = 4,41bar
15 sel = 4,54 bar
16 sek = 4,68 bar

17 sek = 4,95bar = sprung (hier 0,3bar)

Nun kann dieser lineare anstieg anstat 0,1 bar auch mal in 0,3er oder 0,5er schritten (variabel) sein und der sprung dann anstatt 0,3 vielleicht 0,5 oder 0,7 bar sein.

deshalb kann ich den sprungwert nicht als festwert nehmen, sondern muss ihn aus dem mittleren steigungswert der vorigen messungen ermitteln (wenn vorher immer alle sekunde etwa 0,1bar dazu dann ist sprung bei z.b. 0,3bar),
so dass die steuerunbg weiss, dass der anstieg nicht mehr linear wie vorher war.

ich hab einen analogdruckmesser, die cpu 314 und die analogkarte.


wie löse ich das programmtechnisch am besten und einfachsten?


danke
 
Zuletzt bearbeitet:
Wie lange musst Du das den messen?

Wenn es nicht zu lange ist, könntest Du Dir die Mittelwerte in der Waagrechten bilden, sprich:
Bei 10 Sekunden Wert in eine Tabelle schreiben, bei 11 bis 15 dementsprechend in jeweils eine andere Tabelle.
Damit hast Du dann einen Mittelwert der alle 10 Sekunden getriggert wurde, einen der alle 11 Sekunden getriggert wurde u.s.w.
Verständlich? :rolleyes:

Wenn Du eine Minute messen musst, wären das 60 Tabellen. Wäre wahrscheinlich dann nicht sinnvoll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so aufgrund des automatischen logouts nach einer minute, kann ich das ganze nun nochmal schreiben
________

danke erstmal für deine schnelle antwort.

diet messzeit ist relativ, ich muss solange messen bis der sprung erkannt wurde.
da es versch. federn gibt, haben die alle auch unterschiedliche steigungen.

Ich weiss den druck absprung aber ca, da dieser in einem fenster liegen muss. so kann ich mit der messung kurz vor erreichen des minimalfensters anfangen.

im prinzip muss ich doch alle sekunde den wert speichern, dann den 2. wert vom vorigen abziehen = steigung s

w1 = messwert 1 z.b. 1,00bar
w2 = messwert 2 z.b. 1,012bar
w3 = messwert 3 z.b. 1,034bar
w4 = messwert 4 z.b. 1,048 bar

also
w2-w1= s1 z.b. 0,012
w3-w2 = s2 = 0,022
w4-w3 = s3 =0,014
w5-w4 = s4 =0,015
w6-w5 = s5 = 0,019
usw
sprung wäre
w11-w10 = 0,043

um den mittelwert der steigung auszurechnen müsste ich ja
andauernd:
s1+s2 / 2
dann
s1+s2+s3 /3
dann
s1+s2+s3+s4 /4
also
s1+s2+s3++s4+ sx.. / anzahl der messungen
= mittelwert der steigung Smw

S > Smw = sprungerkennung


oder? aber wie mache ich das?
wie verschiebe ich immer den neuen messwert über den alten und kann gleichzeiotig noch damit rechnen?
 
Zuletzt bearbeitet:
wie verschiebe ich immer den neuen messwert über den alten und kann gleichzeiotig noch damit rechnen?

Die Steigungsberechnug kannst ja dann über eine art Schleife machen:
Code:
// Ermittlung von w
// Erste Messung einmalig auf "alter Messwert" schreiben 
L Neuer Messwert
L Alter Messwert
- R
T Neues Ergebniss
 
L Neuer Messwert 
T Alter Messwert
 
// Ermittlung von s
// Erstes Ergebnis einmalig auf "alter Wert" schreiben 
// und Anzahl Werte mit 2 vorbelegen
 
Neues Ergebnis liegt vor
SPBN Wart
L neuer Wert
L alter Wert
+R 
T alter Wert
L Anzahl Werte
/ R
T Smw
 
L Anzahl Werte 
L 1.0
+ R
T Anzahl Werte
Wart:NOP 0
 
oh man ich liuebe awl :(

T steht für transferieren?

+R steht f+r addiere realzahl
-R fü+r subtrahiere realzahl?`

irgendwie steige ich bei dir nicht durch, kannst es etwas anschaulicher ausführlicher machen?

die aktuellen messwerte sind bei mir von PEW320 in
DB1.DBD0 abgelegt
arbeite nur mit DBs

neuer Messwert wäre dann DB1.DBD4
usw

und wie lade iich das einmalig rein?


ich hab nen blinker programmiert, der alle x ms den wert per positive flanke in einen db verschiebt, ist das okay so?
(programmiere in fup)

wie mach ich ne schleife?


wie berechnest du den neuen wert?
neuer wert sol doch bei dir der wert sein messwert neu minus messwert alt = neuer wert
oder?
 
Zuletzt bearbeitet:
arbeite nur mit DBs

neuer Messwert wäre dann DB1.DBD4
usw

und wie lade iich das einmalig rein?

ich hab nen blinker programmiert, der alle x ms den wert per positive flanke in einen db verschiebt, ist das okay so?
(programmiere in fup)

wie mach ich ne schleife?

wie berechnest du den neuen wert?
neuer wert sol doch bei dir der wert sein messwert neu minus messwert alt = neuer wert
oder?
Alles korrekt:
Nur DB's > schön
Mit positiver Flanke in DB schieben > schön
Eine richtige Schleife wäre Loop > brauchst aber hier nicht
Die Schleife ergibt sich dadurch das die Anzahl der Ergebnisse gezählt werden. (s1+s2+s3++s4+ sx.. / anzahl der messungen) Sprich Du machst bei jedem neuen Ergebnis das gleiche, nur die Werte haben sich geändert > Schleife. :D
Ersetze Neue und Alte Wert durch DB-Wörter und dann sollte schon mal ein bisschen was gehen.
 
Hallo,
eine derartige Aufgabenstellung würde ich mit einer Kurven-Aufzeichnung lösen - das heißt in einem festgelegten Zeitintervall (OB35) die Messwerte in einen Puffer einlesen. Am Ende des Einlese-Vorgangs (bei mir normalerweise Zeit oder Erreichen eines bestimmten Endwertes) würde ich das Ganze dann Auswerten und treffe damit auch Aussagen über die ganze Messung.

Als Hilfsmittel zur Programm-Erstellung benutze ich hier SCL - damit stehen mir Schleifen-Programmierung, Indexierung von Array's etc. zur Verfügung.

Die Steigung läßt sich m.E. nicht aus 2 sich benachbarenden Werten bestimmen, da diese ja Digitalisierungs-Sprünge (und anderen Mist) beinhalten können. Ich würde hier also die mittlere Steigung aus einer Anzahl Werten errechnen - somit läßt sich dann auch recht gut der (Zeit-)Punkt der Steigungs-Änderung bestimmen.

Vielleicht ein Ansatz ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mathematisch hört sich das nach der zweiten Ableitung deines Messwertverlaufes an.
Wenn dein Messwert nicht oder linear ansteigt oder ist die 2. Ableitung gleich Null.
Erst wenn die "Steigung" des Messwertes "ansteigt" nimmt die 2. Ableitung einen Wert größer Null an. Auf diese Bedingung könnte man dann triggern.

Zweimaliges differenzieren bei realen Messwerten ist aber etwas schwierig.
Der Messwert muss mit einem entsprechend dimensionierten Tiefpass ausreichend, aber nicht zu stark gefiltert werden.
 
@Thomas:
Da ich mich sehr viel mit dem Thema beschäftige würde mich da ein Lösungs-Vorschlag für den Tiefpass sehr interessieren. Stell doch mal was hier rein ...

Gruß
LL
 
@Thomas:
Da ich mich sehr viel mit dem Thema beschäftige würde mich da ein Lösungs-Vorschlag für den Tiefpass sehr interessieren. Stell doch mal was hier rein ...

Als Vertreter eines Tiefpasses gibt es z.B. in der Oscat Bibliothek die PT1 und PT2 Glieder (IIR-Filter).
Der PT1 als Filter 1. Ordnung (quasi eine 6 dB Frequenzweiche, ich komme eher von der Elektronik-Seite) und PT2 als Filter 2. Ordnung (12 dB).
Es gibt auch noch andere Möglichkeiten digitale Filter zu programmieren wie z.B. die FIR-Filter.

Als Einstieg in die digitale Signalverarbeitung kann man den DSP-Guide ( http://www.dspguide.com/ ) ganz gut lesen.
Wie ich finde auch ohne tiefergehende Mathe-Kenntnisse noch zu verstehen, damit ist es bei mir auch nicht weit her.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@larry:
danke schon mal, wie benutze ich den ob35? hab ihn angelegt, die hardware neu geladen, der ob ist aber leer, wie ruf ich den intervall dann in meinem FC auf, so dass ich damit die werte zeitintervallbedingt verschiebe?

@paule:
ich verschieb ja die den neuen wert immer alle 500ms über den alten, wann soll ich denn dann rechnen? also die werte addieren und teilen und vergleichen? nicht dass es da eine überschneidung gibt?

nioch ne frage:
kann ich auch mit dem taktmerker arbeiten? hab ihn als mb 70 angelegt.
 
Zuletzt bearbeitet:
Hallo Dennis,
der OB35 wird mit dem von dir in den CPU-Eigenschaften eingestellten Intervall aufgerufen. Es wird das von dem OB35 ausgeführt, was du dort hinein programmierst. Hier müßte also deine "Werte in DB"-Routine aufgerufen werden.

Ein Zeit-Intervall von 500 ms halte für viel zu langsam. Ich glaube nicht, dass du so die Steigungsänderung genau genug erfassen kannst.

Wie ich schon geschrieben habe würde ich hier einen ganzen Block von Werten aufnehmen und die dann auswerten. Mit nur 2 Werten (aktueller und letzter) halte ich die Chancen für eine erfolgreiche Auswertung für sehr niedrig.

Gruß
LL
 
hi
danke für die antwort,
wenn ich also in den ob35 folgendes schreibe:
U e0.0
= m1.0

wenn nun e0.0 immer 1 ist, dann wird der merker 1.0 immer alle 100ms high?

da der ob35 ja nur alle 100ms aufgerufen wird.
hab ich das so richtig verstanden?

das mit den 500ms ist mir auch zu lange, ist nur ein fiktiver zeitwert, so dass ich auch online sehe was passiert.
später wird es auf 100ms rauslaufen.


das mit den messwerten dürfte gehen, da das ganze an sich rehct langsam ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi
wenn ich also in den ob35 folgendes schreibe:
U e0.0
= m1.0

wenn nun e0.0 immer 1 ist, dann wird der merker 1.0 immer alle 100ms high?

da der ob35 ja nur alle 100ms aufgerufen wird.
hab ich das so richtig verstanden?

Nein,
der Merker M1.0 ist dann auch immer High!
Er wird ja nirgends zurückgesetzt. :D
 
ja richtig ist logisch, ich doofie :rolleyes:

und wie nutze ich dann diesen ob35 sinvoll und am besten?


hab noch ne frage,
wenn ich mit T1 per positive flanke immer den aktuellen messwert in einen anderen DB verschiebe.
diese werte dann addiere bzw teile,
also z.b.
nw1
pos t1
move db1.dbd0 //immer der aktuelle istwert vom analogeingang)
in
db1.dbd4 //speicherplatz

nw2
db1.dbd4
addiere
db1.dbd8
=
db1.dbd8

also so dass immer der aktuelle wert mit dem letzten summen ergebnis weiteraddiert wird.

wie verhindere ich dass er sich in nw2 totrechnet also mehrmals rechnet, er soll ja nur addieren wenn auch im nw 1 wieder ein neuer wert hinzukam, es soll aber auch keine überschneidung zu nw1 geben.

hoffe ich hab es verständlich ausgedrück?

er soll immer nur einmal addieren und dann wieder warten bis per t1 ein neuer wert in db1.dbd4 geschoben wird und dann addieren.
 
Zuletzt bearbeitet:
wie verhindere ich dass er sich in nw2 totrechnet also mehrmals rechnet, er soll ja nur addieren wenn auch im nw 1 wieder ein neuer wert hinzukam, es soll aber auch keine überschneidung zu nw1 geben.
Da gibt's verschiedene Möglichkeiten:

Entweder Du springst über NW 2 drüber, aber das willst Du ja nicht wegen der Überschneidung.
Oder Du verwendest die Flanke für NW 2 nochmal.
Oder Du machst die Flanke außerhalb und rufst damit den Baustein auf, der wird dann nur bearbeitet wenn ein neuer Messwertvorliegt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
guten morgen,

hmm..dachte eigentlich wenn ich die positive flanke von t1 in nw1 und nw2 nehme, dass ich da eventuell ne überschneidung habe oder in nw2 noch die alten werte genommen werden?

hab mir das so gedacht, dass ich mit pos T1 eine 2. zeit starte die 50ms verzögert eine positive flanke macht und dann in nw2 die werte addiert.
geht das auch.


kann mir jemand genaueres zu dem ob35 sagen wie man den verwendet?

danke

euch allen einen schönen, sonnigen tag schon mal
 
Zuletzt bearbeitet:
Hallo Dennis,
wie der OB35 funktioniert hatte ich dir schon geschrieben :
Hallo Dennis,
der OB35 wird mit dem von dir in den CPU-Eigenschaften eingestellten Intervall aufgerufen. Es wird das von dem OB35 ausgeführt, was du dort hinein programmierst.
weitere Hilfe dazu findest du natürlich auch noch in der Step7-Hilfe - es ist damit aber eigentlich alles gesagt ...

Gruß
LL
 
hi larry,
das hab ich ja gelesen, nur nicht so recht verstanden.

hab den ob35 auf 100ms eingestellt, die cpu eigenschaften hochgeladen.
nun mache ich eine bedingung in den ob35, der ob35 wird alle 100ms sekunden bearbeitet. also immer 100ms bearbeitet, 100ms nicht.
richtig soweit?

wie kann ich nun einen merker, den ich dort programmiere in einem anderen baustein z.b. fc5 als 100ms taktgeber verwenden
(in fc5 mache ich diese werte berechnung und die db moves)

das ist mir nicht so ganz klar.

p.s. in derhilfe hab ich geschaut, da steht nur drin, wie man den ob35 parametriert, usw.. nicht aber wie ich den inhalt dann korrekt benutze
 
Zuletzt bearbeitet:
Zurück
Oben