Drehzahlmessung

Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
//Bedingung für weiteren Verlauf
      U     #Drehzahlsensor; 
      U     #Flankenmerker; 
      SPB   M001;

Das hat nicht funktioniert, weill der Sprung nur ausgeführt wird, wenn INI da und FM da. sonst wird nicht gesprungen.
Du willst aber eigentlich Springen wenn INI nicht da oder FM da. Das war dann auch mein Vorschlag ...
 
das hier ist vielleicht noch interessant für dich zu wissen:

Der Flankenoperand FO hat in Step7® ein speicherndes Verhalten. Aus diesem Grund kann der Flankenoperand nur in Merkerbits, in Datenbits von Globaldatenbausteinen oder in statische Lokaldatenbits gespeichert werden.

Eine Ausnahme bilden Flankenoperanden die im Organisationsbaustein OB1 programmiert sind. Hier können Flankenoperanden in temporären Lokaldatenbits gespeichert werden. In Funktionsbausteinen FB und in Funktionen FC erzeugt die Speicherung eines Flankenoperanden in temporären Lokaldatenbits ein Fehlverhalten des Anwenderprogrammes.

Quelle
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi, ich hab meine zweipunktregelung gerade zum laufen gebracht.
1. habe ich auf die momentane zeit für umdrehung 20 addiert und 20 abgezogen und die ergebnisse dann wieder mit der momentanen zeit verglichen.:rolleyes: Jetzt speichere ich immer ne vergleichswert vom letzten zyklus.
2. hat meine bitverknüpfung überhaupt nicht gepasst.

Hier mal meine lösung, falls es euch interessiert:
Code:
FUNCTION_BLOCK "Drehzahlerrechnung"
TITLE =
VERSION : 0.1

VAR_INPUT
  Motor_Ein : BOOL ; 
  Zykluszeit : INT ; 
  Drehzahlsensor : BOOL ; 
END_VAR
VAR_OUTPUT
  Zeit_fuer_Umdrehung : REAL ; 
  Momentandrehzahl : INT ; 
END_VAR
VAR
  Zwischenspeicher : INT ; 
  Vergleichswert : REAL ; 
  unterer_Schaltpunkt : REAL ; 
  oberer_Schaltpunkt : REAL ; 
  Flankenmerker : BOOL ; 
  Zeit_f_Umdrehung : REAL ; 
END_VAR
BEGIN
NETWORK
TITLE =Stoppen der Zeit für eine Umdrehung

      U     #Motor_Ein; 
      SPBN  M002; 

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

//Bedingung für weiteren Verlauf
      UN    #Drehzahlsensor; 
      O     #Flankenmerker; 
      SPB   M001; 

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

//Schmitt-Trigger zum Stabilisieren aller folgenden Rechenwerte
      L     #Zeit_f_Umdrehung; 
      L     2.000000e-002; 
      +R    ; 
      T     #oberer_Schaltpunkt; 
      L     #Zeit_f_Umdrehung; 
      L     2.000000e-002; 
      -R    ; 
      T     #unterer_Schaltpunkt; 
      U(    ; 
      U(    ; 
      L     #oberer_Schaltpunkt; 
      L     #Vergleichswert; 
      >R    ; 
      )     ; 
      NOT   ; 
      O(    ; 
      U(    ; 
      L     #unterer_Schaltpunkt; 
      L     #Vergleichswert; 
      <R    ; 
      )     ; 
      NOT   ; 
      )     ; 
      )     ; 
      SPBNB M004; 
      L     #Zeit_f_Umdrehung; 
      T     #Zeit_fuer_Umdrehung; 
      T     #Vergleichswert; 

//Rücksetzten des Zwischenspeichers
M004: L     0; 
      T     #Zwischenspeicher; 
M001: U     "Sensor-Drehzahl"; 
      =     #Flankenmerker; 
      LOOP  M003; 

M002: L     0; 
      T     #Zwischenspeicher; 
      T     #Vergleichswert; 
      T     #Zeit_fuer_Umdrehung; 
      T     #Momentandrehzahl; 
M003: NOP   0; 
NETWORK
TITLE =Berechnen der Drehzahl

      L     6.000000e+001; 
      L     #Zeit_fuer_Umdrehung; 
      /R    ; 
      RND   ; 
      DTB   ; 
      BTI   ; 
      T     #Momentandrehzahl; 

END_FUNCTION_BLOCK
 
es gibt eine stelle in deinem code, die mir nicht gefällt

Code:
U    "Sensor-Drehzahl"

es handelt sich dabei ja offensichtlich um eine globale variable mit symbol...

nachteil: du kannst deinen baustein nicht wirklich in eine bibliothek ablegen und für andere anwendungen wieder auspacken, also nicht ohne zu prüfen ob "Sensor-Drehzahl" in dem anderen programm der globalen adresse in deinem aktuellen programm entspricht und diese ggf. anzupassen ... auch kannst du so nicht mehrere drehzahlmessungen in einer CPU realisieren :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi, ich brauch noch ne kleine ergänzung, komm aber nicht klar.
ich möchte in meinem fb sowas wie ein statusbit, als ausgang der 1 ist, wenn eine änderung erfolgt, also der zweipunktregler 1 ist, und meine neue zeit_fuer_umdrehung schiebt. Drum hab ich folgendes ergänzt:

Code:
 U(    ; 
      U(    ; 
      L     #oberer_Schaltpunkt; 
      L     #Vergleichswert; 
      >R    ; 
      )     ; 
      NOT   ; 
      O(    ; 
      U(    ; 
      L     #unterer_Schaltpunkt; 
      L     #Vergleichswert; 
      <R    ; 
      )     ; 
      NOT   ; 
      )     ; 
      )     ; 
      SPBNB M004; 
 
      [COLOR=red]FP   #HM_Aenderung[/COLOR]
[COLOR=red]     =    #Aenderung[/COLOR]
      L     #Zeit_f_Umdrehung; 
      T     #Zeit_fuer_Umdrehung; 
      T     #Vergleichswert; 
 
//Rücksetzten des Zwischenspeichers
M004: L     0; 
      T     #Zwischenspeicher; 
M001: U     "Sensor-Drehzahl"; 
      =     #Flankenmerker; 
      LOOP  M003; 
 
M002: L     0; 
      T     #Zwischenspeicher; 
      T     #Vergleichswert; 
      T     #Zeit_fuer_Umdrehung; 
      T     #Momentandrehzahl; 
M003: NOP   0;

Allerdings geht meine CPU jetzt wegen eines bereichslängenfehlers immer in stop. Wie würdet ihr mein problem lösen?
 
hast du den aufrufenden baustein auch nochmal hochgeladen? und den instanz-db? schließlich hast du ja eine lokaldaten-änderung vorgenommen...
 
oops, ich hab in meinem fc den aufruf zum fb zwar geändert, aber dadurch dass ich meinen fb noch mal leicht umstrukturiert habe, hat er den aufruf wohl nicht akzeptiert.
Leider funktioniert mein programm aber auch nicht.
#Aenderung ist immer 0 und geht nie auf 1 :confused:
 
und wie sollte ich das dann lösen?
ich bin schon seit 9 uhr am kämpfen. Leider fällt mir keine andere lösung ein. Wenn mein zweipunktregle auslöst, hab ich doch ne flanke... ahh, das problem liegt darin dass mein #HM_Aenderung einmal auf 1 geht und dann nie mehr auf null gehen kann oder. Desshalb kann er auch keine positive flanke registrieren oder?
Wie kann ich denn dann dieses problem lösen?

....
FB #Aenderung
= #Aenderung ????
 
FP #Aenderung
= #Aenderung ????

so nicht! pfui pfui pfui :ROFLMAO:

eine möglichkeit wäre das setzen... doch wann rücksetzen?
du kannst im FB setzen, mußt dann aber auch da rücksetzen
ODER
du beschaltest deinen ausgang im aufrufenden baustein mit einem merker der im darauffolgend netzwerk etwas setzt, das dir zeigt das eine aenderung stattfand ... und dann vielleicht nach einer zeit zurücksetzen ... weiß ja nicht, wie du den fakt der änderung weiter verarbeiten möchtest
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich habs schon versucht mit einem flipflop bin aber auch gescheitert.
diese variante wäre mir am liebsten.
ich muss einige werte rücksetzen sobald eine änderung erfolgt. das will ich mit diesem statusbit machen.
Code:
 U(    ; 
      U(    ; 
      L     #oberer_Schaltpunkt; 
      L     #Vergleichswert; 
      >R    ; 
      )     ; 
      NOT   ; 
      O(    ; 
      U(    ; 
      L     #unterer_Schaltpunkt; 
      L     #Vergleichswert; 
      <R    ; 
      )     ; 
      NOT   ; 
      )     ; 
      )     ; 
      [COLOR=red]SPBNB M005; [/COLOR]
 
      [COLOR=red]S    #Aenderung[/COLOR]
      L     #Zeit_f_Umdrehung; 
      T     #Zeit_fuer_Umdrehung; 
      T     #Vergleichswert; 
      [COLOR=red]Loop M004[/COLOR]
 
//Rücksetzten des Zwischenspeichers
[COLOR=red]M005: R   #Aenderung[/COLOR]
 
M004: L     0; 
      T     #Zwischenspeicher; 
M001: U     "Sensor-Drehzahl"; 
      =     #Flankenmerker; 
      LOOP  M003; 
 
M002: L     0; 
      T     #Zwischenspeicher; 
      T     #Vergleichswert; 
      T     #Zeit_fuer_Umdrehung; 
      T     #Momentandrehzahl; 
M003: NOP   0;
 
Zuletzt bearbeitet:
ich muss einige werte rücksetzen sobald eine änderung erfolgt. das will ich mittels dieses statusbits machen.

dann müßte

Code:
SPBNB   M005;
FP   #HM_aenderung
=     #aenderung

eigentlich reichen

mit dem am ausgang hängenden Merker dann

Code:
U   "Aenderung"
R   "rückzusetzendes1"
R   "rückzusetzendes2"
R   "rückzusetzendes3"

wobei durch FP nur eine änderung und keine stetige aenderung erkannt wird ... läßt du die flankenauswertung weg wird jede änderung erkannt
 
ja genau,
ich habs gerade auch hinbekommen.
ich hab das obige netzwerk noch mal programmiert und hab dann vor das rücksetzten ne flankenauswertung programmiert, weil die obige funktion ja keine flankenauswertung aufweist.
Code:
U      "Drehzahl_Änderung
FP     "HM_Drehzahl_Änderung"
L       0
T       DB10.dbd0
 
Zurück
Oben