TIA Pepperl + Fuchs WCS3B-LS610 auslesen

CallHeTempi

Level-2
Beiträge
58
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe den Lesekopf "WCS3B-LS610" von Pepperl+Fuchs, welchen ich über eine Profinetschnittstelle mit meiner SPS "1211 DC/DC/DC" auslesen muss.
Konkret geht es um die Positionsdaten und die Geschwindigkeitsdaten. Pepper liefert dazu eine GSDML-Datei aus und gibt ein paar Informationen darüber, wie man die Daten, die ankommen verarbeiten kann. Ich habe aber noch nie damit gearbeitet und kann damit nicht so richtig was anfangen. Wie ich die ankommenden Bit-Daten in mm umwandeln kann ist mir klar, jedoch weiß ich nicht wie ich überhaupt an diese Daten rankomme. Ich muss die ja irgendwie in meinen Baustein bekommen um die dann verarbeiten zu können.
Die GSDML-Datei habe ich schon eingebunden und unter den "Nicht gruppierte Geräte" finde ich auch das entsprechende Gerät. Nur weiter weiß ich jetzt nicht.

Weg-Codier-System WCS3B-LS6xx

Hier ist das Datenblatt. Auf Seite 59 geht es mit meinem Lesekopf los.

Ich hoffe ihr könnt mir weiterhelfen. Vielen Dank im voraus
 
Was meinst du mit an die Daten rankommen?

Die Module sind konfiguriert?

1717141271693.png
Der rot markierte Bereich ergibt sich wegen der Verwendung einer UDT.

UDT
1717141356089.png



1717141410649.png

Ob die Position so richtig dargestellt wird, muss man sich dann mal Live anschauen ggf ändern.
 
Zuletzt bearbeitet:
1717143973041.png,

Die UDT musst du selber erstellen ;-)

Und ich habe gerade gesehen, dass ich einen Fehler in der UDT gemacht habe. Die Fehler kommen nach der Geschwindigkeit

1717144055977.png
 

Anhänge

  • 1717143610551.png
    1717143610551.png
    257,7 KB · Aufrufe: 6
  • 1717143916307.png
    1717143916307.png
    321,5 KB · Aufrufe: 2
Zuletzt bearbeitet:
Das mit den Modulen habe ich jetz genau wie du.
Wie erstelle ich ein UDT? Ist das einfach eine Variabelntabelle oder ein DB?
Wie wird der dann verwendet, ich muss da doch bestimmt noch die Adressen der Module(z.b. Geschwindigkeit) angeben, damit die richtigen Werte in der richtigen Variable stecken. Wie läuft das?

Ah ok das mit dem Verbinden der Variabeln habe ich gerade gerafft, ist ja klar. Ich muss die später im Main richtig verknüpfen. Bleibt nur noch die Frage der UDT
 
Zuletzt bearbeitet:
Wow cool, danke dir! Ich kann das ganze leider noch nicht testen, da mir das Kabel fehlt...aber du hast mich viel weiter gebracht. :)
Wäre es vlt möglich, das du mir kurz erklärst, woher du die ganzen Informationen hast und wonach du die ganzen Tabellen erzeugt hast? Ich denke mal nicht das du den Speziellen Sensor bei dir rumliegen hast. :D Wo aus der Dokumentation hast du die Infos gezogen?
 
In der Dokumentation ab Seite 66 ff. findest du die Schnittstellen Beschreibung. Dort werden auch die Datentypen beschrieben siehe Screenshot:

1717147182235.png

Die Tabellen habe ich mit Excel ausgelesen und anschließend in die UDT kopiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich konnte das ganze jetzt mal testen. Läuft wunderbar, jetzt habe ich nur das Problem, das ich Werte (16#0004_41B8) raus, ich brauche jetzt aber mm werte :D Kann ich das mit "Convert" machen? Wenn ja wie ?
Ich habe es mit "Real to Int" versucht, bekomme dann aber immer 0 raus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Versuch mal die Position als Int bzw Uint zu deklarieren, also in der UDT. Scheinbar war im mit dem Real auf der falschen Fährte.
Wenn ich den Hex Wert in Dez konvertiere, komme ich auf 79918, kann das hinkommen?

1717487258851.png
 
Ich kenne den Lesekopf nicht, doch mir fällt auf: Wie kommst du darauf, dass die Position ein REAL-Wert ist? Ich verstehe die Doku in #8 so, dass die Position ein DINT- oder UDINT-Wert ist, und würde den in REAL konvertieren und dann mit 0.8 mm multiplizieren: 16#0001_382E = 79918 * 0.8 = 63934.4 mm
z.B. als SCL-Netzwerk:
Code:
rPosition_mm := DINT_TO_REAL("PosReader".Position) * 0.8;

PS: jetzt habe ich die bei dir angehängte Tabelle (mit Word 1 und Word 2) gesehen. Die interpretiere ich so, dass der Wert ein UDINT ist.
--> also "PosReader".Position und %ID22 als UDINT deklarieren
Code:
rPosition_mm := UDINT_TO_REAL("PosReader".Position) * 0.8;
 
Zuletzt bearbeitet:
@PN/DP Okay, jetzt macht das ganze Sinn. Ich bekomme sinnvolle werte wie "1996" was 1,996m entspricht. Dann hab ich die Schiene mal etwas bewegt und die Werte bewegen sich Sinnvoll in die jeweilige Richtung.

Ich kann zwar schon einiges Programmieren, bin aber echt unwissend, was so Bytes, Real, Hex usw angeht daher kam ich hier nicht weiter.

Ich teste das ganze jetzt noch an der richtigen Schiene und dann melde ich mich nochmal!
Vielen Dank!!
 
Anhang anzeigen 78634
Dashier würde ich jetzt mal selber versuchen, habt ihr vlt ein kleinen Tipp? :D
Das ist ein Byte mit möglichen Werten 0..127 = nur positive Werte --> USINT (unsigned short Int, 1 Byte) --> das %IBxx als USINT deklarieren
(SINT = (signed) short Int = 1 Byte geht aber auch, weil der negative Wertebereich nicht genutzt wird.)
INT bedeutet Integer = Ganzzahl

siehe TIA Hilfe "Übersicht über die gültigen Datentypen" und "Datentypkonvertierungen bei S7-1200"
TIA kann zwar USINT zu REAL implizit konvertieren, ich würde aber trotzdem für die Verständlichkeit die explizite Konvertierung angeben.
Code:
rGeschwindigkeit := USINT_TO_REAL(%IBxx) * 0.1; // * 0.1 m/s

USINT 0..125 bedeuten 0.0 .. 12.5 m/s, die Werte 126 und 127 haben besondere Bedeutung. Das könntest/müsstest du noch irgendwie passend für dich einarbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
siehe TIA Hilfe "Übersicht über die gültigen Datentypen"
Ich fasse es nicht, die TIA Erklärungen der signed Integer Datentypen sind auch in TIA V19 noch falsch! Da wird immer noch behauptet, dass die Datentypen ein gesondertes Vorzeichenbit besitzen und nur die Bits ohne das Vorzeichenbit für die Größe der Zahl stehen. (p.-) 🤦‍♂️ Das wird wohl niemals mehr korrigiert werden ... zu teuer? Oder hat im TIA Entwickler-Team wirklich niemand Ahnung davon? ;)
 
Guten Morgen zusammen!

Das ist ein Byte mit möglichen Werten 0..127 = nur positive Werte
Warum hat das Byte 127 mögliche Werte, wenn ein Byte eigentlich 256 mögliche Zustände hat?


USINT 0..125 bedeuten 0.0 .. 12.5 m/s,
Das wäre ja theoretisch einfach eine Lineare Gleichung. Muss ich mich überhaupt mit dem Byte beschäftigen?
Warum USINT 0..125? Der Wertebereich müsste doch größer sein oder ?
Ein Int ist ja auch viel größer (irgendwas mit 32.000)Screenshot (99).png
Achso, also ist ein USINT eben einfach ein Byte groß?
 
Zuletzt bearbeitet:
@CallHeTempi
Das liegt am Vorzeichen. Das MSB (MostSignificantBit, Höchstwertiges Bit, das Ding ganz links) zeigt mit 0 oder 1 an, ob ein positives oder negatives Vorzeichen existiert.

Also: 0..255
oder -127...+127
 
Zurück
Oben