-> Hier kostenlos registrieren
Moin liebe Leute,
Es gibt ja schon einige Themen zu meiner Fragestellung, dort hatte ich es auch versucht, aber vielleicht ist meine Frage da einfach untergegangen, weil das Thema schon "abgearbeitet" war. Deswegen versuch ich es mal in einem neuen Thema.
Iich bin relativ neu in der SPS Programmierung und versuche mich grade an einer Drehzahlmessung. Habe hier die S7-1200 (CPU 1215C) zur Verfügung, bisher aber noch keine weiteren Steckkarten.
Eigentlich habe ich meine Drehzahlmessung so wie bereits in anderen Themen vorgeschlagen realisiert. Ich will Drehzahlen von 0-200 U/min erfassen. An meiner Welle habe ich einen Impulsgeber, der halt einmal pro Umdrehung einen Impuls auf einen Digitaleingang %I0.0 der CPU gibt.
In meinem Programm wird im Main-OB durch diesen Impuls ein Funktionsbaustein ("Drehzahlmessung") aktiviert. aIn diesem wird der Digitale Eingang %I0.0 auf positive Signalflanke abgefragt. Bei positiver Flanke wird die Systemzeit eingelesen (RD_SYS_T) und als "neue Zeit" abgespeichert (mit Datentyp DTL, das geht irgendwie bei der 1200 nur als DTL?). Die vorherige "neue Zeit" wurde davor aber noch als "alte Zeit" abgespeichert (MOVE) (eventuell sollte ich die alte Zeit erst ganz am Ende mit der neuen überschreiben, bisher mache ich das halt bevor ich die neue Zeit einlese am Anfang des FCs.)
Danach wird eine Zeitdifferenz = neue Zeit - alte Zeit (T_DIFF) gebildet und als Datentyp Time abgespeichert. Diese Zeitdifferenz wird dann in den Int-Datentyp konvertiert (T_CONV). Am Schluss teile ich dann noch 60 / Zeitdifferenz (DIV) und speichere das Ergebnis "Drehzahl" dann im Datentyp real ab.
Leider funktioniert das nicht so, wie ich es mir vorgestellt habe. Ich validiere das ganze im Moment so, dass ich per Hand Impulse auf meinen Digitaleingang gebe. Der FC wird dadurch auch aktiviert, die Zeiten werden ausgelesen, Differenz berechnet und so weiter. Nur passen die Werte zum einen nicht (Zeitdifferenz wäre irgendwas mit 14 Tagen usw,obwohl ich etwa einmal pro Sekunde einen Impuls gebe) und außerdem habe ich das Gefühl, nicht jeder Impuls wird erkannt (aber das ist erstmal zweitrangig).
Wenn ich meine Zeitdifferenz von Time in Int konvertiere, muss ich den Int-wert danach noch skalieren? Bzw ist mein Programm so vom Prinzip her dnen überhaupt richtig, also lese ich die Systemzeit richtig aus und ist es richtig die so voneinander abzuziehen etc?
Für ein paar Tipps wäre ich sehr dankbar!
Anbei noch Screenshots vom Programm (Netwerk 1-5), damit ihr wisst wovon ich rede =D
Anhang 23767
Anhang 23768
Anhang 23769
Anhang 23770
Anhang 23771
Vielen Dank und viele Grüße,
Lars
Es gibt ja schon einige Themen zu meiner Fragestellung, dort hatte ich es auch versucht, aber vielleicht ist meine Frage da einfach untergegangen, weil das Thema schon "abgearbeitet" war. Deswegen versuch ich es mal in einem neuen Thema.
Iich bin relativ neu in der SPS Programmierung und versuche mich grade an einer Drehzahlmessung. Habe hier die S7-1200 (CPU 1215C) zur Verfügung, bisher aber noch keine weiteren Steckkarten.
Eigentlich habe ich meine Drehzahlmessung so wie bereits in anderen Themen vorgeschlagen realisiert. Ich will Drehzahlen von 0-200 U/min erfassen. An meiner Welle habe ich einen Impulsgeber, der halt einmal pro Umdrehung einen Impuls auf einen Digitaleingang %I0.0 der CPU gibt.
In meinem Programm wird im Main-OB durch diesen Impuls ein Funktionsbaustein ("Drehzahlmessung") aktiviert. aIn diesem wird der Digitale Eingang %I0.0 auf positive Signalflanke abgefragt. Bei positiver Flanke wird die Systemzeit eingelesen (RD_SYS_T) und als "neue Zeit" abgespeichert (mit Datentyp DTL, das geht irgendwie bei der 1200 nur als DTL?). Die vorherige "neue Zeit" wurde davor aber noch als "alte Zeit" abgespeichert (MOVE) (eventuell sollte ich die alte Zeit erst ganz am Ende mit der neuen überschreiben, bisher mache ich das halt bevor ich die neue Zeit einlese am Anfang des FCs.)
Danach wird eine Zeitdifferenz = neue Zeit - alte Zeit (T_DIFF) gebildet und als Datentyp Time abgespeichert. Diese Zeitdifferenz wird dann in den Int-Datentyp konvertiert (T_CONV). Am Schluss teile ich dann noch 60 / Zeitdifferenz (DIV) und speichere das Ergebnis "Drehzahl" dann im Datentyp real ab.
Leider funktioniert das nicht so, wie ich es mir vorgestellt habe. Ich validiere das ganze im Moment so, dass ich per Hand Impulse auf meinen Digitaleingang gebe. Der FC wird dadurch auch aktiviert, die Zeiten werden ausgelesen, Differenz berechnet und so weiter. Nur passen die Werte zum einen nicht (Zeitdifferenz wäre irgendwas mit 14 Tagen usw,obwohl ich etwa einmal pro Sekunde einen Impuls gebe) und außerdem habe ich das Gefühl, nicht jeder Impuls wird erkannt (aber das ist erstmal zweitrangig).
Wenn ich meine Zeitdifferenz von Time in Int konvertiere, muss ich den Int-wert danach noch skalieren? Bzw ist mein Programm so vom Prinzip her dnen überhaupt richtig, also lese ich die Systemzeit richtig aus und ist es richtig die so voneinander abzuziehen etc?
Für ein paar Tipps wäre ich sehr dankbar!
Anbei noch Screenshots vom Programm (Netwerk 1-5), damit ihr wisst wovon ich rede =D
Anhang 23767
Anhang 23768
Anhang 23769
Anhang 23770
Anhang 23771
Vielen Dank und viele Grüße,
Lars