Positionen speichern

Nordischerjung

Level-2
Beiträge
835
Reaktionspunkte
115
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

ich hab hier ein Gebäckformer mit einer Walze. Auf dieser Walze
sind Schaltnocken angebracht, die mit einem Ini erkannt werden
und anschließend ein Verrigelungszylinder in eine Nut fährt um den Stempel mit zunehmen.
Jetzt ist das Problem, wenn die Walze zu langsam dreht,
fährt der Verriegelungszylinder manchmal schon vor der Nut aus.(Ist mechanisch nicht anders lösbar)
Das ganze möchte der Kunde nun mit einem SSI Absolutwertgeber (Kübler Typ 8.5883) automatisieren.
Ich will beim Maschinen Neustart die Walze einmal 360 Grad abfahren und bei
jeder Flanke des Inis die Position speichern.
Aber wie mache ich das speichern, wenn die Walze sich verändert (mehr oder weniger Positionen)?
Ich weiß nicht wieviele Positionen ich speichern soll? Kann man das variabel machen?
Wie löses ich am besten das speichern?
Für jede Position ein Merker setzen? Was ist wenn die eine Walze 10 Positionen hat und die andere 40?
Es sollte schon variabel sein, ohne dieses über das TP eingeben zu müssen.
Das einzige was man am TP eingibt ist, ob die Walze sich verändert hat (nach Not-Aus oder Neustart)

Vielen Dank schon mal

Schöne Grüße von der Ostsee

Nordischerjung
 
leg einen datenbaustein mit maximaler länge an, das sollte zum speichern der positionen reichen, außer da werden krümel gebacken ;)

zusätzlich zum speichern der positionen, diese zählen und an den anfang des DBs setzen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich würde dann einen Positions DB anlegen mit z.B. 360 Positionen
Ich denke ein Array wäre hier ideal.

Dann würde ich über einen Schleifenzähler die Positionen jeweils in einem DB ablegen.

Nach dem Durchlauf des Messzyklus setzt du die verbliebenen Positionen auf null. Hat die Walze 40 Positionen löscht du dann ab 41-360
Dann hast du die Positionen in deinem DB und kannst damit arbeiten.

Wäre jetzt das was mir so auf anhieb einfällt
Oder habe ich das falsch verstanden
 
leg einen datenbaustein mit maximaler länge an, das sollte zum speichern der positionen reichen, außer da werden krümel gebacken ;)

zusätzlich zum speichern der positionen, diese zählen und an den anfang des DBs setzen

:confused: :confused: :confused: verstehe ich dich nicht, oder ist dein Satz nicht vollständig?

Was soll ich an den Anfang setzen?

Also ich würde dann einen Positions DB anlegen mit z.B. 360 Positionen
Ich denke ein Array wäre hier ideal.

Dann würde ich über einen Schleifenzähler die Positionen jeweils in einem DB ablegen.

Nach dem Durchlauf des Messzyklus setzt du die verbliebenen Positionen auf null. Hat die Walze 40 Positionen löscht du dann ab 41-360
Dann hast du die Positionen in deinem DB und kannst damit arbeiten.
Und wie mache ich das mit dem ANY? Muss das mit einem Pointer gemacht werden? (Das schreiben und lesen) Wie lösche ich den rest?
Habe dieses noch nie gemacht :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn du das erste mal die 360 grad exakt fährst dann nimm das mit einem Zähler auf und speichere den Wert Dezimal in einem DB.
Im Betrieb zählst du die Impulse (Aktualwert) und weißt so wo die Walze sich befindet. Wenn Impulse (Aktualwert) >= DB Wert sind dann setze Impulse wieder zurück.
Falls ichs nicht falsch verstanden habe
 
... da hast du dir ja etwas vorgenommen ...

Wichtig bei dieser Aufgabe ist. strukturiert vorzugehen. Erstmal mußt du wissen, wann du einmal rum bist. Dann mußt du einen Start-Punkt (Referenzpunkt) für die Initialisierungsfahrt haben.

Dein Programm muß (nach meiner Meinung) also so aussehen :
Deinen Datenbaustein komplett löschen.
Fahre Walze bis zur steigenden Flanke des Referenzpunktes.
Dort Istposition einlesen und weiterfahren.
Bei jedem nun kommenden Nocken den Nockenzähler um 1 erhöhen und diesen zur Adressierung der DBD's (für die Positionen im DB) verwenden und dort die aktuelle Position abspeichern.
Das Ganze so lange wiederholen, bis du wieder den Referenzpunkt erkennst. Nun die Endposition einlesen und die Initialfahrt beenden.

Nun hast du einen DB mit den Angaben, die du benötigst.
Der DB muß natürlich (wie schon vorher geschrieben) so groß sein, dass die maximale Anzahl von vorkommenden Werten gespeichert werden kann.

Ich würde das Ganze übrigens nicht mit einem Absolutwertgeber sondern mit einem Inkrementalgeber aufziehen. Absolutwertgeber macht nur dann Sinn, wenn eine Umdrehung des Gebers immer genau einer Umdrehung der Walze entspricht. Ist das anders (Geber nicht direkt auf der Welle) dann hast du nur unnötig Probleme.

Als nächstes brauchst dann nun eine Routine, die die ständig nachsieht, ob du im Bereich eines der gespeicherten Nocken bist um die entsprechende Reaktion auszulösen.

Ich würde dir empfehlen, diese Aufgabe mittels SCL zu lösen ... das macht vieles einfacher ...

Gruß
LL
 
Larry Laffer schrieb:
Ich würde das Ganze übrigens nicht mit einem Absolutwertgeber sondern mit einem Inkrementalgeber aufziehen. Absolutwertgeber macht nur dann Sinn, wenn eine Umdrehung des Gebers immer genau einer Umdrehung der Walze entspricht. Ist das anders (Geber nicht direkt auf der Welle) dann hast du nur unnötig Probleme.
1. Absolutwertgeber kommt vom Kunden.
2. Der Geber sitz genau auf der Welle der Walze, somit 1:1 :)

Larry Laffer schrieb:
Ich würde dir empfehlen, diese Aufgabe mittels SCL zu lösen ... das macht vieles einfacher ...
Hab ich leider noch nicht so die Erfahrung und Ahnung. (Ausser Boschsteuerung ins SCL) Und das war nicht so aufwendig.

Habe aber heute noch erfahren, dass 16 Positionen das absolute Maximum sind. Was die Sache etwas einfacher macht.

Wie kann man es denn einfach lösen?

Kann es so in etwa funktionieren oder geht es einfacher?


Code:
U #Ini       //Initiator in Position
FP #HM    //Hilfsmerker Flanke
= #Flankenmerker

U  #Flankenmerker
UN #POS1    //Merker Position 1 gespeichert
SPBN POS1

L #IST_POS    //Aktuelle Position
T DB1.POS1   //DB1.DBW0

SET
S #POS1

POS1: NOP 1

U  #Flankenmerker
U #POS1
UN #POS2    //Merker Position 2 gespeichert
SPBN POS2

L #IST_POS    //Aktuelle Position
T DB1.POS2   //DB1.DBW2

SET
S #POS2

POS2: NOP 1

usw, usf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... so wie du es dargestellt hast, läßt es sich auf jeden Fall machen ...
Ich würde aber mit einer Schleife arbeiten.
Begründung :
Für das Ablegen der Werte würdest du dir mit einer Schleife "nur" Code einsparen.
Es kommt aber dann später noch eine Routine, in der du nachschauen mußt, ob du dich im Bereich einer der gespeicherten Positionen befindest. Das geht am einfachsten in dem du die Liste der Positionen "scannst" und nachsiehst, ob eine davon zu deiner Ist-Position paßt ...

Grundsätzliches Wissen zur Schleifen-Programmierung findest du in der Rubrik FAQ vom Forum ...

Gruß
LL
 
Danke erstmal,
zu schleifen habe ich irgendwie nichts gefunden,
was mich weiter bringen könnte. :confused:

Noch zusätzlich eine Frage, wie kann ich einfach alle
Werte eines DB auf den gleichen Wert setzen?
Oder muss ich
Code:
L 0
T DB1.DBD0 
T DB1.DBD4
T DB1.DBD8
... usw
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zu schleifen habe ich irgendwie nichts gefunden, was mich weiter bringen könnte. :confused:

Dann schau doch mal hier
Der Beitrag ist m.E. Klasse und sollte dir schon weiterhelfen können ...

Du mußt das ja auch nicht zwingend so machen - ich bin nur der Meinung, dass es dir letztlich ein paar Probleme erspart ...

Gruß
LL
 
hallo

soweit ich dein problem verstanden habe, suchst du nach einer lösung, wo der mitnehmer während drehender walze in die nut der walze geschoben wird, wobei der ausgangspunkt der form relativ ist.
beim ausklinken der form muss die aktuelle position in einen DB satz geschrieben werden.
beim wieder einklinken wird die form erst mitgenommen, wenn sich die nut (absoluter Istwert) auf gleiche position des mitnehmers befindet (DB-Sollwert).

ist dies wegen verzögerungszeiten von aktoren wie zylinder etc... nicht möglich, ist das eine lineare berechnung von Geschwindigkeit der Walze und der zeit, die der mitnehmer früher ausfahren soll, um die nut rechtzeitig zu erwischen. dafür benötigst du auch nur zwei werte und zwar bei maximaler geschwindikeit und minimaler.

selbstverständlich sollte auch eine ausgangsstellung der form initiert werden, um nach zb technischem gebrechen alles wieder in grundstellung fahren zu können.

grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo
ist dies wegen verzögerungszeiten von aktoren wie zylinder etc... nicht möglich, ist das eine lineare berechnung von Geschwindigkeit der Walze und der zeit, die der mitnehmer früher ausfahren soll, um die nut rechtzeitig zu erwischen. dafür benötigst du auch nur zwei werte und zwar bei maximaler geschwindikeit und minimaler.


Nicht ganz so, der Verriegelungszylinder fuhr immer auf den Punkt zwischen
den Nuten und rutschte dann etwas später erst in die Nut,
wenn die Walze zu langsam drehte.
Um den ganzen Kram mit Verzögerungszeiten /was auch schon bedingt eingesetzt wurde) usw. zu umgehen, soll
halt ein Drehgeber eingesetzt werden.
 
Nicht ganz so, der Verriegelungszylinder fuhr immer auf den Punkt zwischen
den Nuten und rutschte dann etwas später erst in die Nut,
wenn die Walze zu langsam drehte.
Um den ganzen Kram mit Verzögerungszeiten /was auch schon bedingt eingesetzt wurde) usw. zu umgehen, soll
halt ein Drehgeber eingesetzt werden.

Damit bist da ja auch auf dem rictigen Weg ...
Wenn du weißt, wie schnell die Trommel dreht und wie lange der Zylinder braucht dann kannst du auf diesem Weg den Start-Zeitpunkt für den Zylinder ganz gut vorherbestimmen und an einer Position festmachen ...

Gruß
LL
 
Um den ganzen Kram mit Verzögerungszeiten /was auch schon bedingt eingesetzt wurde) usw. zu umgehen, soll
halt ein Drehgeber eingesetzt werden.
naja, ein drehgeber bringt hier nicht viel, der initiiert ja nur schritte.
soweit ich weiss gibt ein absolutwertgeber die tatsächlichen grade/schritte an, in die sich ein punkt am umfang gerade befindet. anders ausgedrückt mit einem drehgeber bekommst du signale, mit einem absolutwertgeber bekommst du werte, die auch nach anlage ein wieder sofort zur verfügung stehen ohne dass diese vorher zwischengespeichert wurden.

du formierst dir die werte (istwert,sollwert) in ein zb Doppelinteger (glaub müsste ausreichen) und prüfst dann auf gleichheit, wenn bedingung erfüllt, dann mitnehmer-zylinder ausfahren.

ich weiss, so optimierungen an alten anlagen können oft auf die nerven gehen.

grüsse
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
naja, ein drehgeber bringt hier nicht viel, der initiiert ja nur schritte.
soweit ich weiss gibt ein absolutwertgeber die tatsächlichen grade/schritte an, in die sich ein punkt am umfang gerade befindet. anders ausgedrückt mit einem drehgeber bekommst du signale, mit einem absolutwertgeber bekommst du werte, die auch nach anlage ein wieder sofort zur verfügung stehen ohne dass diese vorher zwischengespeichert wurden.

Ist ein Absolutwertgeber, hatte ich oben schon beschrieben :rolleyes:

Danke für eure Hilfe, werde mich melden falls ich nicht weiter komme

Grüße von der sonnigen Ostsee

Nordischerjung
 
Moin moin,

ich stecke wieder bei meiner Anlage fest. Programm lief, Kunde kommt mit neuen Ideen und Änderungen usw. :confused: Und Sachen die man vorher so nicht gesehen hatte.

Wie kann ich am einfachsten den Absolutwertgeber auswerten in dem ich in einem DINT immer 0 -4096 zähle? Der Geber macht 4096 Impulse pro Umdrehung, und die möchte ich immer bei jeder Runde von neuem starten, aber den Geber weiter zählen lassen.
Z.B Geber steht bei 456723 und ich möchte mein internen Zähler jetzt auf null setzen und ihn dann immer jeder Umdrehung von 0-4096 zählen lassen.

Sonnige Grüße von der Ostsee

Nordischerjung
 
Warum habt ihr eigentlich einen multiturn Geber genommen ????
Macht doch keinen Sinn wenn man einzelne Umdrehungen erfassen will

Ansonsten kannst Du den Geberausgang genau wie einen Analogwert behandeln und skalieren. Z.B. Null ist 0.0 und 32676 ist 10.0 wenn dein Geber bei 10 Umdrehungen 32676 anzeigt. Allerdings hast du dann eine dezimale skalierung ( x,5 wäre x+1/2 Umdrehung.



peter(R)
 
Zurück
Oben