Drehzahlmessung

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab mal versucht deine obige empfehlung umzusetzten:
Code:
[FONT=Arial]    UN    "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     U     "Merker_Motor_Ein"[/FONT]
[FONT=Arial]     SPBN  M001[/FONT]
 
[FONT=Arial]     L     #OB1_PREV_CYCLE[/FONT]
[FONT=Arial]     L     #Zwischenspeicher[/FONT]
[FONT=Arial]     +I    [/FONT]
[FONT=Arial]     T     #Zwischenspeicher[/FONT]
 
 
 
[FONT=Arial]     U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     U     "Merker_Motor_Ein"[/FONT]
[FONT=Arial]     U(    [/FONT]
[FONT=Arial]     U(    [/FONT]
[FONT=Arial]     O(    [/FONT]
[FONT=Arial]     U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     BLD   100[/FONT]
[FONT=Arial]     FP    M     25.3[/FONT]
[FONT=Arial]     )     [/FONT]
[FONT=Arial]     O(    [/FONT]
[FONT=Arial]     U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]BLD   100[/FONT]
[FONT=Arial]     FN    M     25.3[/FONT]
[FONT=Arial]     )     [/FONT]
[FONT=Arial]     )     [/FONT]
[FONT=Arial]     NOT   [/FONT]
[FONT=Arial]     )     [/FONT]
 
[FONT=Arial]     SPBN  M001[/FONT]
 
[FONT=Arial]L     #Zwischenspeicher[/FONT]
[FONT=Arial]     T     "DB_V-Messung".Zeit_fuer_Umdrehung_OB1[/FONT]
 
 
 
[FONT=Arial]M001: NOP   0[/FONT]

Ich versteh aber nicht ganz warum du folgendes programmieren würdest:
wenn INI und nicht Flanke dann
Flanke bilden

L OB1_Prev_Cycle
L Zwischenspeicher
+D
T Zwischenspeicher
 
... du must doch dem Ding sagen, wann ein Umlauf rum ist und du die Zeit zur Drehzahlmessung verwerten möchtest. Das wäre nach meinem Vorschlag mit der pos. Flanke des INI's. Danach misst du dann einfach den nächsten Umlauf ... usw.

Was du da in dem Netztwerk mit dem BLD-Befehl veranstaltet hast verstehe ich nun nicht so ganz ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja ich hab selber schon gemerkt dass das recht schwachsinnig ist. Ich hab in fup irgendwas zusammengebastelt, dann in awl umgewandelt und in awl weiterprogrammiert da ich nicht wusste wie man einen flankensprung in awl programmiert.
Da ist das BLD wohl irgendwie reingeraten.
 
so siehts schon besser aus:
Code:
[FONT=Arial]     U     "Merker_Motor_Ein"[/FONT]
[FONT=Arial]     SPBN  M001[/FONT]
 
[FONT=Arial]     L     #OB1_PREV_CYCLE[/FONT]
[FONT=Arial]     L     #Zwischenspeicher[/FONT]
[FONT=Arial]     +I    [/FONT]
[FONT=Arial]     T     #Zwischenspeicher[/FONT]
 
[FONT=Arial]     U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     UN    M     25.4[/FONT]
[FONT=Arial]     SPBN  M001[/FONT]
 
[FONT=Arial]     U     "Merker_Motor_Ein"[/FONT]
[FONT=Arial]     SPBN  M002[/FONT]
 
[FONT=Arial]     L     #Zwischenspeicher[/FONT]
[FONT=Arial]     L     2[/FONT]
[FONT=Arial]     *I    [/FONT]
[FONT=Arial]     T     "DB_V-Messung".Zeit_fuer_Umdrehung[/FONT]
 
[FONT=Arial]     L     0[/FONT]
[FONT=Arial]     T     #Zwischenspeicher[/FONT]
 
[FONT=Arial]M001: U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     =     M     25.4[/FONT]
 
[FONT=Arial]M002: NOP   0[/FONT]

Die Drehzahl wäre dann ja einfach nur noch
Code:
L 6.00000000e+004
L "DB_V-Messung".Zeit_fuer_Umdrehung
ITD
DTR
/R
T "DB_V-Messung".Momentandrehzahl

oder???
Wie kann ich n das ganze am besten mit pcl_sim testen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Testen entweder einen langsamen Taktmerker drauf legen oder eben einen eigenen Blinker bauen in dem Du die Frequenz vorgeben kannst.

Um die Messung der Drehzahl noch verbessern würde ich eine Glättung einbauen und/oder nicht die Dauer einer Umdrehung sondern z.B. von 10 Umdrehungen messen dadurch verringerst Du den Einfluss der Zykluszeit Abweichung. Aber immer ein schritt nach dem anderen.
 
ja genau das mit der glättung hab ich mir auch schon überlegt. wäre ja recht einfach umzusetzen indem ich z.b. sage dass er mir den zwischenspeicher nur dann auf die zeit_fuer_umdrehung schieben soll wenn die neue zeit_fuer_umdrehung mehr als +/- 20ms von der zeit_fuer_umdrehung die gespeichert ist abweicht.
Meine Drehzahl ist allerdings nur 0-40 1/min und deswegen würde die messung von 10 umdrehungen zu lange dauern. Da man über ein stufenloses getriebe die geschwindigkeit regeln kann wäre das nicht so gut.
 
... oder du addierst die auf und teilst durch die Anzahl der Messungen ...

... oder du nimmst jeweils den aktuellen und letzten Wert als Summe und teilst durch 2 ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, ich hab wohl wieder irgendwo nen fehler programmiert. leider finde ich ihn nicht habe jetzt schon 3 stunden gesucht. sieht von euch jemand den fehler? Meine "Zeit_fuer_Umdrehung" wird nicht berechnet:
Code:
         U "Merker_Motor_Ein"
         SPBN M001
 
        L #OB1_PREV_CYCLE
        L #Zwischenspeicher
        +I
        T #Zwischenspeicher
 
        U "Sensor-Drehzahl"
        UN M 25.4
        SPBN M001
 
        U "Merker_Motor_Ein"
        SPBN M002
 
        L #Zwischenspeicher
        L 2
        *I
        ITD
        DTR
 
        L 1000
        /R
        T #Vergleichswert
 
        L #Vergleichswert
        T "DB_V-Messung".Zeit_fuer_Umdrehung
 
        L 0
        T #Zwischenspeicher
 
M001: U "Sensor-Drehzahl"
         = M25.4
 
M002: Nop 0
 
Ich würtde folgendes vorschlagen :
Code:
        U "Sensor-Drehzahl"
   [COLOR=magenta]     U  M 25.4
        SPB M001
[/COLOR]

Du willst ja auswerten, wenn der Ini da ist und der Flankenmerker noch nicht.
Ist Ini und FM da, dann überspringen ...
 
Ich glaubs nicht. Ich hab jetzt drei stunden lang mein netzwerk durchgeschaut und sobald ich das netzwerk ins forum gestellt hab seh ich den fehler gleich. :rolleyes:

Code:
 L #Zwischenspeicher
        L 2
        *I
        ITD
        DTR
 
        L 1000
        /R
        T #Vergleichswert

besser wäre wohl
Code:
 L #Zwischenspeicher
        L 2
        *I
        ITD
        DTR
 
        [COLOR=red]L 1.0000000e+003[/COLOR]
        /R
        T #Vergleichswert
 
Ich wollte jetzt mein netzwerk auslagern und zur übersichtlichkeit in einen fc stellen.
Leider funktioniert das irgendwie nicht. Ich schiebe die zykluszeit von ob1 einfach direkt immer in ein dbw. Im fc wird dann das dbw genommen und wie gewohnt aufaddiert.
aber leider addiert der mir irgendwie so schnell, ich weiß auch nicht.
Kann das so funktionieren oder ist das problematisch?
Im ob1 hat mein netzwerk nämlich spitze funktioniert. Ich habs eigentlich nur kopiert und in den fc eingefügt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du die AWL Quelle hier eingefügt hättest könnte man den Fehler suchen und müsste nicht raten ;o(

Hast Du daran gedacht das ein FC nur temporäre lokale Variablen hat un keine statischen. Also sowas wie den Zwischenspeicher muss dann von außen via VAR_IN_OUT an den FC zur Verfügung gestellt werden (oder FB nutzen, oder ganz schlecht eine Globale Variable im FC nutzen).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ihr habt ja recht, ich hab mein problem recht besch.... beschrieben. mein problem ist nämlich dass mein pg keinen netzwerkanschluss hat. deswegen muss ich mein netzwerk immer in word einfügen, mit nem usb-stick übertragen und kann das ganze dann erst ins forum stellen.

ok also folgendes:
meine messung lief am freitag hervorragend. dann habe ich ein paar datenformate ändern müssen und seitdem läuft die sache irgendwie nicht mehr so wie sie soll.
die zeit pro umdrehung soll immer wenn eine neue messung da ist überträgen werden, dann aber ein fester gespeicherter wert. im moment läuft die zeit immer weiter. ich versteh nicht warum der wert jetzt weiterläuft und ich freitag konstante werte hatte.
außerdem steht mein netzwerk jetzt im fc10. allerdings übertrage ich mein 0b1_prev_cycle mit globaldaten.

ob1:
Code:
[FONT=Arial]     CALL  "Systemsteuerteil"[/FONT]
[FONT=Arial]     CALL  "Drehzahlmessung"[/FONT]
[FONT=Arial]     CALL  "Geschwindigkeit"[/FONT]
[FONT=Arial]     CALL  "Stromüberwachung"[/FONT]
 
 
[FONT=Arial]     L     #OB1_PREV_CYCLE[/FONT]
[FONT=Arial]     T     "DB_V-Messung".Zykluszeit_OB1[/FONT]

fc10:
Code:
[FONT=Arial] U     "Merker_Motor_Ein"[/FONT]
[FONT=Arial]     SPBN  M002[/FONT]
 
 
[FONT=Arial]//Aufaddieren der Zykluszeit von 0b1 zum erhalten der Zeit für eine halbe Umdrehung in ms[/FONT]
 
[FONT=Arial]     L     "DB_V-Messung".Zykluszeit_OB1[/FONT]
[FONT=Arial]     L     #Zwischenspeicher[/FONT]
[FONT=Arial]     +I    [/FONT]
[FONT=Arial]     T     #Zwischenspeicher[/FONT]
 
 
[FONT=Arial]//Bedingung für weiteren Verlauf[/FONT]
 
[FONT=Arial]     U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     U     M     25.4[/FONT]
[FONT=Arial]     SPBN  M001[/FONT]
 
 
[FONT=Arial]//Berechnen der Zeit für Umdrehung in s (Datentyp real)[/FONT]
 
[FONT=Arial]     L     #Zwischenspeicher[/FONT]
[FONT=Arial]     L     2[/FONT]
[FONT=Arial]     *I    [/FONT]
[FONT=Arial]     ITD   [/FONT]
[FONT=Arial]     DTR   [/FONT]
 
[FONT=Arial]     L     1.000000e+003[/FONT]
[FONT=Arial]     /R    [/FONT]
[FONT=Arial]     T     #Vergleichswert[/FONT]
 
 
[FONT=Arial]//Schmitt-Trigger zum Stabilisieren aller folgenden Rechenwerte[/FONT]
 
[FONT=Arial]     L     #Vergleichswert[/FONT]
[FONT=Arial]     L     2.000000e-001[/FONT]
[FONT=Arial]     +R    [/FONT]
[FONT=Arial]     T     #oberer_Schaltpunkt[/FONT]
 
[FONT=Arial]     L     #Vergleichswert[/FONT]
[FONT=Arial]     L     2.000000e-001[/FONT]
[FONT=Arial]     -R    [/FONT]
[FONT=Arial]     T     #unterer_Schaltpunkt[/FONT]
 
[FONT=Arial]     L     #oberer_Schaltpunkt[/FONT]
[FONT=Arial]     L     #Vergleichswert[/FONT]
[FONT=Arial]     >R    [/FONT]
[FONT=Arial]     SPBN  M010[/FONT]
 
[FONT=Arial]     L     #Vergleichswert[/FONT]
[FONT=Arial]     T     "DB_V-Messung".Zeit_fuer_Umdrehung[/FONT]
 
[FONT=Arial]M010: L     #unterer_Schaltpunkt[/FONT]
[FONT=Arial]     L     #Vergleichswert[/FONT]
[FONT=Arial]     <R    [/FONT]
[FONT=Arial]     SPBN  M011[/FONT]
 
[FONT=Arial]     L     #Vergleichswert[/FONT]
[FONT=Arial]     T     "DB_V-Messung".Zeit_fuer_Umdrehung[/FONT]
 
 
[FONT=Arial]//Rücksetzten des Zwischenspeichers[/FONT]
 
[FONT=Arial]M011: L     0[/FONT]
[FONT=Arial]     T     #Zwischenspeicher[/FONT]
 
[FONT=Arial]M001: U     "Sensor-Drehzahl"[/FONT]
[FONT=Arial]     =     M     25.4[/FONT]
 
[FONT=Arial]M002: NOP   0[/FONT]

gibts jetzt kekse? *g*
 
ihr habt ja recht, ich hab mein problem recht besch.... beschrieben. mein problem ist nämlich dass mein pg keinen netzwerkanschluss hat. deswegen muss ich mein netzwerk immer in word einfügen, mit nem usb-stick übertragen und kann das ganze dann erst ins forum stellen.

...erzeuge eine quelle und exportier sie, die *.AWL kannst du dann mit dem editor öffnen, da brauch man noch nicht mal word UND alle daten sind vorhanden...


ob1:
Code:
[FONT=Courier New]
 
[/FONT] [FONT=Courier New]     CALL  "Systemsteuerteil"
[/FONT] [FONT=Courier New]     CALL  "Drehzahlmessung"
[/FONT] [FONT=Courier New]     CALL  "Geschwindigkeit"
[/FONT] [FONT=Courier New]     CALL  "Stromüberwachung"
 
 
[/FONT] [FONT=Courier New]     L     #OB1_PREV_CYCLE
[/FONT] [FONT=Courier New]     T     "DB_V-Messung".Zykluszeit_OB1[/FONT]

wenn du die zykluszeit am ende erst in deinen DB schreibst rechnest du immer mit der vorletzten zykluszeit ... erklärt zwar nicht das weiterlaufen ... :rolleyes:

fc10:
Code:
[FONT=Courier New] U     "Merker_Motor_Ein"
[/FONT] [FONT=Courier New]     SPBN  M002
 
 
[/FONT] [FONT=Courier New]//Aufaddieren der Zykluszeit von 0b1 zum erhalten der Zeit für eine halbe Umdrehung in ms
 
[/FONT] [FONT=Courier New]     L     "DB_V-Messung".Zykluszeit_OB1
[/FONT] [FONT=Courier New]     L     #Zwischenspeicher
[/FONT] [FONT=Courier New]     +I    
[/FONT] [FONT=Courier New]     T     #Zwischenspeicher[/FONT]

#zwischenspeicher ist vom typ INT und nicht TEMP :rolleyes: ... kann ich mir nicht vorstellen, also INT schon ... aber das es ein INOUT ist nicht, denn der aufruf in OB1 spricht eine andere sprache...

gibts jetzt kekse? *g*

kekse.jpg
 
sorry ich versteh nicht ganz:
#zwischenspeicher ist vom typ INT und nicht TEMP :rolleyes: ... kann ich mir nicht vorstellen, also INT schon ... aber das es ein INOUT ist nicht, denn der aufruf in OB1 spricht eine andere sprache...

ist ja ziemlich toll mit den quellen exportieren. Danke:p
Hier noch mal der komplette fc

Code:
FUNCTION "Drehzahlmessung" : VOID
TITLE =
VERSION : 0.1

VAR_TEMP
  Zwischenspeicher : INT ; 
  Vergleichswert : REAL ; 
  oberer_Schaltpunkt : REAL ; 
  unterer_Schaltpunkt : REAL ; 
END_VAR
BEGIN
NETWORK
TITLE =Stoppen der Zeit für eine Umdrehung

      U     "Merker_Motor_Ein"; 
      SPBN  M002; 

//Aufaddieren der Zykluszeit von 0b1 zum erhalten der Zeit für eine halbe Umdrehung in ms
      L     "DB_V-Messung".Zykluszeit_OB1; 
      L     #Zwischenspeicher; 
      +I    ; 
      T     #Zwischenspeicher; 

//Bedingung für weiteren Verlauf
      U     "Sensor-Drehzahl"; 
      U     M     25.4; 
      SPBN  M001; 

//Berechnen der Zeit für Umdrehung in s (Datentyp real)
      L     #Zwischenspeicher; 
      L     2; 
      *I    ; 
      ITD   ; 
      DTR   ; 
      L     1.000000e+003; 
      /R    ; 
      T     #Vergleichswert; 

//Schmitt-Trigger zum Stabilisieren aller folgenden Rechenwerte
      L     #Vergleichswert; 
      L     2.000000e-001; 
      +R    ; 
      T     #oberer_Schaltpunkt; 
      L     #Vergleichswert; 
      L     2.000000e-001; 
      -R    ; 
      T     #unterer_Schaltpunkt; 
      L     #oberer_Schaltpunkt; 
      L     #Vergleichswert; 
      >R    ; 
      SPBN  M010; 
      L     #Vergleichswert; 
      T     "DB_V-Messung".Zeit_fuer_Umdrehung; 
M010: L     #unterer_Schaltpunkt; 
      L     #Vergleichswert; 
      <R    ; 
      SPBN  M011; 
      L     #Vergleichswert; 
      T     "DB_V-Messung".Zeit_fuer_Umdrehung; 

//Rücksetzten des Zwischenspeichers
M011: L     0; 
      T     #Zwischenspeicher; 
M001: U     "Sensor-Drehzahl"; 
      =     M     25.4; 
M002: NOP   0; 

NETWORK
TITLE =Berechnen der Drehzahl

      L     6.000000e+001; 
      L     "DB_V-Messung".Zeit_fuer_Umdrehung; 
      /R    ; 
      RND   ; 
      DTB   ; 
      BTI   ; 
      T     "DB_V-Messung".Momentandrehzahl; 
NETWORK
TITLE =Schieben der Vergleichsdrehzahl
//Schiebt die momentane Drehzahl auf das DBW Vergleichdrehzahl
      U     "Merker_Motor_Ein"; 
      S     "HLM_Vergleichsdrehzahl"; 
      U     "HL_Timer_Vergleichsdrehz"; 
      R     "HLM_Vergleichsdrehzahl"; 
      NOP   0; 

      U(    ; 
      U     "HLM_Vergleichsdrehzahl"; 
      L     S5T#100MS; 
      SE    "Timer_Vergleichsdrehzahl"; 
      U(    ; 
      U     "HLM_Vergleichsdrehzahl"; 
      L     S5T#150MS; 
      SE    "HL_Timer_Vergleichsdrehz"; 
      U     "HL_Timer_Vergleichsdrehz"; 
      )     ; 
      R     "Timer_Vergleichsdrehzahl"; 
      U     "Timer_Vergleichsdrehzahl"; 
      )     ; 
      SPBNB _003; 
      L     "DB_V-Messung".Momentandrehzahl; 
      T     "DB_V-Messung".Vergleichsdrehzahl; 
_003: NOP   0; 
 
NETWORK
TITLE =Rücksetzen der DBD
//Schiebt eine 0 auf alle Geschwindigkeits- und Beschleunigungswerte falls sich 
//die Drehzahl ändert
//ändert.
      U(    ; 
      L     "DB_V-Messung".Momentandrehzahl; 
      L     "DB_V-Messung".Vergleichsdrehzahl; 
      <>I   ; 
      )     ; 
      SPBNB M004; 
      L     0.000000e+000; 
      T     "DB_V-Messung".Maximalgeschwindigkeit; 
      T     "DB_V-Messung".Durchschnittsgeschw; 
      T     "DB_V-Messung".Maximalbeschleunigung; 
      T     "DB_V-Messung".Durchschnittsbeschl; 
M004: NOP   0; 
 
END_FUNCTION
94316_kruemelmonster.jpg
 
Zurück
Oben