Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 5 von 12 ErsteErste ... 34567 ... LetzteLetzte
Ergebnis 41 bis 50 von 117

Thema: Programmierwettbewerb, 5. Aufgabe - Inkrementalgeber Korrektur

  1. #41
    Registriert seit
    12.04.2010
    Beiträge
    300
    Danke
    22
    Erhielt 54 Danke für 52 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von MichaelUray Beitrag anzeigen
    Ich glaube du hast hier die 0 bei der Überlauf Eliminierung nicht richtig berücksichtigt. Es sollte in deiner Tabelle 65586 anstatt 65585 stehen, dann stimmt es auch wieder.
    Stimmt, genau das habe ich falsch gemacht

  2. #42
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    749
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Mag sein, dass ich mich am frühen Morgen täusche, aber ist das Ganze nicht einfach nur eine Skalierungsfunktion? 65536 Inkremente am Motor entsprechen (65536*Skalierungsfaktor) Inkrementen am Getriebeausgang bzw. am Eingang des Black Box-FB's, oder etwa nicht?
    Code:
    FUNCTION_BLOCK fblEncdScal (* Encoder-Istwert 16 Bit skalieren *)
    VAR_INPUT
       setScalFact:REAL:=1.0; (* Skalierungsfaktor *)
       inpEncdCntr:UINT;  (* Eingabezähler Encoder *)
       inpReset:BOOL;  (* Reset *)
    END_VAR
    VAR_OUTPUT
       outScalCntr:UINT;  (* Skalierter Ausgabezähler *)
    END_VAR
    VAR
       varLastCntr:UINT;  (* Encoder-Istwert beim letzten FB-Aufruf *)
       varForwDiff:UINT;  (* Vorwärts-Zählerdifferenz gegenüber letztem Aufruf *)
       varRevsDiff:UINT;  (* Rückwärts-Zählerdifferenz gegenüber letztem Aufruf *)
    END_VAR
    (* Bei Reset Ausgabezähler auf Encoder-Istwert setzen *)
    IF inpReset
    THEN
       outScalCntr:=inpEncdCntr;
    ELSE
    (* Differenz gegenüber letztem Aufruf berechnen *)
       varForwDiff:=inpEncdCntr-varLastCntr;
       varRevsDiff:=varLastCntr-inpEncdCntr;
    (* Skalierte Position berechnen, kleinere Differenz bestimmt Drehrichtung *)
       IF varForwDiff<=varRevsDiff
       THEN
          outScalCntr:=outScalCntr+REAL_TO_UINT(varForwDiff*setScalFact);
       ELSE
          outScalCntr:=outScalCntr-REAL_TO_UINT(varRevsDiff*setScalFact);
       END_IF
    END_IF
    (* Encoder-Istwert für nächsten Aufruf merken *)
    varLastCntr:=inpEncdCntr;

  3. #43
    Registriert seit
    25.11.2008
    Ort
    Westpfalz
    Beiträge
    1.550
    Danke
    187
    Erhielt 212 Danke für 186 Beiträge

    Standard

    Zitat Zitat von StructuredTrash Beitrag anzeigen
    Mag sein, dass ich mich am frühen Morgen täusche,
    Ja du täuschst dich weil nach 65535 gehts wieder bei 0 los, aber deine Korrektur musst du mitführen.
    Der TE hat nicht umsonst die Vorgabetabellen eingestellt
    and we all support the team (S.King - Die Arena)

  4. #44
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    749
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Zitat Zitat von Sinix Beitrag anzeigen
    Ja du täuschst dich weil nach 65535 gehts wieder bei 0 los, aber deine Korrektur musst du mitführen.
    Ja, das ist mir klar, und genau das tue ich doch auch. Der Positionsfortschritt wird immer auf die vorherige skalierte Position aufgerechnet.

  5. #45
    Registriert seit
    25.11.2008
    Ort
    Westpfalz
    Beiträge
    1.550
    Danke
    187
    Erhielt 212 Danke für 186 Beiträge

    Standard

    Hast recht, scheint ein guter Lösungsansatz.
    and we all support the team (S.King - Die Arena)

  6. #46
    Registriert seit
    12.04.2010
    Beiträge
    300
    Danke
    22
    Erhielt 54 Danke für 52 Beiträge

    Standard

    StructuredTrash
    Mag sein, dass ich mich am frühen Morgen täusche, aber ist das Ganze nicht einfach nur eine Skalierungsfunktion? 65536 Inkremente am Motor entsprechen (65536*Skalierungsfaktor) Inkrementen am Getriebeausgang bzw. am Eingang des Black Box-FB's, oder etwa nicht?
    Ich glaube nicht dass es funktioniert.

    Stell dir vor die Skalierung wäre 1:1,01

    d.h alle 100 Encoder - Pulse kommt 1 dazu.

    Nun berechnest du z.b. 5 mal in der Zeit, d.h bei gleichmässiger Aufteilung hast du 5 x 20 Differenz. Du rechnest aber bei einer Diff von 20 einen Korr-Wert = 0 aus, d.h. 5 x 0 = 0, in Wirklichkeit müsste dann aber schon mal 1 rauskommen.

    bg
    bb

  7. #47
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    749
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Zitat Zitat von bits'bytes Beitrag anzeigen
    Ich glaube nicht dass es funktioniert.
    Da hast Du Recht, der Nachkommaanteil darf nicht unter den Tisch fallen. Hätte ich bloss nicht damit angefangen, jetzt muss ich mindestens noch eine Pause opfern.

  8. #48
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    749
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Mit der internen Verwaltung der skalierten Position als REAL sollte es klappen.
    Code:
    FUNCTION_BLOCK fblEncdScal (* Encoder-Istwert 16 Bit skalieren *)
    VAR_INPUT
       setScalFact:REAL:=1.0; (* Skalierungsfaktor *)
       inpEncdCntr:UINT;  (* Eingabezähler Encoder *)
       inpReset:BOOL;  (* Reset *)
    END_VAR
    VAR_OUTPUT
       outScalCntr:UINT;  (* Skalierter Ausgabezähler *)
    END_VAR
    VAR
       varLastCntr:UINT;  (* Encoder-Istwert beim letzten FB-Aufruf *)
       varForwDiff:UINT;  (* Vorwärts-Zählerdifferenz gegenüber letztem Aufruf *)
       varRevsDiff:UINT;  (* Rückwärts-Zählerdifferenz gegenüber letztem Aufruf *)
       varScalReal:REAL;  (* Skalierter Wert Realformat *)
    END_VAR
    (* Bei Reset Ausgabezähler auf Encoder-Istwert setzen *)
    IF inpReset
    THEN
       outScalCntr:=inpEncdCntr;
       varScalReal:=REAL_TO_UINT(inpEncdCntr);
    ELSE
    (* Differenz gegenüber letztem Aufruf berechnen *)
       varForwDiff:=inpEncdCntr-varLastCntr;
       varRevsDiff:=varLastCntr-inpEncdCntr;
    (* Skalierte Position berechnen, kleinere Differenz bestimmt Drehrichtung *)
       IF varForwDiff<=varRevsDiff
       THEN
          varScalReal:=varScalReal+varForwDiff*setScalFact;
          IF varScalReal>=65536.0
          THEN
             varScalReal:=varScalReal-65536.0;
          END_IF
       ELSE
          varScalReal:=varScalReal-varRevsDiff*setScalFact;
          IF varScalReal<0
          THEN
             varScalReal:=varScalReal+65536.0;
          END_IF
       END_IF
       outScalCntr:=REAL_TO_UINT(varScalReal);
    END_IF
    (* Encoder-Istwert für nächsten Aufruf merken *)
    varLastCntr:=inpEncdCntr;
    Ich habe es mal von 0 aus einmal ins Negative und zurück sowie bis zum zweiten Überlauf in positive Richtung getestet. Bis dahin sieht es gut aus.

  9. #49
    Registriert seit
    12.04.2010
    Beiträge
    300
    Danke
    22
    Erhielt 54 Danke für 52 Beiträge

    Standard

    Zitat Zitat von bits'bytes Beitrag anzeigen

    Ah ja, also der Fall dass der Encoder-Fortschritt > Korrektur-Abstand ist ? Das habe ich nicht wirklich berücksichtigt da ich nicht annahm dass dieser Fall eintreten könnte. Werde das noch mal ansehen.

    bg
    bb
    Hallo, ich hätte das jetzt mal korrigiert und hoffe das passt....
    Achtung Michi: Variablen Datentypen haben sich geändert (fürs probieren).

    bg
    bb
    Angehängte Dateien Angehängte Dateien

  10. #50
    Registriert seit
    12.04.2010
    Beiträge
    300
    Danke
    22
    Erhielt 54 Danke für 52 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von StructuredTrash Beitrag anzeigen

    Ich habe es mal von 0 aus einmal ins Negative und zurück sowie bis zum zweiten Überlauf in positive Richtung getestet. Bis dahin sieht es gut aus.
    Hallo,
    habe das mal durchlaufen lassen.

    Bei mir summiert sich hier eine (wahrscheinliche) Ungenauigkeit auf

    Geberkorr-Skalierung.jpg

    Bei einem tatsächlichem Geber Stand von 62500 (Skalierung 1.01, d.h. 100 --> 101) sollte der korrigierte Geber 63125 sein. Mit deinem Code komme ich bei mir auf 63106.

    bg
    bb
    Angehängte Grafiken Angehängte Grafiken

Ähnliche Themen

  1. Programmierwettbewerb, 4. Aufgabe
    Von Onkel Dagobert im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 15.12.2011, 18:57
  2. Programmierwettbewerb, 3. Aufgabe
    Von Chräshe im Forum Stammtisch
    Antworten: 7
    Letzter Beitrag: 05.12.2011, 20:43
  3. Programmierwettbewerb, 2. Aufgabe
    Von LargoD im Forum Stammtisch
    Antworten: 14
    Letzter Beitrag: 02.08.2011, 22:27
  4. Bitte um korrektur
    Von Arnold999 im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 15.06.2010, 21:21
  5. Mechanische Korrektur
    Von PG710 im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 20.11.2008, 15:26

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •