# 18+19=18,2233... programmieren?



## unverschämtheit (27 Januar 2022)

Hallo!
Ich hab hier ein Problem. Ein Förderband hat einen relativ ungenauen Geber. Jeder Geberimpuls repräsentiert 19,7mm Förderbandbewegung.

Ich muss auf Knopfdruck das Förderband regelmäßig 35,9cm mit einer Toleranz von ca 3cm in eine Richtung fahren. 
Die 35,9cm ändern sich nicht. Im Mittel brauch ich also 359/19,7 = 18,223350253807106598984771573604 Geberimpulse.

Das ganze soll übrigens auf einer Allen Bradley Steuerung realisiert werden.
Ich bin im Kopf jetzt schon so weit dass mir klar ist dass 18,2 erreicht werden kann durch 4mal 18 und 1mal 19 Geberpositionen fahren. Das leuchtet mir auch fast ein. Um ein Verhältnis von 0,2 zu erreichen brauche ich eben das Verhältnis von 1/5. 

So. Ich würde das jetzt gerne in einen Programmcode gießen dass ich bei unendlich häufiger Ausführung auf die oben genannten 18,2233... Geberimpulse komme. Also muss ich abhängig von der Anzahl der Ausführungen 18 oder 19 Impulse anfahren. Ich hoffe dass das verständlich ist. Vielleicht kann mich jemand in die richtige Richtung schicken oder sogar einen Vorschlag in SCL oder ähnlichem ausführen.

Vielen Dank!


----------



## dekuika (27 Januar 2022)

Wie funktioniert der Geber?


----------



## unverschämtheit (27 Januar 2022)

Der Geber ist einfach ein Ini der auf ein Zahnrad guckt. Das Signal bekomm ich über eine High-Speed Eingangskarte.


----------



## dekuika (27 Januar 2022)

Wenn Deine Toleranz 3cm beträgt, kannst Du ja 18 Impulse nehmen.


----------



## unverschämtheit (27 Januar 2022)

Ja, klar. Ich muss ja immer ganzzahlige impulse nehmen. Aber im ewigen mittelwert muss ich auf die genannte Anzahl an Impulsen kommen. Wenn ich 4mal 18 impulse fahr und 1mal 19 impulse fahre komm ich auf 18,2 Impulse im Mittel von 5 Fahrten. 
Da ich aber gerne eine größere Genauigkeit auf Dauer hätte (und aus Gründen keine größere Präzision beim Geber bekomme) wäre es schön das ganze mit einer dynamisch generierten Reihe Abhängig von der Anzahl der Fahrten zu machen.
Quasi eine Formel die mir Automatisch mitteilt ob ich bei Fahrt Nummer _n_ 18 oder 19 Impulse brauche.


----------



## escride1 (27 Januar 2022)

Wieso musst Du denn 18 dann 19 fahren?

Du willst alle 359mm+-30mm anhalten.
Mit 18 Impulsen kommst Du auf 354,6.
Das ergibt eine Abweichung von 4,4mm.

Bei der nächsten Fahrt startest Du wieder bei 0, zählst bis 18 und hast wieder 354,6mm was in der Toleranz liegt.

Solange wie Du von Fahrt zu Fahrt immer nur 359mm verfahren sollst und dabei 30mm Spielraum jedes Mal hast musst Du nicht mehr tun als die 18 Impulse abfahren und hast jedes Mal eine geringe Abweichung von 4,4mm.
Die Genauigkeit von 4,4mm Abweichung ist also relativ gering gemessen daran das noch 25,6mm übrig wären.

Die Frage die sich mir stellt ist also warum das Förderband alle 359mm anhalten soll. Soll da etwas platziert werden? Dann ist der Abstand zwischen zwei Positionen also immer 354,6mm und Du brauchst nur die 18 Impulse weil bei jeder neuen Fahrt bei 0 begonnen wird.
Oder aber hat das Förderband z.B. Fülltaschen? Dann kommst Du selbst mit 18 dann 19 Impulsen nicht weiter weil sich auf Dauer die Position immer weiter verschiebt. Dauert ne Weile, wird aber so geschehen. Da hilft dann nur eine genauere Erkennung, vielleicht sogar nicht an den Zähnen sondern eher an den Taschen.

Eine Formel die 4 mal mitzählt um dann einmal +1 zu rechnen ist mir so nicht geläufig, wohl aber eine die Dir mitteilt das Du jedes Mal 18,22... Impulse fahren sollst, aber die kennst Du ja schon.
Das ganze würde vielleicht noch über Zeit funktionieren, vielleicht, aber ist auch nicht genauer als die 4,4mm.
Du bräuchtest eher einen Codeschnipsel mit Zähler und Auswertung für die 18/19er-Variante, aber das wird nicht das Problem sein, oder? Sieht im übrigen eleganter aus als eine Formel da einzusetzen die keiner versteht bzw. die der erstbeste irgendwann ändert auf "brauchen wir nicht so genau".


----------



## unverschämtheit (27 Januar 2022)

Ich hab mich wohl nicht hinreichend deutlich ausgedrückt. 
Das Förderband fördert Stückgut in eine Anlage zur automatisierten Weiterverarbeitung. Die Taschenbreite ist 35,9cm. Aus Gründen ist da aber kein Positionierantrieb dran dem ich einfach sag "fahr 35,9cm" (was mit einem vernünftigen Umrichter+Geber ja wirklich kein Problem wäre), sondern ich hab eben nur einen Initiator der mir 19,7mm Schrittweite misst.
Wenn ich jetzt also 18 Impulse fahre dann fahr ich, wie du richtig erfasst hast, 354,6mm. Das entspricht nur einer Abweichung von 4,4mm gegenüber dem Soll-Wert. 
Wenn ich aber ein zweites Mal nur 18 Impulse fahre habe ich die Abweichung vom ersten Förderdurchgang (4,4mm) und die vom zweiten. Diese Fehler addieren sich also auf. 
Das ist bis zu einem Gewissen grad auch in Ordnung (ich kann mit ca 3-4cm Abweichung leben), aber dann muss das wieder gerade gezogen werden. Daher muss ich im Langzeitmittel 359/19,7 Impulse fahren. 
Mathematisch betrachtet muss ich da eine Reihe entwickeln und diese Reihenfunktion gibt mir dann abhängig vom der "Durchlaufnummer" _n _die richtige Anzahl an Impulsen die ich fahren muss.

Das ist nicht ganz trivial, aber grundsätzlich sollte das machbar sein. Man muss "nur" die entsprechenden mathematischen Kenntnisse haben.

Vorteil dieser Lösung wäre dass der Kosteneinsatz etwa 1% von der Lösung mit vernünftigem Positioniermotor beträgt. Das fänd ich halt schon schick wenn ich das mit ein bisschen Mathematik erledigen könnte.


----------



## dekuika (27 Januar 2022)

Du kannst ja 5 Takte programmieren mit je 18 und im 5. Takt 19 Wiederholungen. Die Durchläufe schreibst Du remanent in einen DB.


----------



## unverschämtheit (27 Januar 2022)

das gibt aber nur 18,2 und nicht 18,223350253807106598984771573604....
das macht, auf die dauer, einen unterschied.


----------



## Oberchefe (27 Januar 2022)

Erst mal die beiden Zahlen so lange vergrößern, bis Ganzzahlen entstehen -> 3590 Zehntel Millimeter Fahrweg und 197 Zehntel Millimeter pro Sensorpuls.
Kleinstes gemeinsames Vielfaches davon wäre 707230. Diese Anzahl musst du fahren ohne einen Rundungsfehler zu bekommen. Diese 707230 geteilt durch die 3590/197 (oder 359/19,7) ergeben 38809 Takte die du fahren musst, bis du einmal rum bist. Jetzt musst du nur noch deine Takte zählen und dir die aktuelle Sollpulse merken und die Position (bzw. Inkremente) abhängig davon ausrechnen: x*(3590/197) - letzte Anzahl Sollpulse. Wenn x bei 38809 angekommen ist, Taktzähler und Position zurücksetzen und wieder von vorne beginnen.


----------



## Oberchefe (27 Januar 2022)

Aber: ich gehe davon aus, dass es früher oder später doch wieder zu einem Fehler kommt (Schlupf...). Das bleibt ohne anderweitige Korrektur.


----------



## SPS-Bitschubser (27 Januar 2022)

Mathe brauchst du eigentlich weniger du kannst ja auch 18,2 impulse fahren mehr oder weniger je nach Reaktionszeit. Wenn du den zeitlichen Abstand zwischen 2 Impulsen kennst kann man bei konstanter Geschwindigkeit mehr oder weniger genau landen. 
Wichtig ist eigentlich  nur das man nicht rundet und wandelt. Vernünftige Vergleiche etc. Man kann sich auf mm als dint ganzzahl als Vergleicher Zähler messen. Die Kunst ist mit real Zahlen die Fehler klein zu halten. Die komma Millimeter zählt man als longreal oder real alles was größer als 1 ist addiert man auf den dint Zähler drauf. Hier Kann man dann immer weiter optimieren.


----------



## escride1 (27 Januar 2022)

Darf ich Abseits der Rechnerei mal fragen warum nicht einfach der Ini demontiert und ein LS unterhalb des Bandes zur Taschenerkennung genutzt werden kann? Das wäre eigentlich die denkbar einfachste Variante, auch für spätere Reparaturen warum das Band falsch steht, und die Wiederholgenauigkeit wäre ebenso höher.


----------



## dekuika (27 Januar 2022)

escride1 schrieb:


> Darf ich Abseits der Rechnerei mal fragen warum nicht einfach der Ini demontiert und ein LS unterhalb des Bandes zur Taschenerkennung genutzt werden kann? Das wäre eigentlich die denkbar einfachste Variante, auch für spätere Reparaturen warum das Band falsch steht, und die Wiederholgenauigkeit wäre ebenso höher.


Hatte ich auch schon auf dem Schirm.


----------



## escride1 (27 Januar 2022)

Nur um es genauer zu benennen warum ich den LS bevorzugen würde:
Ich kann nun 4 Stunden zu (günstigen) 85€ damit verbringen mir ne Formel und Lösung und Programmierung auszudenken zuzüglich der Inbetriebnahme (um die Wiederholgenauigkeit festzustellen bedarf es mehrerer Durchgänge, daher geschätzt 2-3 Stunden) oder aber für 70€ EK nen LS besorgen, den dranbauen in 10 Minuten, das Programm dafür in 10 Minuten tippern (Flanke_P=Stop) und 10 Minuten daneben stehen wie es läuft.
Also >340€ vs. 155€.
In der Regel versteht das auch jeder Chef, zumindest meiner.

Und zeitgleich kann der Einrichter den LS auch verschieben wenn es mal nicht passt, für die Rechnerei mit dem Ini braucht man wieder ne programmierte Routine(Visu) oder gleich n PG um zu sehen wo denn nun das Problem ist. Sollte bei der Ermittelung durch Zähnchen mal ein neues Zahnrad oder Motor eingebaut werden oder aber das Band längt sich mit der Zeit und wird nachgespannt, dann wieder mit nem PG dran um Faktoren etc. anzupassen. Bei ner LS entfällt der Kram und der Einrichter, Schlosser, Elektriker kann durch Verschieben jederzeit die richtige Anhalteposition finden.

Irgendwann ist kleiner wirklich besser und Kunden wollen in der Mehrheit lieber "einfache" Anlagen die leicht wartbar sind als High-Tech-Anlagen an denen sie für ne simple Funktion wie "Stoppe genau hier" nen Progammierer brauchen.


----------



## Onkel Dagobert (27 Januar 2022)

Ich hatte mal eben eine fixe Idee. Ich bin mir nicht so ganz sicher ob es den Anforderungen genügt, aber Unverschämter kann es ja mal testen. Mit dem "Dämpfungs-Algorithmus" umgeht man eine aufwendige fortlaufende Mittelwertbildung. Man kann natürlich noch ein bisschen mit den Anteilen (0,9 und 0,1) spielen, oder diese auch parametrierbar machen.


```
FUNCTION_BLOCK "PULSZAHL_TEST"

   VAR_INPUT
      INIT              : Bool;   // Initialisierung (bei Steuerung Ein?)
      START_TAKT        : Bool;   // Start eines Taktes Anzahl Pulse berechnen
      X                 : LReal;  // Sollwert, SetPoint, Durchschnittliche Anzahl Pulse
   END_VAR

   VAR_OUTPUT
      PULSE             : Int;    // Ausgabe
      Y                 : LReal;  // Istwert (nur zur Anzeige)
   END_VAR

   VAR
      PV                : LReal;  // Istwert, ProcessValue
      n                 : Int;    // Berechnete Anzahl Pulse
      INIT_FLM          : Bool;   // Flankenmerker
      START_TAKT_FLM    : Bool;   // Flankenmerker
   END_VAR


BEGIN
 
    // Initialisierung
    IF #INIT AND NOT #INIT_FLM THEN
        #PV := #X;
        #n := TRUNC_INT(#X);
    END_IF;
    #INIT_FLM := #INIT;
 
    // Start Takt - Berechnung Soll Pulse n
    IF #START_TAKT AND NOT #START_TAKT_FLM THEN
        #PV := (0.9 * #PV) + (0.1 * #n);
        IF #PV > #X THEN
            #n := TRUNC_INT(#X);
        ELSE
            #n := TRUNC_INT(#X) + 1;
        END_IF;
    END_IF;
    #START_TAKT_FLM := #START_TAKT;
 
    // Ausgabe
    #PULSE := #n;
    #Y := #PV;
  
END_FUNCTION_BLOCK
```

Bearbeitet:
ROUND_INT --> TRUNC_INT


----------



## Oberchefe (27 Januar 2022)

Da Allen Bradley gefordert war:


----------



## Oberchefe (27 Januar 2022)

SollIncr ist die aktuelle Anzahl zu fahrender Incremente.


----------



## PN/DP (27 Januar 2022)

Ganz kurz:
Fortlaufend nur in Ganzzahl addieren und subtrahieren (und Modulo) ergibt theoretisch keine sich aufschaukelnde Ungenauigkeit. Wenn die Strecke je Puls genau 19,7 mm ist.
Alles in Zehntel-mm mit Ganzzahl als "Position" rechnen. Beim Fahren je Sensorpuls 197 (* 0,1 mm) addieren. Wenn die Sollfahrstrecke bzw. Zielposition erreicht ist (Position >= 359 (* 0,1 mm)), dann anhalten und 359 abziehen. Es muß nicht ermittelt werden, ob 18 oder 19 Impulse lang gefahren werden muß.

Ein zusätzlicher Referenzsensor am Band könnte einmal je komplette Bandlänge den Positionszähler auf 0 setzen. Zu empfehlen, falls die 19,7 mm je Umdrehung nicht ganz genau sind.

Harald


----------



## dekuika (28 Januar 2022)

Normalerweise hätte ich die Fächer auf dem Band mit einer LS detektiert. Zusätzlich sollte man darüber nachdenken, ob das Stückgut selbst detektiert werden kann, um einen Fehler (leeres Fach) auszumerzen bevor man z.B. das Band bedruckt. Wenn berechnet wird, braucht man, wie von PN/DP beschrieben, einen Referenzsensor (z.B. Reflektor seitlich an einem Fach) um Ungenauigkeiten auszugleichen. Spätestens nach dem 10. Not-Halt stimmt sonst bei Deinem Band die Position nicht mehr. und wie richtest Du die dann wieder ein? Geht eigentlich nur händisch. Und wenn Du einen Referenzsensor hast, kannst Du auch 18/19 Impulse fahren (vorausgesetzt, Dein Band ist nicht hunderte Meter lang). Aber da fehlt mir die vielzitierte Glaskugel.


----------



## Plan_B (28 Januar 2022)

Ich hatte mal in einer simplen Anwendung das gleiche Problem. Der Ini am Zahnrad wurde dann nur für das Fahrprofil benutzt, um rechtzeitig auf Langsamfahrt zu gehen. Gestoppt wurde jeweils über die Taschenerkennung, was dann auch langzeitmäßig keinen Positionsfehler bringt.
Zusätzlich habe ich, falls die Lichtschranke mal Fehlerkennungen bringt, ein Gültigkeitsfenster für den Taschenimpuls definiert. Fallen einzelne Taschenimpulse aus, habe ich das Band an der oberen Toleranzgrenze der Zahnradimpulse gestoppt.

Das hat >10 Jahre funktioniert und tut es m.w. noch (hab Firma gewechselt).


----------



## escride1 (28 Januar 2022)

dekuika schrieb:


> Normalerweise hätte ich die Fächer auf dem Band mit einer LS detektiert. Zusätzlich sollte man darüber nachdenken, ob das Stückgut selbst detektiert werden kann, um einen Fehler (leeres Fach) auszumerzen bevor man z.B. das Band bedruckt. Wenn berechnet wird, braucht man, wie von PN/DP beschrieben, einen Referenzsensor (z.B. Reflektor seitlich an einem Fach) um Ungenauigkeiten auszugleichen. Spätestens nach dem 10. Not-Halt stimmt sonst bei Deinem Band die Position nicht mehr. und wie richtest Du die dann wieder ein? Geht eigentlich nur händisch. Und wenn Du einen Referenzsensor hast, kannst Du auch 18/19 Impulse fahren (vorausgesetzt, Dein Band ist nicht hunderte Meter lang). Aber da fehlt mir die vielzitierte Glaskugel.


Das Stückgut kann eigentlich nicht detektiert werden, da die Erkennung auf der Unterseite des Bandes bei der Rückfahrt so nah wie möglich an der Einfüllung stattfinden sollte um so auch für die Einrichtung die Nähe und optische Verifikation direkt prüfen zu können. Vorausgesetzt es wird so gefahren und nicht im Kreis.

Die gesamte Berechnung ist durchaus möglich, ich halte sie aber nicht für sinnvoll. Man sieht es bereits an den beiden Programmvorschlägen. Wer soll da in Jahren drauf kommen was genau dort passiert und warum das so ist? Ich tippe darauf das ein etwas unerfahrener Kollege in dem Rechenkonstrukt wild irgendwelche Werte ändert bis sein Ziel erstmal erreicht wird. Da hilft auch die beste Kommentierung oft nichts wenn man den Sinn nicht ganz versteht oder wenn irgendwann jemand mal etwas verändert hat an einer Stelle an der er es nicht sollte.
Ich habe nichts gegen komplexe, genaue Funktionen, wenn sie denn dauerhaft funktionieren. Auch die Rechnung ist für mich plausibel, jedoch irgendwie auch "zu" kompliziert für eine simple Befüllung bei der es "nur" auf 3cm ankommt.

Aber gut, der TE hat glaub nun alle möglichen Informationen und auch Vorschläge erhalten und ich würde mich freuen lesen zu können welche Variante er nun am Ende angenommen hat mit welchem Grund. 😉


----------



## dekuika (28 Januar 2022)

Das Stückgut hätte ich zusätzlich mit einer 2. LS detektiert. Aber warten wir mal  was der TE aus den ganzen Vorschlägen macht. Bisher hat er ja nicht viel beigesteuert.


----------



## Onkel Dagobert (28 Januar 2022)

dekuika schrieb:


> ... Bisher hat er ja nicht viel beigesteuert.


Der ist erst einmal beschäftigt .


----------



## Heinileini (29 Januar 2022)

unverschämtheit schrieb:


> Die 35,9cm ändern sich nicht. Im Mittel brauch ich also 359/19,7 = 18,223350253807106598984771573604 Geberimpulse.


Wenn ich diesen Satz richtig deute, hast Du ...
- von Position zu Position eine Distanz von 359 mm,
- von Position zu Position 18,223350253807106598984771573604 Geberimpulse,
bzw. legt das Band pro Impuls eine Strecke von 19,7 mm zurück, womit die ZielPositionen in dieses Raster passen (müssen).
Dieser Wert liegt innerhalb der gewünschten Toleranz von ca. 30 mm.

Du willst z.B. von Pos. 4 nach Pos. 9 fahren:

Pos. 4 entspricht   72,8934010152 Impulsen ( 4 x 18,2233...), gerundet auf ganze Impulse:   73
Pos. 9 entspricht 164,0101522843 Impulsen ( 9 x 18,2233...), gerundet auf ganze Impulse: 164
Musst Du also fahren: 164 - 73 = 91 Impulse.

Unabhängig vom obigen:


unverschämtheit schrieb:


> Der Geber ist einfach ein Ini der auf ein Zahnrad guckt. Das Signal bekomm ich über eine High-Speed Eingangskarte.


Lässt sich evtl. ein zweiter Ini so positionieren, dass Du ein zweites Signal erhältst, das aber um "90°" gegenüber dem bisherigen verschoben ist?

```
Signal A : __|=====|_____|=====|_____

Signal B : _____|=====|_____|=====|__
```
Damit könnte die High-Speed Eingangskarte klar kommen, wenn die Karte für die Verarbeitung von "A/B-Signalen" vorbereitet und mit der Frequenz der Signale nicht überfordert ist.
Wählst Du die Arbeitsweise "4 Flanken auswerten" aus, so erhältst Du auf der Strecke von 19,7 mm 4 Impulse bzw. 4,925 mm pro Impuls.

Inwieweit das mit einer Allen Bradley Steuerung machbar ist - keine Ahnung - sollte aber eigentlich kein Problem sein.


----------



## Onkel Dagobert (31 Januar 2022)

Onkel Dagobert schrieb:


> Der ist erst einmal beschäftigt .


.. mit anderen Dingen.
Unverschämtheit  !


----------

