Step 7 FB22 "Getio_Part" Eingangsparameter ID

Ich.0815

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute.

Ich sitze jetzt schon seit einiger Zeit über dem Problem, dass ich nicht so ganz verstehe was der FB22 bei ID genau von mir erwartet.
Mein Projekt kann ich zwar auch anders lösen, aber ich würde es gerne mit dem FB22 tun, oder wenigstens Verstehen wo mein Fehler liegt.

Für alle die immer gleich fragen mit was ich denn überhaupt arbeite:
CPU 315
ET200AL -> CM 4xIO-Link -> Wenglor-Reflexlichtschranken

Kann mir irgendjemand sagen wo ich denn nun diese benötigte logische Adresse herbekomme?
Ich habe aus meiner Sicht schon alles probiert was mir eingefallen ist. Das jetzt alles aufzuzählen würde etwas lange dauern. Ich habe mich auch schon durch die Foren gewühlt und die Lösung für TIA gefunden. In der Variablentabelle, Reiter Systemkonstante soll dort ja die Lösung stehen. Nur wie sieht das bei Step 7 aus? Beim SFC5 kommt als Ergebnis auch 256 raus.

Gruß
Lisa
 
An ID ist die Anfangsadresse des Prozessabbildes des Moduls anzugeben, im Prinzip so wie du es z.B. beim DPRD_DAT machen würdest.
Der FB macht imho nichts weiter als die Daten per UBLKMOV umzukopieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur mit dem Unterschied, dass ich bei DPRD_DAT zb. das PEW256 (das erste der Baugruppe) ran schreiben kann und es dann funktioniert. Aber am FB22 kann ich kein WORD schreiben, da muss ich ein DWORD hängen. Und egal was auch immer ich versuche, kriege ich entweder einen Fehler bei der internen Verarbeitung oder einfach kein Ergebnis. Ich habe an den In/Out-Parameter "Inputs" jetzt mal das MD100 geschrieben um beobachten zu können, ob ich denn ein Ergebnis bekomme. Vielleicht habe ich auch einen Denkfehler drin und bei diesem Baustein funktioniert das mit dem MD100 nicht.
PEW256 kann ich nicht an die ID schreiben. Bei PED256 bekomme ich einen internen Bearbeitungsfehler. ED/EW geht ja auch nicht, da es Peripherie-Eingänge sind. Die Logische Adresse vorher via SFC5 auslesen bringt nichts, da ich dann als Ergebnis 256 gekomme. Diverse Versuche einen Pointer ran zu schreiben sind auch gescheitert.
Ich verstehe also leider immer noch nicht so ganz, was ich jetzt genau ran schreiben soll um im MD100 mein Ergebnis zu sehen
(mit DPRD_DAT funktioniert es und mit UBLKMOV auch. Aber wie schon gesagt würde ich einfach gerne verstehen was ich da falsch mache)

Gruß
Lisa
 
Wenn du sonst mit PEW256 etwas einlesen würdest, dann musst du an ID meiner Meinung nach die 256 oder eben in hexadezimaler Form DW#16#100 eintragen.
Zumindest verstehe ich das aus der Beschreibung, selber verwende ich diesen FB nicht, wenn ich konsistent etwas lesen möchte dann nehme ich den DPRD_DAT.
 
Der GETIO_PART will einfach nur die Zahl der logischen Adresse haben, er braucht keine Bereichskennung E.. weil es ja sowieso immer E.. ist. Du kannst so schreiben:
Code:
      CALL  GETIO_PART , "GETIO_PART_DB"
         ID     :=DW#16#100
         ...

// oder

      L     256
      T     #temp_DWord

      CALL  GETIO_PART , "GETIO_PART_DB"
         ID     :=#temp_DWord
         ...

// oder

      CALL  GADR_LGC
         ...
         LADDR    :=#GADR_LADDR

      L     #GADR_LADDR    // WORD
      T     #temp_DWord    // DWORD

      CALL  GETIO_PART , "GETIO_PART_DB"
         ID     :=#temp_DWord
         ...

// Aus der Bausteinhilfe zu GETIO_PART:
// Parameter        ID
// Datentyp         DWORD
// Speicherbereich  E,A,M,D,L oder Konstante
// Beschreibung     low word: logische Adresse der DP-Slave-/PROFINET-IO-Komponente(Baugruppe bzw. Modul)
//                  high word: irrelevant

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja leider funktioniert keine eurer vorgeschlagenen Möglichkeiten. Egal ob ich die Zahl 256 direkt als DW#16#100 ran schreibe, oder ob ich sie vorher in einer Variablen zwischenspeichere. Auch der SFC5 (GADR_LADDR), der ja nur wieder 256 zurück liefert funktioniert nicht.
Also bin ich irgendwie doch nicht zu doof dazu, es funktioniert nur einfach nicht wirklich. Is ja schon etwas enttäuschen, wenn in der Standard Bibliothek Bausteine Angeboten werden die nicht so funktionieren wie sie sollen. Auch der FB20 funktioniert nicht. Egal was ich mache
Ich habe es mit dem UBLKMOV gelöst. Dacht nur es wäre nicht schlecht es auch mit dem IO-Baustein zu lösen, wenn es den schon gibt.
Dann sag ich mal danke für eure Hilfe.
 
Ist Deine Baugruppe einem Prozessabbild zugeordnet?
Wo rufst Du den GETIO_PART auf?

Aus der Baustein-Hilfe zu GETIO_PART:
Hilfe zu Systemfunktionen/-funktionsbausteinen schrieb:
Sie müssen dem OB, in dem der FB 22 "GETIO_PART" aufgerufen wird, ein Teilprozessabbild der Eingänge zuordnen. Sie müssen weiterhin vor Aufruf des FB 22 den zugehörigen DP-Normslave bzw. das zugehörige PROFINET IO-Device in dieses Teilprozessabbild der Eingänge aufnehmen. Falls Ihre CPU keine Teilprozessabbilder kennt oder Sie den FB 22 im OB 1 aufrufen wollen, müssen Sie vor Aufruf des FB 22 den zugehörigen DP-Normslave bzw. das zugehörige PROFINET IO-Device in das Prozessabbild der Eingänge aufnehmen.

Harald
 
Zuletzt bearbeitet:
Wenn ich ehrlich bin kann ich mit dem Hinweis in der Hilfe nichts anfangen. Vielleicht stehe ich auch nur auf dem Schlauch. Aber ich kapiere gerade nicht was damit gemeint ist „einem Prozessabbild zugeordnet“. Wird nicht von jedem Eingang am Anfang des Zyklus automatisch ein Prozessabbild erstellt? Also damit auch zugeordnet?

Aktuell ruft der OB1 den FB4010 auf. Und darin als Multiinstanz den FB4050. In diesem FB4050 sollte der FB22 aufgerufen und bearbeitet werden
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur mit dem Unterschied, dass ich bei DPRD_DAT zb. das PEW256 (das erste der Baugruppe) ran schreiben kann und es dann funktioniert. [...]
mit DPRD_DAT funktioniert es und mit UBLKMOV auch
Ich habe es mit dem UBLKMOV gelöst.
Bitte zeige uns mal wie Du das mit dem UBLKMOV gelöst hast. UBLKMOV kann gar nicht aus Peripherie-Eingängen lesen. UBLKMOV müsste den Fehlerstatus W#16#8124 liefern (Bereichsfehler beim Lesen eines Parameters, und zwar des ersten Parameters SRCBLK), wenn Du bei "UBLKMOV" SRCBLK:=PEW256 schreibst

DPRD_DAT funktioniert ebenfalls nicht, wenn Du LADDR:=PEW256 schreibst, weil DPRD_DAT dann nicht von PEW256 liest sondern den gerade anliegenden Wert aus PEW256 als E-Adresse nimmt!

Hilfe zu Systemfunktionen schrieb:
Mit dem FB 22 "GETIO_PART" lesen Sie konsistent einen Teil des zu einem DP-Normslave / PROFINET IO-Device gehörenden Prozessabbildbereichs. Der FB 22 ruft dabei die SFC 81 "UBLKMOV" auf.
UBLKMOV (und damit GETIO_PART) kann nicht aus Peripherie-Eingängen lesen (z.B. nicht PEW256), sondern nur aus dem Speicherbereich der Eingänge E... (z.B. EW256). Damit bei dem Kopieren mit GETIO_PART was rüberkommt, muß in dem Speicherbereich EW256 auch was drinstehen - das Betriebssystem der CPU oder eine SFC wie SFC26 "UPDAT_PI" oder SFC126 "SYNC_PI" (oder SFC14 "DPRD_DAT") muß die Werte aus den Peripherieadressen zuvor in die Adressen im Speicherbereich der Eingänge kopiert (aktualisiert) haben. Das Prozessabbild der Eingänge liegt im Speicherbereich der Eingänge mit der selben Adresse: z.b. das Prozessabbild von PEW256 ist EW256. Das Prozessabbild wird allerdings nicht unbedingt automatisch mit den Werten aus der Peripherie aktualisiert.

Wenn ich ehrlich bin kann ich mit dem Hinweis in der Hilfe nichts anfangen. [...] „einem Prozessabbild zugeordnet“. Wird nicht von jedem Eingang am Anfang des Zyklus automatisch ein Prozessabbild erstellt? Also damit auch zugeordnet?
Wenn die projektierte Eingangsadresse des PN-IO-Device in HW Konfig keinem Prozessabbild zugeordnet ist ("---" anstatt OB1-PA, TPA1...), dann kopiert GETIO_PART nur Nullen (oder irgendetwas zuvor da hin Kopiertes), weil kein automatischer Vorgang zuvor die Werte von den Peripherieadressen (aus der Baugruppe) in den Speicherbereich der Eingänge kopiert hat.

Beispiel:
Wenn Du Dein PN-IO-Device auf die Eingangsadresse 256 Länge 10 Byte projektiert hast, und in der CPU ist das Prozessabbild der Eingänge (PAE) kleiner als 266 Byte eingestellt, dann werden die Werte aus PEB256..PEB265 nicht automatisch in EB256..EB265 kopiert. Man muß mit SFC14 "DPRD_DAT" die Werte aus den Peripherieadressen lesen.
Wenn das Prozessabbild PAE >= 266 Byte eingestellt ist, dann hat man die Wahl: man kann bei der Projektierung des PN-IO-Gerätes bei der E-Adresse wählen, zu welchem Prozessabbild diese E-Adresse zugeordnet werden soll (siehe [ Hilfe ] in dem Einstelldialog):
  • "OB1-PA" : die Werte aus PEB256..PEB265 werden automatisch vor Aufruf des OB1 in EB256..EB265 kopiert
  • "TPA 1" : die Werte aus PEB256..PEB265 müssen mit SFC26 "UPDAT_PI" oder SFC126 "SYNC_PI" in EB256..EB265 kopiert werden
  • "---" : die Werte können nur mit SFC14 "DPRD_DAT" gelesen werden
Egal was bei der Zuordnung "Prozessabbild" eingestellt ist: man kann natürlich auch noch mit Ladebefehlen direkt auf die Peripherieadressen zugreifen (L PEB/PEW/PED...), doch das liefert unter Umständen nicht konsistente Werte.


Für mich ist der FB22 "GETIO_PART" etwas, was eigentlich so gut wie niemand braucht. GETIO_PART kapselt im Grunde nur den UBLKMOV, indem es aus "magic" Zahlenwerten den für UBLKMOV benötigten ANY-Pointer bastelt. In der Hilfe zu GETIO_PART wird sogar vor der dadurch möglichen unsachgemäßen Verwendung von GETIO_PART gewarnt, weil damit komponentenübergreifende Zugriffe in den Prozessabbildbereich möglich sind, deren Funktionieren Siemens für zukünftige oder fremde Systeme nicht garantieren will.

Harald
 

Anhänge

  • Zuordnung_Prozessabbild.png
    Zuordnung_Prozessabbild.png
    32,3 KB · Aufrufe: 10
Bitte zeige uns mal wie Du das mit dem UBLKMOV gelöst hast. UBLKMOV kann gar nicht aus Peripherie-Eingängen lesen. UBLKMOV müsste den Fehlerstatus W#16#8124 liefern (Bereichsfehler beim Lesen eines Parameters, und zwar des ersten Parameters SRCBLK), wenn Du bei "UBLKMOV" SRCBLK:=PEW256 schreibst

515653.png
funktioniert bei mir einwandfrei.


Das Hinweis mit dem Umstellen OB1-PA/TPA 1/-- hat mir wirklich weiter geholfen. Das Prozessabbild in der CPU war bei 128 gestanden. Jetzt wo ich das umgestellt habe, funktioniert auch mein FB22.

Danke für eure Hilfe :)
 
Anhang anzeigen 49141
funktioniert bei mir einwandfrei.
Das bezweifle ich. Wie ich schon geschrieben hatte: UBLKMOV kann nicht aus Peripherie-Eingängen kopieren. Das steht so in der Doku zu UBLKMOV und so ist auch meine selbstgemachte Erfahrung mit echten 31x-CPU: RET_VAL liefert dann W#16#8124. Schau Dir das Programmverhalten nochmal sehr genau an und mache eine speichernde Auswertung des UBLKMOV-RET_VAL
Wie ist der FB-Input "Adresse" deklariert? Läßt sich das Programm auch online beobachten, was da übergeben wird?

Welche CPU genau hast? Genaue Bestellnummer und Firmwareversion bitte

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aktuell läuft das Programm auf einer Test-CPU
6ES7 315-2EH14-0AB0 / V3.2

Der Eingangsparameter "Adresse" ist als WORD deklariert

Ich kann dir auch nicht sagen wie oder wieso es funktioniert. Aber vom UBLKMOV schreibe ich die Daten in eine temporäre Variable und danach in einen DB. Und wenn ich die Lichtschranke meine Hand in die Lichtschranke halte und sie dann wieder raus nehme, kann ich das Ergebnis zeitgleich in meinem DB sehen. Vielleicht habe ich auch so viele Fehler eingebaut, dass es sich schon wieder aufhebt. RetVal zeigt beim beobachten 0 an. Also keinen Fehler.

Der Baustein lässt sich beobachten. Komischerweise steht bei SRCBLK immer 16#00001004, egal ob ich von außen PEW 256, 258, 260 oder 262 dran schreibe. Aber funktionieren tut es komischerweise bei jeder Lichtschranke richtig. Ich habe also bei allen 4 das richtige Ergebnis am Ende (Durch reinlangen in die LS kontrolliert).

Aber du hast recht. Wenn ich zb. PEW256 direkt davor schreibe, bekomme ich einen Fehler
 
Zuletzt bearbeitet:
Das 16#00001004 ist vermutlich ein Darstellungsfehler von Step7. Da dürfte gar nichts stehen.

Dein UBLKMOV kopiert nicht von PEW256 sondern aus dem IDB.
Wenn im FB der INPUT "Adresse" als WORD deklariert ist, dann wird der Wert des PEW256 (das gerade anliegende Bitmuster der Eingänge) in das INPUT-Word kopiert (z.B. in IDB.DBW0), und nicht die Adresse PEW256.
UBLKMOV erwartet an SRCBLK einen ANY, und weil "Adresse" kein ANY ist, wird ein ANY auf das Instanz-Word des INPUT "Adresse" (IDB.DBW0) an SRCBLK übergeben, und UBLKMOV kopiert nicht aus PEW256, sondern aus IDB.DBW0.

Du hättest da auch ganz unromantisch ohne FB und UBLKMOV einfach schreiben können z.B.:
L PEW256
T "MySecretDB".MyDBword

oder
L "LS_B50.2"
T "MySecretDB".MyDBword


Was hast Du gedacht, wieviele Bytes ab PEB256 mit Deinem Code kopiert werden? Es sind 2 Bytes. (Leider hast Du die anderen Übergabeparameter unkenntlich gemacht)
Sobald Du mehr als 4 Byte auf diese Art kopieren willst, funktioniert das Ganze nicht mehr.

Übrigens: Parameter-Datentypen können nicht direkt von FB-INPUT an interne Baustein-Aufrufe durchgereicht werden (nur ziemlich Hardcore in AWL). Es würde auch nicht gehen, wenn Du Adresse als POINTER oder ANY deklarierst.

Harald
 
Ja das mit den Darstellungsfehler in Step7 kann schon sein

Das war mir schon klar, dass der Wert vorher im IDB zwischengespeichert wird.
Ich kann den IDB ja auch beobachten. Darin steht für die Adresse PEW256: W#16#EB01; PEW258: W#16#E901; PEW 260: W#16#DE01;PEW262 : W#16#AD01.
Dh. du meinst ich solle außen dann jetzt EW256, EW258, ... schreiben. Da die Prozessabbild-Zuordnung jetzt funktioniert, geht es auch wenn ich EW... ran schreibe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dh. du meinst ich solle außen dann jetzt EW256, EW258, ... schreiben. Da die Prozessabbild-Zuordnung jetzt funktioniert, geht es auch wenn ich EW... ran schreibe.
Auf jeden Fall. Es ist ineffizient und in den meisten Fällen sinnfrei, zusätzlich nochmal aus der Peripherie zu lesen, wenn die Werte schon ins Prozessabbild eingelesen wurden. Besonders wenig Sinn macht es, mit einzelnen BYTE/WORD/DWORD-Zugriffen auf die Peripherie zuzugreifen, wenn das Adressen aus größeren Bereichen sind, welche als zusammenhängend konsistent projektiert sind.

Ich meine sogar, Du solltest GETIO_PART und UBLKMOV beide ganz weglassen, wenn Du eh' nur 2 Byte zusammen kopierst. Das ist sowas von oversized... Um nur 1-4 Bytes zu kopieren tut's schlichtes L/T bzw. MOVE am besten, anstatt so umständliches und ineffizientes Durchreichen durch mehrere Bausteine.

Harald
 
Ok. Wenn ich ehrlich bin, bin ich garnicht auf so eine „einfache“ Lösung gekommen.
Ich hatte bisher noch nichts mit IO zu tun und hab gegoogelt. da bin ich auf GETIO & Co gestolpert und hab da nicht weiter drüber nachgedacht.
Danke 😊
 
Zurück
Oben