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

Ergebnis 1 bis 7 von 7

Thema: kann mir das bitte mal einer erklären

  1. #1
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard


    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...
    Zitieren Zitieren kann mir das bitte mal einer erklären  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    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.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Garog ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard

    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/P...-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

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    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...
    Geändert von Ralle (28.08.2006 um 14:42 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #5
    Garog ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard

    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?

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    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.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #7
    Garog ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    166
    Danke
    11
    Erhielt 10 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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^^

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 03.11.2011, 13:46
  2. Kann mir jemand den Begriff Pollzeit erklären?
    Von Mike Vanstrike im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.03.2011, 14:04
  3. Kann mir das jeman erklären ?
    Von Pockebrd im Forum Programmierstrategien
    Antworten: 13
    Letzter Beitrag: 01.07.2010, 16:06
  4. Antworten: 7
    Letzter Beitrag: 09.01.2010, 12:07
  5. Bitte aufhören jetzt, ich kann nicht mehr
    Von OHGN im Forum Stammtisch
    Antworten: 3
    Letzter Beitrag: 09.08.2008, 18:09

Lesezeichen

Berechtigungen

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