TIA Encoder gesteuerter Ablauf

gepet

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Miteinander,

ich kämpfe aktuell mit einem Problem, das um Ehrlich zu sein ein bisschen meine Fähigkeiten übersteigt.

Ich habe eine Anlage bestehend aus einem Förderband und mehreren Bearbeitungsstationen (mehrere Bearbeitungsschritte).
Bisher war das ganze einfach per S7-1200 zeitgesteuert.
Also Band läuft an, nach 1s aktiviere Station 1 (Aufsprühen) nach 4s aktiviere Station 2 (Bürste), nach 5s deaktiviere Station 1, nach 8s aktiviere Station 3 (Absaugung) etc.
Hat mit allen Nachteilen einer zeitlichen Steuerung auch soweit sehr gut funktioniert.

Jetzt haben wir allerdings den Motor ausgetauscht. Der neue Motor hat einen Encoder, und den würde ich gerne nutzen, um die Genauigkeit des Ablaufs zu erhöhen.
Neues Programm soll also beispielhaft sein:
- Nach 285 steps (=100mm) aktiviere Station 1
- Nach 1000 Steps (=350mm) aktiviere Station 2
etc.


Bisher habe ich geschafft den Encoder mit der SPS (S7-1200) zu verbinden.
Über den Highspeed Counter HSC_1 bekomme ich eine Verbindung zum Encoder und speichere mir die Encoder-Schritte in eine Variable: Encoder - DINT - %ID1000
Soweit ist es getestet und funktioniert.


Woran ich jetzt aber verzweifle ist eben genau diese Abfrage bzw. der Vergleich zwischen "aktuellen Encoder Steps" und "Encoder Steps wo geschalten werden soll".
Das habe ich ehrlich gesagt noch nie gemacht.
Um das Ganze in das restliche Programm schön einzugliedern würde ich gerne im KOP arbeiten / bleiben.
Sind hier die "Vergleicher" Bausteine sinnvoll? Oder gibt es da eine bessere, elegantere oder einfachere Lösung?


Ich bin leicht verzweifelt und bitte daher um eure Hilfe!

Liebe Grüße,
Georg
 
Hallo
Zunächst einmal wäre es wichtig, dass du den Encoder Zählwert nach jedem Bearbeitungszyklus wieder "Nullen" kannst.
Dann sollte das Vergleichen des Istwertes mit einem vorgegebenen Sollwert eigentlich kein Problem sein.

Wenn du den Istwert nicht nullen kannst wird es etwas aufwändiger weil du ja dann immer die Differenz ermitteln musst.
Außerdem hast du dann das Problem, dass es irgendwann einen Zahlenüberlauf gibt und der Zählwert von "ganz groß" auf "Null" springt.
Das würde natürlich auch einiges durcheinander bringen.

Die Vergleicherbefehle (CMP >=I, CMP <=I, CMP >=D, CMP <=D) sind dir vertraut?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Paul,

danke für deine Antwort!
Ich habe mich jetzt mal an den Vergleicher-Blöcken versucht. Mit "CMP >=" funktioniert es soweit ganz gut. Was meinst du mit "CMP >= I" bzw. "CMP >= D"? Integer?


Das mit dem Nullen meines Encoder-Zählwerts ist ein guter Punkt, den wollte ich aufgreifen sobald die Vergleicher gelöst sind.
Zum Testen Starte ich die CPU neu, damit der Speicher gelöscht wird. Ist aber auch keine Dauerlösung.
Hast jemand eine Idee dazu, wie ich das zurücksetzen am besten lösen kann?
 
Hallo
Bei CMP ==I steht I für Integer
Bei CMP ==D steht D für Doppelinteger (ist das was du brauchst weil du ja oben geschrieben hast der Wert liegt als DINT vor)

Zum Nullen:
Hast du schon mal versucht einfach über eine Beobachtungstabelle den Wert auf "0" zu steuern?
Benutzt du für die schnellen Zähleigänge irgendwelche "Systembausteine" oder Ähnliches?
Wenn "Ja" haben diese evtl. sogar einen Eingang fürs nullen.
Habe leider nur selten mit der 1200er zu tun.....
 
Ich verwende aktuell keine Systembausteine für den HSC sondern schreibe direkt in die Adresse ID1000.

Wäre es möglich, mit z.B. dem "MOVE" Block dein Wert von ID1000 einfach mit 0 zu überschreiben?
Also quasi beim IN eine 0 angeben und beim OUT1 dann die ID1000?
Hab leider noch nie mit Move-Blöcken gearbeitet bisher.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie ist der Encoder denn angeschlossen?
Ich vernute mal, dass es einfach 2 "Spuren" sind die auf 2 schnelle Eingange gehen.
Oder ist der über Profinet / Profibus angeschlossen?
Das ID (Eingangsdoppelwort?) macht mich etwas stutzig.

Ich kenne das so (allerdings S7 313C ):
2 Eingänge werden in der Hardware-Config als schnelle Zähler deklariert und mit 2 Drähten angeschlossen.
Dann gibt es einen SFB47. Der wertet die Eingänge aus und schreibt den Zählwert in einen Datenbaustein.


Probier doch einfach mal aus was passiert wenn du in einer Beobachtungstabelle das ID1000 anschaust
und dann auf "0" steuerst.
Bleibt die "0" drin stehen?
oder
bleibt der alte Wert drin?

Und "Ja" der MOVE Befehl wäre dafür geeignet.
 
Da der HighSpeedCounter genutzt wird, kann man in der Doku zur 1200-er ganz sicher auch finden, wie dieser zurückgesetzt werden kann.
Das würde ich auf jeden Fall machen, bei Start des Ablaufs, Counter auf Null, Startvariablen und Verriegelungsvariablen der Stationen auf False.
Dann mit Vergleichern für jede Station Istwert und Sollwert auf > vergleichen und bei Überschreiten des eingestellten Wertes eine Startvariable für die jeweilige Station Triggern.
Nach beeenden der Arbeit der Station eine Fertigvariable-Setzen, die verhinder, dass die Station ein zweites Mal arbeitet. (Verrgiegelung mit der Startvariable)

Wenn man es schick machen will, kann man die Counterausgabe vor Nutzung auch noch in mm oer zentel mm umrechnen, so dass man es einfacher hat, Änderungen der Startpositionen einzugeben.
 
Hallo Miteinander,

Danke noch einmal für eure Antworten!

Ich kenne das so (allerdings S7 313C ):
2 Eingänge werden in der Hardware-Config als schnelle Zähler deklariert und mit 2 Drähten angeschlossen.
Dann gibt es einen SFB47. Der wertet die Eingänge aus und schreibt den Zählwert in einen Datenbaustein.
Also ich habe ebenfalls 2 Eingänge I0.0 und I0.1 als schnelle Zähler deklariert und den Encoder dort angeschlossen.
Dann bei "E/A-Adressen" als "Anfangsadresse" 1000 gewählt.
Dann habe ich in der PLC-Variablentabelle eine DInt Variable angelegt (Encoder benannt) und die Adresse auf %ID1000 gesetzt. Und diese Variable zählt hoch bzw. runter mit jedem Step den der Encoder macht.
Im Prinzip diesem Video folgend: https://www.youtube.com/watch?v=azTtnc1BsxM



Ich bin mittlerweile auch mit dem Programm weiter gekommen. Das Vergleichen und schalten funktioniert wie gewünscht, nur das Resetten macht weiterhin Schwierigkeiten.
Versucht habe ich einen MOVE-Baustein, mit IN = 0 und OUT = Encoder. Der setzt die Encoder-Variable auch auf 0, aber nur solange wie der MOVE-Baustein geschalten ist. Sobald der nicht mehr geschalten ist hat die Encoder-Variable wieder den ursprünglichen Wert.
Dabei war mir leider auch die 1200er Doku bisher keine Hilfe.

Hier wäre ich über Tipps noch sehr dankbar!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte mit der 1200'er noch nicht zu tun, aber wenn ich das von dir verlinkte Video ansehe ist bei 2:09 zu sehen wo du den Reset aktivieren kannst. Und wenn du das da aktiviert hast kannst du in dem Fenster das bei 2:15 zu sehen ist wahrscheinlich einen Merker an den Reset-Input schreiben und damit deinen Zähler Rücksetzen.
 
Ich hatte mit der 1200'er noch nicht zu tun, aber wenn ich das von dir verlinkte Video ansehe ist bei 2:09 zu sehen wo du den Reset aktivieren kannst. Und wenn du das da aktiviert hast kannst du in dem Fenster das bei 2:15 zu sehen ist wahrscheinlich einen Merker an den Reset-Input schreiben und damit deinen Zähler Rücksetzen.

Hi,
Das ist dir ganz richtig aufgefallen. Problem an der Sache ist nur, dass in dem Video offensichtlich eine andere Firmware (4.1 oder niedriger) verwendet wird, und ich die V4.2 in meiner SPS habe. Da schaut das leider ganz anders aus und diese "simple" Reset-Einstellung kann ich nirgends mehr finden... :confused:
 
Das Rücksetzen des störrischen Zählers braucht man nicht unbedingt.
Lies den Zählerstand zyklisch aus, bilde die Differenz zwischen dem aktuell gelesenen und dem zuvor gelesenen ZählerStand und addiere diese Differenz auf einen "eigenen" Zähler (z.B. DINT-Variable in einem DB). Der eigene Zähler sollte problemlos rücksetzbar sein oder könnte per Modulo-Funktion dazu gebracht werden, nach Erreichen eines vorgegebenen Zählerstandes wieder bei 0 zu beginnen.
Einen Überlauf des "störrischen Zählers" zu erkennen und entsprechend zu behandeln, dürfte normalerweise unproblematisch sein.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
........
Einen Überlauf des "störrischen Zählers" zu erkennen und entsprechend zu behandeln, dürfte normalerweise unproblematisch sein.
Könntest du das bitte mal etwas detaillierter ausführen.
Ich hab mir dazu nämlich schon öfter mal Gedanken gemacht und bin aber immer um die Umsetzung drum rum gekommen
weil ich eben eine Möglichkeit zum Nullen gefunden habe.
So ganz simpel erscheint mir das nicht, zumindest nicht wenn beim Überlauf kein Ausschussteil entstehen soll.

Man müsste checken on der Startwert größer war als der Endwert und beide Größen zusammenführen.
Ist aber, denke ich schon etwas Getüftel. Evtl. würde sich Modulo da anbieten.....
 
Zuletzt bearbeitet:
Hallo,

ich möchte mich an dieser Stelle für eure Hilfe bedanken!
Mein Problem ist gelöst und das Programm funktioniert (bis auf Kleinigkeiten, die ich in einem anderen Topic behandeln werde).

Daher möchte ich die Lösung hier kurz zusammenfassen, falls noch jemand anderes ein ähnliches Problem hat und bei der Suche auf diesen Beitrag stößt:
1.) Encoder Anlegen und Zählvariable (ID1000) ähnlich wie im von mir geposteten Video funktioniert super. Dafür ist kein CTRL_HSC Baustein nötig. Daher hatte ich auch keinen im Programm eingebaut und daraus resultierte das Problem.
2.) Zurücksetzen: Dafür ist dann wiederum doch ein CTRL_HSC Baustein nötig. im CTRL_HSC Baustein wird die Hardware-ID beim Eingang "HSC" eingetragen. Am Eingang "CV" wird dann die Bedingung definiert, welche für das Zurücksetzen eintreten soll. In meinem Fall habe ich hier einen Schließerkontakt von einem Sensor verwendet, also I1.1. Sonst sind prinzipiell keine weiteren Ein- oder Ausgänge erforderlich.

Funktioniert einwandfrei!

Vielen Dank nochmal und liebe Grüße,
Georg
 
(Schnelle) Hardwarezähler zurücksetzen ist nicht zu empfehlen, besonders nicht während die Achse dreht. Es ist viel einfacher, den Zähler endlos frei laufen zu lassen und die Zählerstandsänderungen auf eine zweite Positionsvariable zu verrechnen. Da gehen beim Reset/Referenzieren der Position keine Impulse verloren und ein Überlauf (Wrap) eines 32-Bit- oder 16-Bit-Hardwarezählers ist völlig unproblematisch und muß nicht extra behandelt werden (wegen der Zweierkomplement-Darstellung von INT/DINT).

Ich hatte mal hier im Forum ein Programmbeispiel in AWL gepostet, das müsste für die S7-1200 in SCL formuliert werden.
Ich würde gar nicht den Zähler resetten, sondern eine vom Zähler abgeleitete Relativ-Position-Variable. Den Zähler einfach frei vorwärts+rückwärts endlos zählen lassen und die +/- Zählerdifferenz bei jeder Zählerstandabfrage zur Positionsvariable addieren. Beim Rücksetz-Ereignis nicht den Zähler resetten sondern die Positionsvariable auf 0 setzen. Programmbeispiel siehe hier. Die RelPos-Wrap-Position (26400 im Beispiel) sollte größer als die max mögliche Relativ-Position sein, z.B. 1.000.000.000
Damit das Umspringen beim Überschreiten der 32-Bit-Zählgrenzen (DINT-Datentyp-Grenzen) keine Rechensprünge verursacht, rechne nur mit der Differenz des Zählerstands zur Abfrage vorher. Und diese Differenz verrechne/übertrage auf einen 0..26399-"Zähler" (Deine Position).

So etwa mache ich es in der Regel mit FM350-2-Encodern für Bänder-Positionen:
Code:
      L     "DB350".Enc_old             //(INT 16 Bit) Zählerstand_vorher
      L     "DB_FM350-1".ACT_CNTV       //Zählerstand/Encoderwert jetzt, untere 16 Bit reichen auch (*)
      T     "DB350".Enc_old             //als Zählerstand_vorher merken
      TAK
      -I                                //muß -I! braucht keinen WordWrap beachten! funzt automatisch

//hier in AKKU1-L die 16-Bit-Differenz zu Zählerstand vorher ---> auf 0..26399-Position verrechnen

      ITD
      L     "DB350".RelPos              //rel.Position (bei Referenzieren auf 0 gesetzt)
      +D                                //die Zählerstand-Differenz (+/-) dazu
      L     26400                       //für MOD immer positiv machen!
      +D
      L     26400
      MOD
      T     "DB350".RelPos              //(INT 16 Bit) 0..26399
(*) Der Zählerstand kann als 32-Bit-Wert oder auch nur die unteren 16 Bit verarbeitet werden, das Programm kommt mit beiden klar. Möglich ist also:
* L "DB_FM350-1".ACT_CNTV //Zählerstand 32 Bit aus dem DB für FC CNT_CTL1
* L PED <FM350_E_Adr + 4> //Zählerstand 32 Bit direkt aus der Baugruppe
* L PEW <FM350_E_Adr + 6> //Zählerstand 16 Bit direkt aus der Baugruppe

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Harald
Na da war ich ja mit Modulo gar nicht so falsch gelegen :smile:
Was Du da aber im Vorfeld machst, da wäre ich in hundert Jahren nicht drauf gekommen.
Meinen aller größten Respekt.
Werde das bei Gelegenheit mal ausprobieren.
 
Das MOD hat mit der Übernahme der Zählerstandsveränderung in die Relativ-Position nichts zu tun (dafür sind nur die ersten 8 Anweisungen bis einschließlich dem ersten +D zuständig). Das MOD ist nur für den Fall, daß die Relativ-Position mal überlaufen kann/soll - damit dieser Überlauf an einer gewollten bzw. günstigen Position stattfindet.

Harald
 
Zurück
Oben