S7 200 Drehzahl errechnen

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
297
Zuviel Werbung?
->Hier kostenlos registrieren
Hi,

ich möchte in einem Baustein die Zeit zwischen zwei Impulsen messen. Zum Bsp. um eine Drehzahl oder einen Durchfluß zu errechnen. Wie würdet ihr das angehen?

Ich habe das unter einer S7 300 schon realisiert mit einem IEC-TON. Bei dem gibts ja die ms am ET Ausgang.

Für Anregungen bin ich dankbar

pt
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Du kannst die Milisekunden lesen mittels:
MOV MWx,Ty.

Den Timer würde ich nicht starten, sondern mit einer längeren Zeitdauer durchlaufen lassen.
Wenn ich mich richtig erinnere:

U SM 0.0 // imer ein
TONR Tx,10000 // Timer ein mit reload, geht bei 10000
// wieder auf 0

Bei einer Flanke, besser bei einem Interrupt, lädtst du den Timerstand und ziehst den vorigen davon ab. Wenn das Ergebnis negativ ist, war ein Überlauf dazwischen und du addierst 10000.
Dann speicherst du den Timerwert als neuen vorigen.

Schnelle Impulse zählst du besser mittels der integrierten high speed counter.
 
OP
P

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
297
Zuviel Werbung?
->Hier kostenlos registrieren
Hi Zottel,

den Timer wollte ich nicht starten sondern laufen lassen, bei pos. Flanke des Messzykluses den Wert auf T_Start speichern, bei der negativen den T_Start vom aktuellen abziehen.

MOV MWxx, TY werde ich mir angucken.

Bis denn, pt
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Sorry,
es muss heißen:

MOVW Tx,MWy

Habe das gestern so aus dem Gedächtnis hingeschrieben, nach dem ich ein paar Stunden Atmel programmiert habe...

Das Durchlaufen lassen des Timers habe ich vorgeschlagen, da ich vermute, daß es einfacher zusammen mit Interrupts zu handhaben ist. Generell ist so eine Zeitmessung besser mit Interrupts zu handhaben, da sonst Start und Ende der Periodendauer mit einer Unsicherheit von einer Zykluszeit behaftet sind.

Hauptprogramm:
LD SM0.0
TONR Tx,+10000

der Tiner läuft jetzt immer und auch über die 10000 hinaus. Er stoppt allerdings beim erreichbaren Höchstwert von 32767, was mir gestern nicht bewußt war :)

In einem Interruptprogramm kannst du nun schreiben:
L SM0.0
MOVW Tx,MWy // erreichten Wert lesen
R Tx,1 // Timer zurücksetzen

Auf diese Weise sparst du das Abziehen des alten Wertes. Allerdings findet das Rücksetzen eben um die Bearbeitungszeit der MOV-Instruktion zu spät statt. Das wäre nicht so schlimm, schlimm wirds, wenn ein Interrupt zwischen MOVW und R stattfindet.
Abhilfe:
Entweder Interrupts vor MOV sperren und nach R freigeben oder, wenn du dir das vom Timing her nicht leisten kannst, vor dem MOV einen Merker löschen, diesen Merker in allen
anderen Interruptroutinen setzen.
Der Merker hat dann die Bedeutung: Interrupt aufgetreten. Merker nach R testen und in diesem Fall das Ergebnis verwerfen.
 
OP
P

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
297
jetzt habe ich mir ein Bein ausgerissen und diese Mist200er in IEC programmiert, damit ich diese sch... Timer habe und nu kommt mir der Vogel um die Ecke und teilt mir mit, dass die Messzelle auch noch einen analogen Ausgang hat, der mir die Durchflußmenge angibt.

:( warum

pt
 
Oben