Drehzahlmessung

Zuviel Werbung?
-> Hier kostenlos registrieren
sorry ich versteh nicht ganz
TEMP
Temporäre Daten sind Lokaldaten eines Bausteins, die während der Bearbeitung eines Bausteins im Lokaldaten-Stack (L-Stack) abgelegt werden und nach der Bearbeitung nicht mehr verfügbar sind.

...da du sie aber brauchst, weil du möchtest ja auf den wert vom vorhergehenden zyklus addieren müssen diese lokaldaten nach der bearbeitung verfügbar sein ...

also z.B.

INOUT
Durchgangsparameter gibt es bei Funktionen und Funktionsbausteinen. Mit Durchgangsparametern werden Daten an den aufgerufenen Baustein übergeben, dort verarbeitet, und die Ergebnisse vom aufgerufenen Baustein wieder in der gleichen Variablen abgelegt.

oder eben global ...
 
meine flankenauswertung funktioniert aber irgendwie auch nicht.
mein netzwerk ab "Bedingung für weiteren Verlauf" ist immer aktiv sobald "Sensor-Drehzahl" da ist.
Der fragt anscheinend keine flanke ab!
Ich hab jetzt auch in ob1 mein Lade-transferiere nach vorne geschoben, dass die aktuelle zykluszeit addiert werden kann und nicht die vorhergehende.
 
sorry, ich steh leider immer noch auf dem schlauch.
wenn ich doch jetzt meine zykluszeit in ob1 als erstes übertrage, dann müsste mein programm doch ohne probleme laufen. ich verwende doch nur bits aus dem aktuellen zyklus.
 
eine flankenauswertung besteht eben nicht nur aus bits aus dem aktuellen zyklus ... dazu sollte man sich mal anschauen wie die CPU arbeitet:

1. Prozessabbild Eingänge lesen
2. Bearbeitung
3. Prozessabbild Ausgänge schreiben

... in der informatik nennt man das EVA :rolleyes:

das heißt eine flankenauswertung passiert zyklusübergreifend und muß dementsprechend über mehrer zyklen vorhanden sein
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja aber mein "Sensor-Drehzahl" und mein Merker 25.4 sind doch beides zyklusübergreifende bestandteile. da müsste die flankenauswertung doch funktionieren.
 
finde die FP oder FN nicht in deinem FC ... hmm, also:

Code:
U   E0.0        //soll auf flanke geprüft werden
FP  #help_flag  //muß zyklusübergreifend da sein (INOUT, STAT(FB) oder global
=   #irgendwas  //nur einen zyklus an
 
... ihr habt das TEMP-Thema ein bißchen ignoriert ...

Stift nimmt zur Berechnung der Zeiten etc. TEMP-Variablen aus dem FC10. Die sind mit dem nächsten FC10-Aufruf nicht mehr brauchbar ... Das war im OB1 anderes gewesen.
Ergo : Du musst hier für Flanke und Zwischenwert etc. natürlich auch Global-Daten nehmen ... oder noch schöner ... du baust alles in einen FB und hinterlegst deine relevanten Sachen im STAT-Bereich. Dann fluppt das auch ...

Gruß
LL

Nachsatz: Vielleicht habe ich (jetzt auf die Schnelle) auch etwas überlesen, was ihr schon hattet - glaube ich aber nicht wirklich ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ihr habt das TEMP-Thema ein bißchen ignoriert ...

Nachsatz: Vielleicht habe ich (jetzt auf die Schnelle) auch etwas überlesen, was ihr schon hattet - glaube ich aber nicht wirklich ...

ich würde sagen: überlesen ... is doch aber nicht schlimm :rolleyes:

#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...
 
... hast ja recht ... Beitrag #41 von dir ...
Aber die Sache FB kontra FC finde ich in diesem Zusammenhang gar nicht so schlecht ...
 
... hast ja recht ... Beitrag #41 von dir ...
Aber die Sache FB kontra FC finde ich in diesem Zusammenhang gar nicht so schlecht ...

das könnte man mal abwägen, japp *ACK* ... da fällt mir die frage ein, die mir schon lange unter den nägeln brennt: was soll die CPU sonst noch machen? wenn sie wirklichst nur für die drehzahl-dingens ist, könnte man das auch alles global machen ... egal: nachteil FC: kann nich speichern, also alles was du späters brauchst mußt du irgendwo ablegen ... also stift, prüfe mal, ob du vielleicht mit einem FB besser fährst ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
was soll die CPU sonst noch machen? wenn sie wirklichst nur für die drehzahl-dingens ist, könnte man das auch alles global machen ...
Mit der CPU steuere ich einen Motor, messe die Drehzahl des Getriebes, Errechne die Beschleunigung und die Verfahrgeschwindigkeit eines Tischen und fahre eine Strommessung bei 4 steckdosen, deren min und max strom man über ein touch-panel einstellen kann.

also stift, prüfe mal, ob du vielleicht mit einem FB besser fährst ...
ein fb ist echt besser... den hab ich jetzt auch gleich erstellt aber leider funktioniert die sache immer noch nicht. mein zwischenwert wird nach jedem zyklus auf null gesetzt und bei allen zeilen beim programm-teil "schmitt-trigger" ist vke überall 1. :confused:

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 ; 
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
      U     #Drehzahlsensor; 
      U     #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     #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     #Zeit_fuer_Umdrehung; 
M010: L     #unterer_Schaltpunkt; 
      L     #Vergleichswert; 
      <R    ; 
      SPBN  M011; 
      L     #Vergleichswert; 
      T     #Zeit_fuer_Umdrehung; 
 
//Rücksetzten des Zwischenspeichers
M011: L     0; 
      T     #Zwischenspeicher; 
M001: U     "Sensor-Drehzahl"; 
      =     #Flankenmerker; 
M002: NOP   0; 
NETWORK
TITLE =Berechnen der Drehzahl
 
      L     6.000000e+001; 
      L     #Zeit_fuer_Umdrehung; 
      /R    ; 
      RND   ; 
      DTB   ; 
      BTI   ; 
      T     #Momentandrehzahl; 
 
END_FUNCTION_BLOCK

ich habe auch schon folgendes probiert:
Code:
...
//Bedingung für weiteren Verlauf
      U     #Drehzahlsensor; 
      FP    #Flankenmerker; 
      SPB   M001;
 
...
 
M001: U     "Sensor-Drehzahl"; 
      =     #Flankenmerker;

hat aber auch nicht funktionert
 
Zuletzt bearbeitet:
tausche mal den inhalt von marke M010 und M011 und passe die sprünge entsprechend an ... das laden von 0 wird immer durchgeführt ...
 
... ist für mich logisch, was da passiert ...

Wenn dein INI "Drehzahlsensor" nicht da ist, dann solltest du auch nach M001 springen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
den programmteil "Schmitt-Trigger" hab ich jetzt mal ausgeklammert und habe auch programmiert dass ich zu m001 springe sobald "Sensor-Drehzahl" nicht da ist.
Jetzt ist folgendes:
Solange "Sensor-Drehzahl" da ist wird mein zwischenspeicher in jedem zyklus auf null gesetzt. Man sieht außerdem den wert direkt d.h. er wird nicht einmal bei steigender flanke auf mein dbd gelegt, welches ich über den fb ansteuere sondern er wird in jedem zyklus geschoben.
Sobald "Sensor-Drehzahl" nicht mehr da ist wird mein zwischenspeicher wie gewohnt erhöht. Kommt aber der "sensor-Drehzahl wieder wird alles wieder auf null gesetzt.
 
das war die lösung.
bis auf den schmitt-trigger funktioniert jetzt alles. aber den bekomm ich auch noch zum laufen. danke!
:s18:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... nicht verzagen ... Larry fragen ...

Was klappt den an deinem "Schmitt-Trigger" nicht ?
Das Code-Segment sah für mich erstmal nicht schlecht aus ...
Aber ... was war der Sinn des Ganzen ...? Glättung der Werte ?
Das Ginge auch schön mit :
Code:
L  letzter_Messwert
L  neuer_Messwert
+  R
L  2.0
/  R
T  neuer_Messwert
 
ich versuch erst mal selbst den fehler im schmitt-trigger zu finden.
aber jetzt mal ne blöde frage:
wieso hat die flankenauswertung mit
Code:
U "Sensor-Drehzahl"
U #Flankenmerker
SPA ....
in OB1 funktionert und in meinem FB dann plötzlich nicht mehr trotz statischer variable für den flankenmerker
 
ich habe auch schon folgendes probiert:
Code:
...
//Bedingung für weiteren Verlauf
      U     #Drehzahlsensor; 
      FP    #Flankenmerker; 
      SPB   M001;
 
...
 
M001: U     "Sensor-Drehzahl"; 
      =     #Flankenmerker;
hat aber auch nicht funktionert

das kann auch nicht funktionieren ... den flankenmerker zu beschreiben macht keinen sinn und die operation auch z.T. funktionsunfähig ... denn wie die hilfe weiß wird in diesem bit der zustand gespeichert ...

FP <Bit> (Flanke Positiv) erkennt eine steigende Flanke, wenn das VKE von "0" auf "1" wechselt und zeigt dies mit VKE = 1 an.

Während eines jeden Programmzyklus wird der Signalzustand des VKE-Bits mit dem Signalzustand des VKE-Bits des vorherigen Zyklus verglichen, um Änderungen des Zustands festzustellen. Um den Vergleich ausführen zu können, muß der vorherige VKE-Zustand in der Adresse des Flankenmerkers (<Bit>) gespeichert werden. Unterscheidet sich der aktuelle Signalzustand des VKE-Bits vom vorherigen Zustand ("0") (Erkennung einer steigenden Flanke), ist das VKE-Bit nach dieser Operation "1".
 
Zurück
Oben