S7-200 Nockenwellen Ersatz

the_muck

Level-2
Beiträge
244
Reaktionspunkte
63
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus in die Runde,
ich stehe gerade vor einer eigentlich recht simplen Aufgabe, ich muss mehr oder weniger eine Nockenwellen ersetzen und Winkel abhängig bei einer Umdrehungen verschieden Funktionen aufrufen, schalten und verwalten. Die Winkel Position bekomme ich über einen Inkrementalgeber über schnelle Zähler. Die Funktionen sehen dann einfach so aus das sie von 45° bis 50° = F1, 20° bis 40° = F2,... u.s.w.

Zur Zeit mache ich das ohne Interrupts und vergleich im Unterprogramm die Werte des Zählers mit den Einstellungen. Jetzt habe ich aber eine Verzögerung von 1ms und ein schwanken von 1ms wenn ich einen Ausgang schalte, sprich die Funktion wird mal 1ms nach erreichen des Winkels und mal 2ms nach erreichen des Winkels aufgerufen. Das Programm besteht dabei auch nur aus dieser kleinen Funktion, Zähler Auslesen, vergleichen, schalten. Und das ist recht Drehzahl unabhängig. Stören tut mich nicht die 1ms Verzögerung sondern das schwanken was ich nicht so einfach kompensieren kann.

Jetzt kann ich den Zähler ja mit einem Wert vorladen bei dem der Interrupt aufgerufen wird, nur habe ich fast 20 Werte und müsste diese ja jeweils Vorladen. Da sie aber per Display verändert werden müsste man sie ja vorher sortieren damit beim Int. der nächste wert und Funktion in den Zähler und Int. geladen wird. Dafür fehlt mir aber gerade jeglicher Ansatz :???:.

Lg Malte
 
SBR Sortieren einer Tabelle:
Code:
[FONT=courier new]SUBROUTINE_BLOCK Sortieren:SBR60
[/FONT][FONT=courier new]TITLE=Werte einer INT-Tabelle von klein nach groß sortieren [/FONT]

[FONT=courier new]VAR_INPUT[/FONT]
[FONT=courier new]    Start:DWORD;    //Startadresse der zu sortierenden Werte[/FONT]
[FONT=courier new]    Anzahl:INT;     //Anzahl Werte (beginnend bei 1)[/FONT]
[FONT=courier new]END_VAR[/FONT]

[FONT=courier new]VAR[/FONT]
[FONT=courier new]    Pointer1:DWORD; //Pointer zu sortierender Wert[/FONT]
[FONT=courier new]    Pointer2:DWORD; //Pointer zu prüfender Wert[/FONT]
[FONT=courier new]    Indx1:INT;      //Aktueller Offset für Pointer1[/FONT]
[FONT=courier new]    Final1:INT;     //Letzter   Offset Pointer1[/FONT]
[FONT=courier new]    Indx2:INT;      //Aktueller Offset für Pointer1[/FONT]
[FONT=courier new]    Init2:INT;      //Startwert Offset Pointer2[/FONT]
[FONT=courier new]    TmpInt:INT;[/FONT]
[FONT=courier new]    TmpDINT:DINT;[/FONT]
[FONT=courier new]END_VAR[/FONT]


[FONT=courier new]BEGIN[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 1 //Letzte Werte[/FONT]
[FONT=courier new]    LD     SM0.0[/FONT]
[FONT=courier new]    DECW   LW4[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    MOVW   LW4, LW16[/FONT]
[FONT=courier new]    DECW   LW16[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 2 //Schleife Pointer1[/FONT]
[FONT=courier new]    LD     SM0.0[/FONT]
[FONT=courier new]    FOR    LW14, 0, LW16[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 3 //Pointer1 erzeugen[/FONT]
[FONT=courier new]    LD     SM0.0[/FONT]
[FONT=courier new]    MOVW   LW14, LW22[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    *I     2, LW22[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    ITD    LW22, LD24[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    MOVD   LD0, LD6[/FONT]
[FONT=courier new]    +D     LD24, LD6[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 4 //Startwert Pointer2[/FONT]
[FONT=courier new]    LD     SM0.0[/FONT]
[FONT=courier new]    MOVW   LW14, LW20[/FONT]
[FONT=courier new]    INCW   LW20[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 5 //Schleife Pointer2[/FONT]
[FONT=courier new]    LD     SM0.0[/FONT]
[FONT=courier new]    FOR    LW18, LW20, LW4[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 6 //Pointer2 erzeugen[/FONT]
[FONT=courier new]    LD     SM0.0[/FONT]
[FONT=courier new]    MOVW   LW18, LW22[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    *I     2, LW22[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    ITD    LW22, LD24[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    MOVD   LD0, LD10[/FONT]
[FONT=courier new]    +D     LD24, LD10[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]Network 7 //Tausch?[/FONT]
[FONT=courier new]    LDW<   *LD10, *LD6[/FONT]
[FONT=courier new]    MOVW   *LD10, LW22[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    MOVW   *LD6, *LD10[/FONT]
[FONT=courier new]    UENO[/FONT]
[FONT=courier new]    MOVW   LW22, *LD6[/FONT]

[FONT=courier new]Network 8 //Ende Schleife Pointer2[/FONT]
[FONT=courier new]    NEXT[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]Network 9 //Ende Schleife Pointer1[/FONT]
[FONT=courier new]    NEXT[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]END_SUBROUTINE_BLOCK[/FONT]
Im HMI bei Änderung einer Deiner Vorgabewerte unter Ereignis Änderung ein Freigabebit für die SBR setzen lassen und dieses im Netzwerk nach der SBR wieder zurücksetzen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Malte,

nicht umsonst gibt es elektronische, mechanische Nockenschaltwerke. Bei Exzenterpressen z. B. die an die 50 - 200 U/min machen kommt ne 200er nicht mehr mit. Ich würde sagen, entweder schnellere SPS oder ein echtes Nockenschaltwerk.

Grüße Detlef
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe hier so einige Kristallkugeln, Pendel, Karten, Wunscheruten, Knochen und wenn du
möchtest kann ich dir sogar die Uhrzeit sagen.

Aber eins ist sicher er wird niemals aber auch niemals Schwankungen von 1ms aus einer
200er rausbekommen.

Ach ja wenn du möchtest kann ich auch Fehler in einer Steuerung suchen wenn ich ein Huhn über der
CPU den Kopf abschneide, mach immer bei ganz schwierigen Fällen.
 
@hucki: Er benutzt schnelle Zähler. Bei 1U/min würde ein normaler E reichen. Interrupts benutzt man doch u. A. für schnelle Reaktion auf Ereignisse, oder? Das schwanken seiner Zeit sieht für mich nach Zykluszeit Problem aus. Ich würd nen Nockenschaltwerk wählen. Dann funzt das.

Grüße Detlef
 
Ich denke, wenn er auf die schnellen Zähler mit Interrupts reagiert, hat er da schon 'ne Chance im Vergleich zum normalen Abfragen im Zyklus.
Hängt natürlich davon ab, was er da dann so alles anstellen will und wie oft er unterbrechen muss.
Er hat ja geschrieben, das ihn nicht die Verzögerung stört, sondern die Schwankungen.

Aber mit dem Nockenschaltwerk würd' ich Dir schon recht geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nicht umsonst gibt es elektronische, mechanische Nockenschaltwerke. Bei Exzenterpressen z. B. die an die 50 - 200 U/min machen kommt ne 200er nicht mehr mit. Ich würde sagen, entweder schnellere SPS oder ein echtes Nockenschaltwerk.
Also abgesehen davon, das da nichts über Geschwindigkeiten steht, wobei das ganze so schnell nicht sein kann, wenns mit Vergleichern ja schon fast funktioniert,
ist die 200er mit den Interrupt-Möglichkeiten fast nicht zu toppen in punkto Geschwindigkeit, höchstens von teuren Spezialbaugruppen ala FM352,
von anderen SPSen aber sehr lange nicht.

Mfg
Manuel
 
Also abgesehen davon, das da nichts über Geschwindigkeiten steht, wobei das ganze so schnell nicht sein kann, wenns mit Vergleichern ja schon fast funktioniert,
ist die 200er mit den Interrupt-Möglichkeiten fast nicht zu toppen in punkto Geschwindigkeit, höchstens von teuren Spezialbaugruppen ala FM352,
von anderen SPSen aber sehr lange nicht.
...
*ACK*
Sehe ich mit den Interrupts eigentlich auch so.
 
Hallo,
danke für die Antworten, ich konnte leider noch nicht testen wie sich das vorladen des Zählers (mit einem Wert erstmal) auswirkt. Meine SPS Erfahrung ist leider nicht so die meiste da ich mehr mit Mikrocontrollern in C mache. Wie auch immer, ich schaute mir das Ausgangssignal auf dem Oszi an und dachte "das gibts doch nicht", da meine ersten Versuche mit einer Logo bei 0,25ms Verzögerung und 0,5ms Schwanken lag... Eigentlich ist die Aufgabe der Steuerung auch eine ganz andere, nur wenn sie die Aufgabe zufriedenstellend erledigt wäre sehr sehr viel gewonnen... was zufriedenstellen bedeutet wissen wir gerade selber nicht ganz genau weil sich durch die SPS ganz neue Möglichkeiten der Einstellung ergeben würden. Fakt ist einfach nur das eine möglichst hohe Wiederholgenauigkeit wünschenswert ist. Bei 1ms schwanken sind das bei 60U/min 0,36° was ich hoffentlich vertreten kann, wenn nicht haben wir einfach Pech gehabt.

Ich dachte mir nur das ich den Zähler falsch anwende und sich durch Interrupts die Zeiten um "Welten" verändern. Besonders das schwanken hätte ich so nicht erwartet. Wenn das jetzt nicht der Fall ist könnte ich mir den Aufwand auch erstmal sparen... schauen wir mal was das vorladen mit einem Wert bringt.

lg Malte

Edit: Kennt ihr noch Inkrementalgeber für den Schaltschrank einbau? Ich möchte das nutzen um die Werte zu ändern... finde aber irgend wie nur welche für 5V oder die Mechanisch nicht gerade robust aussehen :). Meine Problemstellung mit der 1ms hat sich gerade etwas relativiert, in einer anderen, in meinen Augen wesentlich kritischeren Anlage wird genau so gearbeitet! Hab das Programm gerade erst bekommen :/. Stellt sich trotzdem noch die Frage was man in Zukunft durch Interrupts noch rausholen kann :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würd' an Deiner Stelle auf die schnellen Zähler auf jeden Fall mit einem Interrupt reagieren.
Ich denke schon, dass das Nichtbenutzen der Interrupts und Daraufwarten, dass der Vergleich mal wieder im Zyklus dran ist, die Hauptursache für die Schwankungen sind.
 
Moin Moin,

wie genau hälst Du es mit Deiner Schwankung von 1ms. Kannst Du die gelegentlich verschmerzen? Oder darf sie zu 100% nicht auftreten?
Wenn 100% nicht auftreten gebraucht wird, kannste nur schnelle Hardware einsetzen, sprich Nockenschaltwerk elektronisch. Andernfalls magst Du mit der 200er und Interrupts evt. glücklich werden. Durch die Zyklische Abarbeitung werden immer Zeitunterschiede entstehen. Hat ne SPS nicht sogar alle paar Zyklen ne Art Sonderzyklus, Interner Systemcheck oder so ähnlich? Das würde dann gelegentlich Deine Zykluszeit nochmal verlängern.


Grüße Detlef
 
... Durch die Zyklische Abarbeitung werden immer Zeitunterschiede entstehen. ...
Nach meiner Erfahrung laufen bei der S7-200 die schnellen Zähler und zugehörigen Interrupts eben komplett zyklusunabhängig.
(Macht das nicht eh' einen Interrupt aus, egal welche Hardware/Programmierumgebung?)
Es steht fast nur die Verzögerung durch die folgende Befehlsausführung im Interruptprogramm zu Buche.

Man muss im Zyklus nur die Einrichtung der zu den schnellen Zählern und Interrupts gehörenden Sondermerker vornehmen und natürlich das Interruptprogramm selber programmieren.
 
Zurück
Oben