Bremszeitmessung

S Neumann

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Muss für einen Prüfstand eine Bremszeiterfassung programmieren.
Habe je ein Start / stopsignal zur Verfügung.

Mein Problem ist, dass die Verfahrensweise mit Takmerkern zu ungenau ist, weil ich auf ein paar 100stel Sekunden genau arbeiten muss.

Der Messwert wird in einem Datenbaustein zwischengespeichert und von dort aus in einem OP77a angezeigt.

Meine CPU ist eine 313c V2.6.1

Gibt es keinen fertigen Baustein für solche Anwendungen?
Ich meine, dass ist doch fast ne Standartanwendung, oder?
 
Da wist Du schon selbst was schreiben müssen.
Such mal im Forum, hier gibts ein schönes Beispiel zur Zeitmessung mittels Systemzeit auslesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe versucht, den BCD-Ausgang einer vorhandenen Einschaltverzögerung in Real umzuwandeln.

Wollte dann, den Istwert von dem Startwert der Zeitverzögerung subtrahieren, um die Bremszeit zu erhalten.

Diese Real-Bremszeit wollte ich nach Integer Umwandeln um sie so in dem DB abzulegen.

Aber die Sache mit der Minusrechnung funktioniert irgendwie nicht! Kann mir einer sagen Warum?

Code:
L #bremszeit_bcd // BCD-Zeit von der Everz
BTD // Umwandlung nach
DTR // REAL
L 9.000000e+000 // Startwert der Everz
-R // Subtraktion
RND // Runden des Wertes auf Ganzzahl (Int)
T #Messwert_Bremszeit // Transferieren zum DB
Code:

ich bekomme IMMER 9 angezeigt, obwohl eigentlich eine -Differenz rauskommen müsste!! *seufz*
 
Nimm den SFC1

Lies die Zeit damit beim Start in Variable 1 (Achtung, nutze eine DT in einem DB)
Lies die Zeit beim Stop in Variable 2.
Nimm dann den FC 8 aus der "Standard Library/IEC Funktion Blocks" und extrahiere aus Variable 1 und 2 die Zeit. Da kommt ein DWORD (TOD) heraus.
Diese beiden kannst du direkt voneinander subtrahieren und hast dann die Differenz in Millisekunden. Achtung, über den Tageswechsel hinaus kommt so natürlich murks raus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das ist natürlich blöd.:???:
Der Prüfstand muss mehrere Tage durchlaufen.
Teilweise sogar einige wochen.

Nur die Differenzmessung darf nicht über die Tagesgrenze gehen. Weil um Null Uhr, die TOD auf 0 geht, die Differenz dann falsch wäre. Mit etwas Logikprogrammierung kann man das verhindern, außerdem kann man auch noch die Tagedifferenz bilden und dann eine größere Differenz ausrechnen.
 
und wie kann ich das jetzt machen?
wie Funktioniert das ganze?

warum funktioniert das mit der einfacheren differenzrechnung nicht?
 
Zuletzt bearbeitet:
Noch besser, nimm FC34, der dann kannst du gleich Variable 1 und Variable 2 nutzen :ROFLMAO:.

Wie oben beschrieben:
Flanke bei Start, SFC1 aufrufen, Variable 1 am SFC1.
Flanke bei Stop, SFC1 aufrufen, Variable 2 an SFC1.
Anschließend FC34 mit Variable 1 und 2 aufrufen, Ergebnis ist im Format Time.

Die Funktion FC 34 subtrahiert zwei Zeitpunkte (Format DT) und liefert als Ergebnis eine Zeitdauer (Format TIME).Die Zeitpunkte müssen in Bereich von DT#1990-01-01-00:00:00.000 und DT#2089-12-31-23:59:59.999 liegen. Die Funktion führt keine Eingangsprüfung durch. Ist der erste Zeitpunkt (Parameter T1) größer (jünger) als der zweite (Parameter DT2), ist das Ergebnis positiv; ist der erste Zeitpunkt kleiner (älter) als der zweite, ist das Ergebnis negativ. Liegt das Ergebnis der Subtraktion außerhalb des TIME-Zahlenbereichs, wird das Ergebnis auf den entsprechenden Wert begrenzt und das Binärergebnis BIE auf ”0" gesetzt.

Parameter Deklaration Datentyp Speicherbereich Beschreibung
DT1 INPUT DATE_AND_TIME D, L Erster Zeitpunkt im Format DT
DT2 INPUT DATE_AND_TIME D, L Zweiter Zeitpunkt im Format DT
RET_VAL OUTPUT TIME E, A, M, D, L Differenz im Format TIME
Die Eingangsparameter können nur mit einer symbolisch definierten Variablen belegt werden.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Da gibt es extra in der SPS schon etwas dafür.
glaub mit FC 34 aus den iec der stdlibs.
Als ersten Wert (Date and Time) musst du da die Zielzeit eintragen, Als zweiten Wert die Startzeit und das Ergebniss erhaltest du komplett schon als Time.
Kannst es direkt als Time an dein OP übergeben.

Die Systemzeit (Date and Time) kannst du über den SFC1 der System Funkcion Blocks der Standart Libary aufrufen.

Edit: Ups sorry, hatte es eine halbe Stunde bei mir auf den Bildaschirm,
Ralle hat es schon beantwortet
 
Vielen Dank an euch beide

das sieht schonmal gut aus.

und jetzt für ganz dumme (mich:) ) Wie kann ich die BCD Zeit der Everz auf date and time umwandeln? Oder wie kann ich mir die Bremszeit holen?

muss auch unbedingt den Ausgang auf Integralzahlen umwandeln können, da die daten in diesem Format auch über CP340 auf einen Pc übertragen werden
 
Zuletzt bearbeitet:
Vielen Dank an euch beide

das sieht schonmal gut aus.

und jetzt für ganz dumme (mich:) ) Wie kann ich die BCD Zeit der Everz auf date and time umwandeln? Oder wie kann ich mir die Bremszeit holen?

Ich versteh deine Frage nicht, den Everz brauchst du nicht.

Du brauchst zwei Flanken, eine bei Start Bremsen, eine bei Stop Bremsen, zwei Variablen vom Format "Date and Time" in einem DB (weil, die sind 8 Byte lang) und eine vom Format Time für das Ergebnis der Subtraktion.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um einfach Zeitmessungen mit einem SE-Timer zu machen :
LC T 1 //Zeitwert laden
L W#16#FFF //Zeitgruppe ausmaskieren
UW
BTI //Nach Integer wandeln
L 990 //Vom Maximalwert 990 Millisekunden
TAK //abziehen
-I
T "Daten_OP".StepTime1 //Laufzeit in Millisekunden

Bei mir funktioniert es so.
Fehler in der Zeit halt +/- 1 Digit = 10 ms.
 
Vielen Dank an euch beide

das sieht schonmal gut aus.

und jetzt für ganz dumme (mich:) ) Wie kann ich die BCD Zeit der Everz auf date and time umwandeln? Oder wie kann ich mir die Bremszeit holen?

muss auch unbedingt den Ausgang auf Integralzahlen umwandeln können, da die daten in diesem Format auch über CP340 auf einen Pc übertragen werden

Das kommt mir bekannt vor,
arbeitst du für MKT?
 
@ blasterblock:

Danke dir!! werds mal ausprobieren. 10ms Toleranz sind Top!!

@maxi:

Nein. Was ist MKT?

@Ralle:

Mein Problem wäre dann immernoch, dass ich den Messwert unbedingt in Integer brauch, weil ich sonst die Daten nicht an den pc senden kann.


Danke euch allen
 
das war mir schon klar.

Aber bei mir wird immernoch nur der Maxwert (990ms) angezeigt, keine differenz!

Code:
LC T 1 //Zeitwert laden
L W#16#FFF //Zeitgruppe ausmaskieren

Wie funktioniert das mit dem ausmaskieren?
Was mache ich, wenn ich W#16#fff lade genau?
 
Mit dem Ladebefehl L T1 lädst Du den aktuellen Zeitstand des Timers.
Dieser ist aufgebaut in BCD-Code.
In der höchsten Stelle hast Du die Zeitgruppe (0=10ms, 1=100ms, 2=1s, 3=10s). Das ist schon seit S5-Zeiten so.
Bei dem Maskieren mit der Zahl W#16#FFF machst Du eine UND-Verknüpfung mit Deinem Zeitwert, woraufhin nur noch die untersten 3 BCD-Stellen im Akku 1 vorhanden sind.
Eine Maskierung mit der Zahl W#16#F0 würde Dir als Beispiel nur die 2. BCD Stelle im Akku 1 liefern.
Diese BCD-Zahl wandelst Du dann nach Integer, das wars.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mein Problem wäre dann immernoch, dass ich den Messwert unbedingt in Integer brauch, weil ich sonst die Daten nicht an den pc senden kann.

Time, das sind Millisekunden.
Also einfach den Wert nehmen, in eine DINT (Oder wenn klein genug INT) transferieren und gut.

L #TimeDiff //Format Time
T MD10
 
wens interessiert:

hab ne Lösung gefunden (ne einfache für dummies wie mich!)


hab den ob35 dazu missbraucht, ein Merkerwort je 10ms um 1 Hochzuzählen

Code:
L MW70
L 1
+I
T MW70

Im Ablaufzyklus des jeweiligen Prüftisches (insgesamt 6 Stück) wird dann aus dem Entsprechenden Wert, die Bremszeit errechnet.

Vielen Dank euch Allen für eure Hilfe! Ihr habt mir trotzdem sehr geholfen!
 
Zurück
Oben