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

Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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".
 
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.
 
Du kannst ja 5 Takte programmieren mit je 18 und im 5. Takt 19 Wiederholungen. Die Durchläufe schreibst Du remanent in einen DB.
 
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.
 
Aber: ich gehe davon aus, dass es früher oder später doch wieder zu einem Fehler kommt (Schlupf...). Das bleibt ohne anderweitige Korrektur.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.

Code:
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
 
Zuletzt bearbeitet:
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
 
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.
 
Zuletzt bearbeitet:
Zurück
Oben