Zeitüberwachung

veritas

Level-1
Beiträge
207
Reaktionspunkte
14
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin,

ich habe 2 Initaoren, einen am Anfang und einem am Ende eines Laufbandes.
Ich möchte die Zeit überwachen wie lange das Paket braucht um von einem
zu den anderen Initiator braucht.

ich wollte die in einem DB schreiben.
immer 3 Zeiten sollen nacheinander in den BD, danach wieder DB löschen
und neu schreiben.

Kann mir einer da helfen?

Initator 1 ist E0.0
" 2 ist E0.1

Danke für eure Hilfe im voraus.


Mario
 
Code:
          U E 0.0
          FP Mx.x
          SPB ON
          U E 0.1
          FP Mx.x
          SPB OFF
          SPA Ende
 
      ON: Hier deine Zeit starten
 
          SPA Ende
 
     OFF: Hier deine Zeit stoppen in den DB schreiben.
             und die Zeit nullen.

so könnte man das lösen z.Bsp.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mach mal bei Gerhard weiter:
Code:
     U E 0.0
     FP Mx.x
     SPB ON
     U E 0.1
     FP Mx.x
     SPB OFF
     SPA ENDE
 
ON: U M 0.0 // Taktmerkerbyte
     FP M 1.0
     SPBN ENDE
     L DB1.DBD 0 // Zeitzähler
     L 100 // 100 Millisekunden
     +D
     T DB1.DBD0
     SPA ENDE
 
OFF: L #Zeiger
     L 4
     *I
     L 4
     +I
     SLD 3
     LAR1
     L DB1.DBD 0
     T DBW [AR1,p#0.0]  // Daten werden im selben DB ab Datenwort 4 abgelegt.
 
     L 0
     T DB1.DBD 0  // Zeit wieder löschen
     L #Zeiger // Zeiger auf nächstes freies Datenwort
     +1
     T#Zeiger
     L 2 
     <I
     SPB ENDE
     L 0
     T #Zeiger // nach drei von vorne beginnen
ENDE:NOP 0
 
Zuletzt bearbeitet:
Hallo,

ich will jetzt nicht als Spassbremse hereinplatzen. Aber die Überwachung, so wie es Paule Progammiert hat, wird nicht funktionieren. Es wird unter umständen maximale einmal gezählt, dann aber nicht mehr. Da ja im Absolut zum Ende gesprungen wird.
So müsste es jetzt funktionieren.
Code:
     U E 0.0
     FP Mx.x
     S M1.0 // Start Überwachungszeit
     U E 0.1
     FP Mx.x
     SPB OFF

     U M1.0 // Start Überwachungszeit
     U M0.0 // Taktmerker 10Hz
     FP Mx.x  
     SPBN ENDE
     L DB1.DBD 0 // Zeitzähler
     L L#100 // 100 Millisekunden
     +D
     T DB1.DBD0
     SPA ENDE
 
OFF:SET
     R M1.0 // Start Überwachungzeit 
     L #Zeiger
     L 4
     *I
     L 4
     +I
     SLD 3
     LAR1
     L DB1.DBD 0
     T DBW [AR1,p#0.0]  // Daten werden im selben DB ab Datenwort 4 abgelegt.
     L L#0
     T DB1.DBD 0  // Zeit wieder löschen
     L #Zeiger // Zeiger auf nächstes freies Datenwort
     +1
     T#Zeiger
     L 2 
     <I
     SPB ENDE
     L 0
     T #Zeiger // nach drei von vorne beginnen
ENDE:NOP 0
 
Hubert,

da hast Du natürlich Recht. :D
Ich habe das auch nur schnell von oben übernommen.
Klar muss das Startsignal gespeichert werden. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Natürlich könntest Du den Baustein dann auch noch aus dem OB35 heraus aufrufen.
OB35 in der Hardware auf 10ms stellen.
Dann könntest Du die Flanke mit dem 100ms Takt weglassen und die Zeit nicht um 100ms sondern um 10ms erhöhen.
Kommt drauf an wie genau das sein soll.
 
Es gibt auch noch die möglichkeit mit dem SFC64 "TIME_TCK" zu arbeiten
Code:
FUNCTION_BLOCK FB 7
TITLE =
VERSION : 0.1
 
VAR_INPUT
  IN_einlauf : BOOL ; //Sensor Einlauf
  IN_auslauf : BOOL ; //Sensor Auslauf
END_VAR
VAR_OUTPUT
  OUT_laufzeit : TIME ; //Laufzeit
END_VAR
VAR
  Einlauf : TIME ; //Einlauf
  Auslauf : TIME ; //Auslauf
  work : BOOL ; //Messung Arbeitet
END_VAR
BEGIN
NETWORK
TITLE =
 
NETWORK
TITLE =Einlauf
//Sensor Einlauf erfassen
      U     #IN_einlauf; 
      UN    #work; 
      SPBN  EEnd; 
//Systemzeit auslesen und in "Einlauf" speichern
      CALL "TIME_TCK" (
           RET_VAL                  := #Einlauf);
//Flanken auswertung für die Messung
      SET   ; 
      S     #work; 
EEnd: NOP   0; 
NETWORK
TITLE =Auslauf
//Sensor Auslauf erfassen
      U     #IN_auslauf; 
      U     #work; 
      SPBN  AEnd; 
//Systemzeit auslesen und in "Auslauf" speichern
      CALL "TIME_TCK" (
           RET_VAL                  := #Auslauf);
//Flankenauswertung rücksetzen
      SET   ; 
      R     #work; 
//Überlauf kontrollieren und Laufzeit ausrechnen
      L     #Einlauf; 
      L     #Auslauf; 
      <D    ; 
      SPBN  A001; 
      TAK   ; 
      L     L#2147483647; 
      +D    ; 
      L     #Auslauf; 
A001: -D    ; 
      T     #OUT_laufzeit; 
AEnd: NOP   0; 
END_FUNCTION_BLOCK

gruß helmut
 
Zuletzt bearbeitet:
Hallo Helmut,

deine Idee ist auch nicht schlecht. Ist mir auch schon in den Sinn gekommen, aber ich habe die Philosophie von Paule weitergemacht. Hab allerdings so wie ich deinen Programmauszug verstanden habe einen kleinen Denkfehler bei deiner Zeitermittlung gefunden. Im Normalfall ist dere Einlauf ja immer kleiner als der Auslauf, d.h. addierst immer die 2147483647 dazu, was immer zu einem falschen Wert führt. Ich hätte es so gelöst.

Code:
FUNCTION_BLOCK FB 7
TITLE =
VERSION : 0.1
 
VAR_INPUT
  IN_einlauf : BOOL ; //Sensor Einlauf
  IN_auslauf : BOOL ; //Sensor Auslauf
END_VAR
VAR_OUTPUT
  OUT_laufzeit : TIME ; //Laufzeit
END_VAR
VAR
  Einlauf : TIME ; //Einlauf
  Auslauf : TIME ; //Auslauf
  work : BOOL ; //Messung Arbeitet
END_VAR
BEGIN
NETWORK
TITLE =
 
NETWORK
TITLE =Einlauf
//Sensor Einlauf erfassen
      U     #IN_einlauf; 
      UN    #work; 
      SPBN  EEnd; 
//Systemzeit auslesen und in "Einlauf" speichern
      CALL "TIME_TCK" (
           RET_VAL                  := #Einlauf);
//Flanken auswertung für die Messung
      SET   ; 
      S     #work; 
EEnd: NOP   0; 
NETWORK
TITLE =Auslauf
//Sensor Auslauf erfassen
      U     #IN_auslauf; 
      U     #work; 
      SPBN  AEnd; 
//Systemzeit auslesen und in "Auslauf" speichern
      CALL "TIME_TCK" (
           RET_VAL                  := #Auslauf);
//Flankenauswertung rücksetzen
      SET   ; 
      R     #work; 
//Überlauf kontrollieren und Laufzeit ausrechnen
      L     #Auslauf;
      L     #Einlauf; 
      -D    ;
      L     L#0; 
      <D    ; 
      TAK   ; 
      SPBN  A001; 
      L     L#2147483647; 
      +D    ; 
A001: T     #OUT_laufzeit; 
AEnd: NOP   0; 
END_FUNCTION_BLOCK

Berichte mich wenn ich falsch liegt, aber so wird auch der Üblauf mirgerechnet.
 
Code:
FUNCTION_BLOCK FB 7
TITLE =
VERSION : 0.1


VAR_INPUT
  IN_einlauf : BOOL ;    //Sensor Einlauf
  IN_auslauf : BOOL ;    //Sensor Auslauf
END_VAR
VAR_OUTPUT
  OUT_laufzeit : TIME ;    //Laufzeit
END_VAR
VAR
  Einlauf : TIME ;    //Einlauf
  Auslauf : TIME ;    //Auslauf
  work : BOOL ;    //Messung Arbeitet
END_VAR
BEGIN
NETWORK
TITLE =Einlauf
//Sensor Einlauf erfassen
      U     #IN_einlauf; 
      UN    #work; 
      SPBN  EEnd; 
//Systemzeit auslesen und in "Einlauf" speichern
      CALL "TIME_TCK" (
           RET_VAL                  := #Einlauf);
//Flanken auswertung für die Messung
      SET   ; 
      S     #work; 
EEnd: NOP   0; 
NETWORK
TITLE =Auslauf
//Sensor Auslauf erfassen
      U     #IN_auslauf; 
      U     #work; 
      SPBN  AEnd; 
//Systemzeit auslesen und in "Auslauf" speichern
      CALL "TIME_TCK" (
           RET_VAL                  := #Auslauf);
//Flankenauswertung rücksetzen
      SET   ; 
      R     #work; 

NETWORK
TITLE =Überlauf kontrollieren und Laufzeit ausrechnen

      L     #Auslauf; 
      L     #Einlauf; 
      -D    ; 
      L     DW#16#7FFFFFFF; 
      UD    ; 
      T     #OUT_laufzeit; 
AEnd: NOP   0; 

END_FUNCTION_BLOCK

Gruss Daniel
 
Zurück
Oben