Positionen speichern

Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      L     0
      LAR1                              // Pointer initialisieren
      AUF   DB     3                    // Nummer des zu beschreibenden DB

      L     16                          // Anzahl der DW im DB
next: T     #Schleifenzaehler           // Schleifenzähler initialisieren

      L     0
      T     DBD [AR1,P#0.0]             // 0 in das DW schreiben auf das der Pointer zeigt
      +AR1  P#4.0                       // Poiner um 4 Byte (1DW) erhöhen

      L     #Schleifenzaehler
      LOOP  next

oder so ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum habt ihr eigentlich einen multiturn Geber genommen ????
Macht doch keinen Sinn wenn man einzelne Umdrehungen erfassen will

Tja, das hab ich mir nicht ausgesucht. Den benutzen die immer *ROFL*

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.
Wird das nich zu ungenau? Der Geber macht 4096 Umdrehungen und
pro U 4096 Impulse, oder nicht??? :confused:
 
... hatte ich dir nicht einen Inkrementalgeber empfohlen ...?

Spaß beiseite ...
Die einzige Chance, die ich da sehe ist, dass du dir einen "Berechne_Position-FB" baust.
Grundsätzlich kannst du den Befehl MOD (Modulo) verwenden um dafür zu sorgen, dass du keine Werte oberhalb von 4096 bekommst. Das Problem ist nur, dass auch dein Multiturn-Geber irgendwann einmal überläuft und dann wahrscheinlich so, dass es nicht in dein bisheriges Modulo passt.

Gruß
LL
 
Probier es mal so:

Code:
FUNCTION_BLOCK FB 100
TITLE =
VERSION : 0.1


VAR_INPUT
  Istwert : DINT ;	
  Set : BOOL ;	
END_VAR
VAR_OUTPUT
  Istwert_Scale : DINT ;	
END_VAR
VAR
  Offset : DINT ;	
  HMFlanke_Set : BOOL ;	
END_VAR
BEGIN
NETWORK
TITLE =

      U     #Set; 
      FP    #HMFlanke_Set; 
      SPBN  NIX; 

      L     #Istwert; 
      T     #Offset; 
NIX:  NOP   0; 

      L     #Istwert; 
      L     #Offset; 
      -D    ; 
      L     L#4096; 
      MOD   ; 
      L     L#0; 
      TAK   ; 
      <=D   ; 
      SPB   ENDE; 

      L     4096; 
      +D    ; 
ENDE: T     #Istwert_Scale; 
END_FUNCTION_BLOCK

Der geht dann von 0-4095, bei 4096 springt er wieder auf 0. Wenn das so nicht sein soll, sondern 1-4096, dann am Ende noch 1 drauf rechnen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@ larry Laffer
Und wieso nicht singleturn ??? Hüpft nach einer Umdrehung auf Null und ich brauche nie zu referenzieren.

0 -> 4096 auf 360° macht einen Schritt auf 0,08789 ° das ist fast nix. Ausser deine Walze hat einen sehr großen Durchmesser. Wie groß ist denn der Umfang ??

peter(R)
 
Wie groß ist denn der Umfang ??

Irgendetwas bei 630 mm

Und wieso nicht singleturn ???

Kann ich so etwas am Geber auch einstellen?
In der HW geht das ja über die Baugruppe, aber Geber???
Es ist ein Kübler Absolut Drehgeber Multiturn SSI 5863
Auflösung 13 bit ST + 12 bit MT.
Oder muss ich einfach nicht PED einlesen sondern nur ein PEW?
Der Geber liegt bei mit bei PED 264
 
Theoretisch schon aber dann liegt deine Auflösung bei > 1 ° . Wie gesagt hängt auch vom Durchmesser ( bzw. evtl. der Wegstrecke je Umdrehung )ab.

1° bei einem Durchmesser von 20 mm ist als Weg fast nix. Bei einem Durchmesser von 2 m eine ganze Menge.

Es gibt programmierbare Geber aber deiner ist leider keiner.

peter(R)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Geberauflösung von 256 / Umdrehung hättest du damit eine Wegauflösung von ca. 7,7 mm. DAS IST VERDAMMT VIEL !!
Bei dem was Du machen willst solltest du schon unter 1 mm liegen.

peter(R)
 
Das Problem ist nur, dass auch dein Multiturn-Geber irgendwann einmal überläuft und dann wahrscheinlich so, dass es nicht in dein bisheriges Modulo passt.

Und was kann man dagegen machen?

Grundsätzlich kannst du den Befehl MOD (Modulo) verwenden um dafür zu sorgen, dass du keine Werte oberhalb von 4096 bekommst.

Ich werde das Prog mal von Ralle ausprobieren.
Wo finde ich etwas über MOD?
 
Bei der 4096 er Version liegst Du bei 0,48 mm das sieht schon besser aus.
Ralles Programm sieht dafür sehr gut aus. Sein MOD Befehl setzt ja direkt auf der Auflösunfg des Gebers auf. Dann stimmts am Schluss auch wieder.

peter(R)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Geberauflösung von 256 / Umdrehung hättest du damit eine Wegauflösung von ca. 7,7 mm. DAS IST VERDAMMT VIEL !!
Bei dem was Du machen willst solltest du schon unter 1 mm liegen.

Also 1-2 mm wären nicht schlimm, da die Nuten groß genug sind,
aber 7,7 mm sind dann doch zu viel. So wie es jetzt ist, passt es ganz gut.
Ich muss es nur noch hinbekommen :ROFLMAO:
Danke schon mal für eure tolle Hilfe
 
Habe es doch noch bei mir in der WinPLC7 Hilfe gefunden :cool:

Kann mir mal kurz jeamand diesen Abschnitt erklären?

Code:
      L     #Istwert;//Ist Klar
      L     #Offset; //Ist KLar
      -D    ; 
      L     L#4096; 
      MOD   ;        //Warum?
      L     L#0;     //Warum?
      TAK   ;        //Was passiert hier?
      <=D   ;
      SPB   ENDE;       
      L     4096;   // Warum?
      +D    ; 
ENDE: T     #Istwert_Scale;

Danke
 
Das ist Faulheit von mir.

MOD ; //bildet den Divisionsrest, dieser steht dann in Akku 1
L L#0; //lädt 0 in Akku 1, was vorher in Akku 1 war, wird dabei automatisch in Akku 2 geschoben
TAK ; //Tauscht Akku 1 mit Akku 2, also steht nun der Divisionsrest in Akku 1 und die 0 in Akku 2
<=D ; //Vergleich
SPB ENDE; //wenn der Divisionsrest >= 0 (genauer, wenn 0 <= Divisionsrest) dann Sprung zum Ende. Dabei steht der Divisionsrest in Akku1 und kann so bei der Marke ENDE sofort in #Istwert_Scale gespeichert werden
L 4096; // Wenn der Divisonsrest negativ ist, dann muß man ihn positiv machen, indem man eine Umdrehung dazu addiert, ohne TAK hätte ich den Divisionsrest oben zwischenspeichern und hier wieder laden müssen, mit TAK steht er ja aber schon in Akku1 bereit!
+D ;
ENDE: T #Istwert_Scale;

Noch zur Erklärung. Der Divisionsrest ist natürlich nur negativ, wenn schon das Ergebnis von Istwert - Offsett negativ war, also falls der Geber mal ein Stück rückwärts läuft.

Nehmen wir an, der Offset war 7000
7001 ergibt einen Output von 1
6999 ergibt -1, was aber eigentlich Unsinn ist
also -1 + 4096 = 4095
so muß das ja auch sein, wenn man den Geber vor den Offset zurückdreht.
 
Zuletzt bearbeitet:
Das Tauschen kannst du auch weglassen, wenn du im nächsten Schritt das <=D durch >D ersetzt. Es geht ja nur darum, dass durch den Offset ein negativer Wert herauskommen kann und für diesen Fall dann wieder 4096 drauf addiert werden muss.
Der MOD-Befehl macht ja im Grunde genommen aus deinem Multiturn einen Singleturn-Geber.

Grüße von HaDi

[edit]
mal wieder zu langsam...
[/edit]
 
Zurück
Oben