Frage zu FB

der_iwan

Level-2
Beiträge
138
Reaktionspunkte
15
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und guten Tag
Ich möchte beim fahren eines Zylinders wissen, wann keine Bewegung mehr stattfindet.
Dann soll nach Ablauf einer gewissen Zeit die momentane Position als Nullpunkt übernommen werden.

Meine bisherigen Ergebnisse:

Code:
FUNCTION_BLOCK FB 2
TITLE =Nullpunktübernahme
VERSION : 0.1
 
VAR_INPUT
  Taktmerker : BOOL ; //Taktmerker der CPU
  Start : BOOL ; //Startbedingung
  Wert_Weg : REAL ; //Wegpunkt des FA's
  Multiplkator : REAL ; //Wert_Weg mal diesen Wert (besseres Rechnen)
  Zeit_OK : INT ; //Nach wieviel Sekunden Nullpunktübernahme
END_VAR
VAR_OUTPUT
  Weg_gut : BOOL ; //Weg kann übernommen werden
END_VAR
VAR
  Weg_positiv : REAL ; //Wegpunkt bei positiver Flanke
  Weg_negativ : REAL ; //Wegpunkt bei negativer Flanke
  HM_Flanke_pos : BOOL ; //Hilfsmerker positive Flanke
  HM_Flanke_neg : BOOL ; //Hilfsmerker negative Flanke
  intern_Zeit : INT ; //interne Zeit abgelaufen
END_VAR
BEGIN
NETWORK
TITLE =
      UN    #Start; //wenn kein Nullpunkt übernommen werden soll
      R     #Weg_gut; //Rücksetzte Nullpunkt übernommen Bit
      L     0;      //  L 0 
      T     #intern_Zeit; //setze Zeit auf Null 
      SPB   ende; //Springe zum Ende
 
 
      U     #Taktmerker; //Wenn Taktmerker pos
      U     #Start;  //und Nullpunkt soll übernommen werden
      SPBN  test; //wenn nicht springe zum negativ
 
      L     #Wert_Weg; //lade aktuellen Wegpunkt
      T     #Weg_positiv; //transfer
      SPA   gut; 
test: UN    #Taktmerker; 
      U     #Start; 
      SPBN  ende; 
      L     #Wert_Weg; 
      T     #Weg_negativ; 
      SPA   gut; 
gut:  L     #Weg_positiv; 
      L     #Weg_negativ; 
      ==R   ; 
      SPBN  ende; 
      U     #Taktmerker; 
      FP    #HM_Flanke_pos; 
      U     #HM_Flanke_pos; 
      L     #intern_Zeit; 
      +     1; 
      T     #intern_Zeit; 
      L     #intern_Zeit; 
      L     #Zeit_OK; 
      ==I   ; 
      SPBN  ende; 
      =     #Weg_gut; 
ende: NOP   0; 
 
 
END_FUNCTION_BLOCK
Die Erfassung des Weges klappt wie von mir erwünscht aber:
Die Bearbeitung bleibt bei U #Taktmerker; stehen.
Was mache ich da nicht richtig

der_iwan
 
Code:
 U     #Taktmerker;        
FP    #HM_Flanke_pos;       
 U     #HM_Flanke_pos;       
 L     #intern_Zeit; <-- wird immer bearbeitet, unabhängig vom VKE       
+     1;        
T     #intern_Zeit;        
L     #intern_Zeit;        
L     #Zeit_OK;        
==I   ;        
SPBN  ende;        
=     #Weg_gut;  ende: NOP   0;
_______________________________--
 
Hallo und vielen Danl für deine Antwort, aber:
#intern_Zeit
bleibt immer bei 1 stehen

der_iwan

joah, weil:
Code:
*
      UN    #Start; //wenn kein Nullpunkt übernommen werden soll
      R     #Weg_gut; //Rücksetzte Nullpunkt übernommen Bit
      [COLOR="Red"][B]L     0;      //  L 0 
      T     #intern_Zeit;[/B][/COLOR] //setze Zeit auf Null 
      SPB   ende; //Springe zum Ende

bei jedem aufruf #interne_Zeit auf 0 gesetzt wird... 0+1 = 1 ... das flackern bekommste gar nich mit :rolleyes:
 
Ich habe die Änderung:
Code:
 U     #Taktmerker;        
FP    #HM_Flanke_pos;       
 U     #HM_Flanke_pos;       
 L     #intern_Zeit; <-- wird immer bearbeitet, unabhängig vom VKE       
+     1;        
T     #intern_Zeit;        
L     #intern_Zeit;        
L     #Zeit_OK;        
==I   ;        
SPBN  ende;        
=     #Weg_gut;  ende: NOP   0;
mal zum schauen so geändert:
Code:
//      U     #Taktmerker
      U     M      1.7
//      FP    #HM_Flanke_pos
      FP    M    156.0
//      U     #HM_Flanke_pos
      U     M    156.0
//    L     #intern_Zeit                // <-- wird immer bearbeitet, unabhängig vom VKE       
      L     MW   234
      +     1
//  T     #intern_Zeit
      T     MW   234
      L     #intern_Zeit
      L     #Zeit_OK
      ==I   
      SPBN  ende
      =     #Weg_gut
Da mein Taktmerker Mx.7 ist müsste doch alle zwei Sekunden sich der Wert von #intern_zeit um 1 erhöhen, oder?
Das macht er aber nicht, er erhöht sich rasend schnell.:confused:

@ vierlagig
aber er soll doch nur die 0 dahin schreiben wenn die Startbedingung nicht erfüllt ist?
Startbedingung ist aber immer erfüllt

der_iwan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also 1.

wenn du eine flanke baust:

Code:
*
     U     #xTrigger
     FP    #xHelpFlag

dann ist das VKE der flankenAUSWERTUNG das der flankenoperation. d.h. obigen code so weiter verwenden:

Code:
*
     U     #xTrigger
     FP    #xHelpFlag
     SPB   irgendwohin

macht, dass bei positiver flanke an "#xTrigger" "irgendwohin" gesprungen wird.

bei deinen konstrukten, zur veranschaulichung nochmal aufgeschrieben:

Code:
*
     U     #xTrigger
     FP    #xHelpFlag
     U     #xHelpFlag

wird das VKE durch den flanken-hilfsmerker gebildet, dieser dient bei einer flankenauswertung aber nun mal dazu den wert von #xTrigger aus dem aktuellen zyklus für den nächsten zyklus bereitzustellen bzw. den letzten wert für den aktuellen zyklus und damit für den vergleich mit #xTrigger(neu) zur verfügung zu stellen, damit überhaupt eine flanke gebildet werden kann. soll heißen: wenn #xTrigger über mehrere zyklen true ist, dann ist es #xHelpflag auch, da es immer den aktuellen wert repräsentiert.

und 2.

lade und transferbefehle sind VKE-unabhängig, d.h. sie müssen übersprungen werden, wenn sie nicht ausgeführt werden sollen.

z.B.:
Code:
*
     U     #xTrigger
     FP    #xHelpFlag
     SPBN  irgendwohin
     L      0
     T      #iDestination

ermöglicht, dass die 0 nur bei einer positiven flanke an #xtrigger in #iDestination transferiert wird.
 
Zuletzt bearbeitet:
Zurück
Oben