Step 7 Die Peripherieadresse des Encoder als Zeiger verwenden...

lion1702

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin neu auf dieser Seite...und habe gleich auch eine spezielle Frage...
Erstens habe ich einen Encoder von Pepperl & Fuchs
Typ PVM58N - 011AGR0BY - 1213
PartNr. 243671
Vers. 2.2 Interface : Profibus
VCC 10-30V
SerNo. 40000019998969
Erstens weiß ich nicht welchen Encoder ich aus der Hardware nehmen soll
und 2tens weiß ich auch nicht wo ich suchen soll...denn alle Encoder die ich
gefunden habe passen nicht zu dem...vielleicht bin ich auch einfach nur Blind...
Wäre froh wenn ihr mich diesbezüglich unterstützen könntet...
Jetzt aber zum eigentlichen Problem :
Da befindet sich eine Detailbeschreibung im Anhang....mit entsprechenden Screenshots....
Alle Fragen sind in rot gekennzeichnet...
Vielen dank schon mal im voraus für eure Mühe und kooperative zusammenarbeit...
Servus
lion1702
 

Anhänge

  • Encoder.pdf
    480 KB · Aufrufe: 15
periperiadresse vom Encoder umwandeln zum pointer

Hallo zusammen

ich bin neu hier...und hab gleich ein paar Fragen...

Habe alles im Anhang dokumentiert mit screenshots....alle Fragen sind rot gekennzeichnet...

Der Encoder hat folgende Daten

Pepperl & Fuchs

TYP : PVM58N - 011AGR0BY - 1213
Part Nr : 243671
Version : 2.2 Interface : Profibus
VCC 10V - 30V
SerNo. 40000019998969

Danke für eure Hilfe im voraus...und eure kooperative zusammenarbeit

Servus
Lion1702
 

Anhänge

  • Encoder.pdf
    480 KB · Aufrufe: 12
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo lion,

habe mich lange in deine Situation versucht hinein zu steigern, bin mir aber noch nicht ganz sicher ob ich deine Problemstellung richtig verstanden habe.
Ich werde aus deiner Netzwerk beschreibung nicht ganz schlau. Poste beim nächsten mal den gesamten Code. Dann ist es für leichter das Programm zu verstehen.

zu Frage 1: SLD 3 ist, wie du schon sagtest, eine Schiebefunktion für ein Doppelwort. Jedoch haben nur REAL-Zahlen Kommastellen und die können mit der RND Funktion abgeschnitten. Bei SLD werden die Bits um n-Stellen nach links verschoben und die freigewordenen Stellen werden mit 0 aufgefüllt. Das Zahlenformat bleibt gleich.
Pointer ist kein Zahlenformat. Es ist eine Funktion um auf einen bestimmten Speicherbereich zu zeigen.
Aus der Peripherieadresse kannst du alles Mögliche lesen. In deinen Fall wird ein Binär Code als Wort übertragen. Mehreres findest du im Benutzerhandbuch des Encoders.

LAR1 Funktion verhält sich anders:
LAR1 lädt das Adreßregister AR1 mit dem Inhalt von AKKU 1 (32 Bit-Pointer). AKKU 1 und AKKU 2 werden nicht verändert. Die Operation wird ausgeführt, ohne die Statusbits zu berücksichtigen oder zu beeinflussen.

L PED(AR1,P#0.0) hast du dich vertippt, oder steht das wirklich so im Programm. Das kann ich mir schwer vorstellen und meine S7 erlaubt diese schreibweise nicht. Entweder du ladest ein Peripherie-Doppelwort oder du zeigst auf den Speicherbereich 0.0 des AR1, aber beides kommt mir merkwürdig vor.

L PEW: Peripherie Eingangs Wort - ladet das Eingasngwort
T PAW: Peripherie Ausgangs Wort - transferiere in das Ausgangswort

Frage 4: Hier hast du eine Und-Funktion für Doppelwörter UD=Und Doppelwort. Funktioniert gleich wie die Bool,sche Und-Verknüpfung.
Warum es so geschrieben worden ist, musst den Programmierer des Bausteins fragen und was er sich dabei gedacht hat.

Ohne dem restlichen Programmcode kann man nur spekulieren.

Deine Platzhalter Variable werden entweder im Programm verwendet oder der Startwert wurde mit 1 deklariert.

Du müsstest mir mal erklären was L-Bits sind. L B#16#FF bedeutet dass dieser in den AKKU1 geladen wird. FF=255=11111111
und diese werden dann mit T DBB46 in das Byte 46 transferiert.

Warum wird es 430 multiplizieren? Kann ich dir auch nicht genau sagen, ich tippe aber das es irgendein maximal Wert ist, z.B. von der 430cm Fahrstrecke oder Hebehöhe. Aber das kann ich nicht mit Sicherheit sagen.

letzte Frage: Der Encoder ist nur für die Geschwindigskeit auswertung vorgesehen. Eine Referenzfahrt wird im Bedienerprogramm geschrieben, ausgewertet und gesteuert.

Ich hoffe ich konnte deine Fragen so gut es geht beantworten. Und poste beim nächsten mal den gesamten Programmcode mit.

gruß
marco
 
1. Das Programm scheint in Ordnung zu sein.

Es wird die Eingangsadresse in das Pointerformat überführt und danach werden
2 x je 4 Byte geladen.
1. 4 Byte (Eingangsadresse + 0) nach DBx.DBD40
2. 4 Byte (Eingangsadresse + 4) nach DBx.DBD44

Das 1. Ausmaskieren entfernt offenbar Statusbits, übrig bleibt die Position.
Diese wird normiert (*430…), das ist Abhängig vom Encoder (Inc/Umdr.) und von der Mechanik der Maschine (Getriebe, Zahnreihen, Reibrad…)
Raus kommt dann z.Bsp ein Wert in mm als Gleitpunkt.

2. Im DB (DBD40+44) sieht man die Funktionen der einzelnen Bits, die weitere Ausmaskierung kann man sich da ableiten.

3. Man sollte möglichst die Bedienungsanleitung des Encoders inkl. der Profibusschnittstellenbeschreibung heben, dann kann man das nachlesen.

4. Die Hardwarekonfig scheint nicht korrekt. Es werden 8 Byte gelesen, also muß man auch mindestens 8 Byte in der Hardwarekonfig eintragen.
Die richtige GSD ist dazu eigentlich unabdingbar.
 
Hier ein link nach dass handbuch von die encoder: http://files.pepperl-fuchs.com/selector_files/navi/productInfo/doct/tdoct0242__ger.pdf

Fur dass umsetsen von dass INT adress nach ein Pointer must dass INT multiplizieren mit 8 und SLW 3 = * 8
Code:
L     534  //Adres wie INT
SLW 3     //Adres * 8 = Pointer adres 534.0
LAR1      // P# 534.0 in AR1 laden
L     PED [AR1,P#0.0]      // L PED 534
L     PED [AR1,P#4.0]      // L PED 538

L DBD 40 // Lädt den Inhalt von DBD40…also die Statusbits
L W#16#1FFF // Frage???? Was bringt mir diese Ausmaskierung????
UD
T #EncoderPosition // Das ergibt dann angeblich die Encoderposition…??? Woher weiß man
soetwas???
U #PVS58.Input.ActualValue_23 // Dieses bit ist immer 1…für mich ist das nur ein
Platzhalterbit…aber durch die verschieden Wandlungen ist das bit eben 1…Ich versteh auch nicht
warum man soetwas macht ????
SPBN m001 // Springe wenn VKE = 0…so da das bit zuvor 1 ist durchläuft es auch diesen Part…
L B#16#FF // Hier werden nur die L-bits ausmaskiert…wobei dieses auch keine Änderung mit
sich bringt auf den Zahlenwert????
T DBB 46 // Dann ergibt das wieder die Encoderposition….
Code:
[FONT=Calibri][SIZE=3][FONT=Calibri][SIZE=3]L DBD 40 // Lädt den Inhalt von DBD40…also die Statusbits
L W#16#1FFF // Zahlwert = 25 bit
UD  // filter bit 26 - 31 aus Eingangwert
T #EncoderPosition // Encoder wert ist max 25bit
[FONT=Calibri][SIZE=3][FONT=Calibri][SIZE=3]U #PVS58.Input.ActualValue_23 // Kontrole auf negatief zahl ( solte eigenlich #PVS58.Input.ActualValue_24 sind)
SPBN m001 // Springe wenn Encoderwert positief ist.
[FONT=Calibri][SIZE=3][FONT=Calibri][SIZE=3]L B#16#FF //
[/SIZE][/FONT][/SIZE][/FONT]T DBB 46 // DBD 46 wurde negatief   Gibt geleiche resutat wie L  [FONT=Calibri][SIZE=3]#EncoderPosition[/SIZE][/FONT]       NEGD   T [FONT=Calibri][SIZE=3]#EncoderPosition [/SIZE][/FONT]
[/SIZE][/FONT]  [/SIZE][/FONT]  [/SIZE]  [/FONT]  [/SIZE]  [/FONT]

Normal ist dieser encoder geeigent om auch die geschwindigkeit auszugeben, aber ich vermutte dass die richtige GSD datei nicht geladen ist.

Bei ein steigende flanke von Ausgangsbit 31 wurde die Preset wert in encoder ubernommen und nullspannungssicher in einem EEPROM abgespeichert.

Edit: Ralle war schneller

Gruss,

Joop
 
Zuletzt bearbeitet:
Zurück
Oben