kann mir das bitte mal einer erklären

Garog

Level-1
Beiträge
197
Reaktionspunkte
32
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich darf mich momentan an einer alten Anlage austoben, bei der es um Positionierung mit Hilfe von Absolutwertgeber von TR geht.

Allerdings steige ich durch ein FC nicht durch...

Ich soll bei dem FC angeblich über die Schnittstellen nur angeben müssen
welche Adresse er hat (E/A)
wieviel punkte er pro umdrehungen macht
wo er sich momentan befindet ( in mm )
einen eingang um ihn auf "0" zu setzten (die angezeigte Ausgangsposition denke ich mal)
und einen Offsetwert...

Am Ausgang bekomme ich dann
die Höhe in dint ( in mm )
die Höhe in real ( in mm )
und die Punkte bei dennen der encoder steht

So sagte es mir ein alter Programmierer aus meiner Firma, er selber wusste aber auch nicht so genau mehr wie das geht.


Ist soweit auch in ordnung
die umrechnung der punkte pro umdrehung in zurückgelegt strecke in mm klappt auch
aber wenn ich einen ZeroSet machen will dann kann ich den ausgang nicht zurück setzten auf 0
oder wenn ich einen Offsetwert eingebe rechnet er den nicht dazu...

hier mal die quelle des FC

Code:
FUNCTION "EncoderV2" : VOID
TITLE =Einlesen T&R Encoder CE65M V2.2
VERSION : 0.0


VAR_INPUT
  BasAdr : INT ;    //Profibusadresse
  Steig : REAL ;    //Steigung [Xmm]
  PPR : DINT ;    //Pulse pro Umdrehung
  ZeroSet : BOOL ;    //Berechnung des Offsets mit True
  Preset : REAL ;    //Presetwert [mm]
END_VAR
VAR_OUTPUT
  PosI : INT ;    //Position [1/100mm] Interger
  Pos : REAL ;    //Position [Xmm]
  Enc : DINT ;    //Encoderwert [Pulse]  
END_VAR
VAR_IN_OUT
  Offs : DINT ;    //Offset 
END_VAR
VAR_TEMP
  PosReal : REAL ;    //Position [Xmm]
  Temp : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =SCL Netzwerk
      SET   ; 
      SAVE  ; 
      =     L      8.1; 
      L     #BasAdr; 
      ITD   ; 
      L     L#0; 
      +D    ; 
      L     L#8; 
      *D    ; 
      LAR1  ; 
      L     PED [AR1,P#0.0]; 
      T     #Enc; 
      L     #Enc; 
      L     #Offs; 
      +D    ; 
      T     #Temp; 
      L     #Temp; 
      L     DW#16#FFFFFF; 
      UD    ; 
      T     #Temp; 
      L     #Temp; 
      L     DW#16#800000; 
      UD    ; 
      L     DW#16#800000; 
      ==D   ; 
      SPBN  A7d0; 
      L     #Temp; 
      L     DW#16#FF000000; 
      OD    ; 
      T     #Temp; 
A7d0: L     #PPR; 
      DTR   ; 
      L     #Steig; 
      TAK   ; 
      /R    ; 
      L     #Temp; 
      DTR   ; 
      *R    ; 
      T     #PosReal; 
      L     #PosReal; 
      T     #Pos; 
      L     #Pos; 
      L     1.000000e+002; 
      *R    ; 
      RND   ; 
      T     #PosI; 
      CLR   ; 
      U     #ZeroSet; 
      SPBN  A7d1; 
      L     #PPR; 
      DTR   ; 
      L     #Preset; 
      *R    ; 
      L     #Steig; 
      /R    ; 
      RND   ; 
      L     #Enc; 
      -D    ; 
      T     #Offs; 
A7d1: CLR   ; 
      U     L      8.1; 
      SAVE  ; 
      BE    ; 
END_FUNCTION
Diesen Teill verstehe ich bereits
Code:
7d0: L     #PPR; 
      DTR   ; 
      L     #Steig; 
      TAK   ; 
      /R    ; 
      L     #Temp; 
      DTR   ; 
      *R    ; 
      T     #PosReal; 
      L     #PosReal; 
      T     #Pos; 
      L     #Pos; 
      L     1.000000e+002; 
      *R    ; 
      RND   ; 
      T     #PosI;
Ist halt die Umrechnung der punkte in die gefahrene Strecke.

der rest ist mir nicht so ganz klar
verstehe zwar schon immer teile davon aber nie das ganze im zusammenhang

Ich wäre auch mega verbunden, wenn mir da einer bei helfen kann...
auch gerne per icq oder msn...
 
Ursprünglich wurde der Baustein in SCL geschrieben, was du hast ist entweder das compilierte Ergebnis, oder daran wurde auch nochmal etwas rumgeschraubt.

Eigentlich sollte das mit dem Preset gehen, solange ZeroSet auf True ist, sollte POS den Presetwert anzeigen, Offset wird solange neu berechnet. Nun mußt du ZeroSet wieder auf False setzen, damit der Baustein wieder die aktuelle Position (ab dem Moment, wo ZeroSet wieder False ist, wird die zurückgelegte Strecke zum Presetwert dazugezählt bzw. abgezogen) anzeigt, ansonsten wird ständig ein neuer Offset berechnet und Pos auf dem Presetwert gehalten. Das Beste wäre es, ZeroSet von außen mit einem Flankenmerker zu beschalten.

Der Codeteil am Anfang beschäftigt sich mit der Berechnung der Adresse des PEW, in welchem der Wert des Gebers steht und der Ausmaskierung bestimmter Ergebnisse bzw. Reaktion darauf (Überlauf???). Wozu das gut ist hängt wohl mit der Ausgabe zusammen, die der Geber bringt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dank dir ertsmal für die antwort
aber soweit ist mir die funktion auch klar gewesen ;)

ich vermute auch wo der fehler lag
kann es leider erst am montag ausprobieren...
vermutlich war die steigung zu klein da sich im moment noch ein getriebe mit der übersetzung von n1=250 zu n2=5 in der anlage befindet
wenn ich also eine steigung von 0.00001mm bei einer umdrehung habe (ich glaube es war sogar noch eine null mehr, wurde über einen laser ausgemessen) und einen preset wert von 250 mm habe dann kommt es da wohl zu einer etwas großen zahl wenn ich mir meinen offset berechnen lasse den ich dann ja bei der zweiten schleife nutze.

mir ist in dem fc eigentlich inzwischen alles klar
allerdings verstehe ich genau den teil garnicht den du leider so kurz abbehandelt hast.
nämlich den teil wo es um die berechnung des pew geht
das würde ich gerne genau wissen. vor allem wie ich von dem integer wert auf die adresse des busteilnehmers komme. bzw wie er den integer nutzt ( ist ja in dem sinne die adresse des ersten E/A's

ich habe ja am ausgang #enc den wert den der absolutwertgeber an punkten gemacht hat. aber wie rechnet den bitte schon die funktion punkte dazu bzw wieder punkte ab,...
genau so mit dem ausklammern wie du es nennst...
was klammere ich den da bitte schön aus....

vll hilft dir das etwas wenn du dich etwas mehr damit beschäftigen möchtest.
http://www.tr-gruppe.de/Dokuserver/PDFs/Dokumentationen/TR-ECE-BA-D-0009.PDF
interessant sind die punkte 3.9.1.4 und 3.11.1
das sollte so weit wie ich meine das sein was du bräuchtest in bezug auf den geber um die das mit dem ausklammern erklären zu können
wie man aus 3.9.1.4 entnehmen kann handelt es sich bei dem verwendeten typ um einen class 2 32bit

ist auch nicht viel zu lesen^^

danke dir
 
Zur Adress-Berechnung
Code:
      L     #BasAdr; //hier steht die Hardwareadresse, 
                          ab hier 1 DWORD entspricht dem Wert des Gebers
      ITD   ; //muß ein Pointer werden, 
                der ist aber vom Typ DWord, deshalb wandeln
      L     L#0; // das ist eigentlich Käse und dem SCL-Compiler 
                    zu verdanken, stört nicht, kann aber auch weg
      +D    ; //dto.
      L     L#8; //die 3 rechten Bit eines Pointers enthalten die Bitadresse, 
                   also 3 nach rechts schieben; L#8; *D --> analog dazu SLD 3
      *D    ; 
      LAR1  ; //ins AR1 laden
      L     PED [AR1,P#0.0]; //Wert auslesen
      T     #Enc; //in Var speichern

so, mal zum "Ausklammern"

Code:
      L     #Enc; //Wert des Gebers
      L     #Offs; //Offsetwert dazuaddieren
      +D    ; 
      T     #Temp; //sichern
      L     #Temp; //muß nicht sein, ist vom "Compiler"
      L     DW#16#FFFFFF; //mit dieser Maske wird das "oberste" Byte ausmaskiert, 
                          der Wert besteht also effektiv hinterher nur noch aus 
                          den "unteren" 3 Byte  
      UD    ; 
      T     #Temp; 
      L     #Temp; 
      L     DW#16#800000; //nun werden die unteren 3 Byte ausmaskiert, 
                                    das 3. Byte mit wird mit 80 ausmaskiert
      UD    ; 
      L     DW#16#800000; //hier wird geprüft, ob das 3. Byte 80 Hex 
                                    enthält (10000000 binär)
      ==D   ; 
      SPBN  A7d0; //wenn nein, dann sprung zu A7d0
      L     #Temp; //wenn ja, dann Temp mit FF000000 verodern
      L     DW#16#FF000000; 
      OD    ; 
      T     #Temp; 
A7d0: L     #PPR;

Wozu das gut sein soll, kann ich auch aus der PDF-Anleitung nicht herauslesen. Es sieht so aus, als ob ab einem bestimmten Wert (ab 80FFFF Hex bis FFFFFF Hex) das 4 Byte einfach mit FF aufgefüllt wird (ansonsten ist das 4.Byte 0). Wozu das gut ist, kann ich nicht erkennen.

Was meinst du mit Punkte zu- ind wieder abrechnen?

PS. Tut mir leid, die Codedarstellung im Forum ist Schei...
 
Zuletzt bearbeitet:
Vielen dank erstmal

das bisher unbewuste war das mit dem ausmaskieren wo ich genau wie du bisher keinen sinn drin sehe...

ich habe ja am ausgang #Enc die anzahl der Punkte die der Geber gemacht hat. Mache ich mit meinem Motor eine Umdrehung steht dort 4096. mache ich die selbe umdrehung nur in die andere richtung steht dort wieder 0
d.h. ich muss ja irgendwo die gefahrenen punkte dazuaddieren bzw subtrahieren.
vor allem das hier ist komisch
Code:
 LAR1  ; //ins AR1 laden
 L     PED [AR1,P#0.0]; //Wert auslesen
da lade ich das ganze wort ins adressregiester und dann lade ich dort nur ein bit raus...
oder habe ich das falsch verstanden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
LAR1 ; //ins AR1 laden L PED [AR1,P#0.0]; //Wert auslesen​

da lade ich das ganze wort ins adressregiester und dann lade ich dort nur ein bit raus...
oder habe ich das falsch verstanden?

Ja, das hast du tatsächlich falsch verstanden.
im AR1 steht der Pointer, der entspricht der HW-Adresse 3 nach links geschoben (das ist wegen der Bitadresse).
P#0.0 ist ein Offset. Damit von der berechneten Adresse geladen wird muß hier P#0.0 stehen.
Wenn du z.Bsp. P#2.0 reinschreibst, lädt er den Wert 2 Byte "oberhalb" der Hardwareadresse.
Die Bitadresse ist immer im Pointer vorhanden, egal ob du auf Bit oder Worte zugreifst, nicht irritieren lassen.
Du lädst ein ganzes PED.


Die Addition erfolgt hier:

Code:
  T     #Enc; 
  L     #Enc; 
  L     #Offs; 
  +D    ;

Der Baustein liest am Anfang immer den aktuellen Wert des Gebers ein und addiert den Offset drauf.
Drehst du den Geber zurück, wird der aktuelle Istwert des Gebers kleiner, dann kommt noch der Offset dazu, fertig.

Die Ausmaskierung könnte evtl. einen Überlauf anzeigen, der Wert wird ja sprunghaft größer, oder es ist eine Art Treppenfunktion.
 
alles klar
dank dir vielmals
hat einiges aufgeklärt bei mir
unter anderem das ich mir nochmal meine schulungsunterlagen herraus holen soll und mir nochmal etwas zu pointer durchlesen muss^^
 
Zurück
Oben