Step 7 Adressbereich Peripherie im Pointer bei indirekter Adressierung - fehlt da E und A

Need4Speed

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe mal wieder eine Frage zum beliebten Thema "Pointer" ;) Hintergrund ist, dass ich gerne im OB35 / Weckalarm auf ein PROFINET I/O Gerät schreiben möchte, also sozusagen "ausser der Reihe" (das Prozessabbild wird ja nur bzw. nach dem OB1 aktualisiert (ausser bei einer S7-400er, da kann man anscheinend auch mit Teilprozessabbildern arbeiten und diese dann exklusiv einzelnen Weckalarmen zuweisen, aber ich habe hier nur eine S7 317)).

Also ... wenn ich den Weckalarm des OB35 auf 1ms stelle, und die allgemeine Zykluszeit des OB1 bei 10ms liegt, dann werden die folgenden Schreiboperationen ja nur bei der Aktualisierung des Prozessabbilds auf die Peripherie geschrieben (und auch nur die ersten 128 Bytes, ausser ich stelle das in der HW Konfig unter "Zyklus / Taktmerker - Größe des Prozessabbilds" um).

Code:
      L     EW   420
      L     1
      +I   
      T     AW   420

Was man dann auf dem PROFINET bzw. im PN I/O Device sieht, ist dann "10, 20, 30, ..." - weil ja nur bei jedem 10. Aufruf des OB35 auch der OB1 aufgerufen wird, und nur dann beim Aufruf des OB1 auch das Prozessabbild aktualisiert wird.

Wenn man im OB35 hingegen direkt auf die Peripherie schreibt:

Code:
      L     PEW   420
      L     1
      +I   
      T     PAW   420

Dann sieht das PN I/O Device auch alle Aktualisierungen, also "1,2,3,4,5,..."

Ich hätte es aber gerne etwas flexibler und ich möchte dann das Lesen und Schreiben von der Peripherie per "IN" Variable an meinem FB konfigurieren können. Bei "regulären" Eingängen und Ausgängen funktioniert es ganz klassisch (so wie PN-DP mir das mal erklärt hat):

Code:
      //pSrcPointer auf Eingangsbereich setzen:
      L     DW#16#81000000;      // ptr type output
      L     #InputOffset;               // konvertieren der Adresse aus INT Nummer (InputOffset ist eine IN Variable)
      SLD   3;                              // pointer starts with 3 bits
      OD;    
      T     #pSrcPointer;              // Adresse am Ausgang (pSrcPointer ist lokale/temp Variable)


      //pDestPointer auf Ausgabebereich setzen:
      L     DW#16#82000000;      // ptr type output
      L     #OutputOffset;             // konvertieren der Adresse aus INT Nummer (OutputOffset ist eine IN Variable)
      SLD   3;                              // pointer starts with 3 bits
      OD;    
      T     #pDestPointer;             // Adresse am Ausgang (pDestpointer ist lokale/temp Variable)





      LAR1  #pSrcPointer;
      L     W [AR1, P#0.0];
      L     1
      +I   
      LAR1  #pDestPointer;
      T     W [AR1, P#0.0];


Mir geht es jetzt um diese Zeile, also wo die Kennung des Datenbereichs `DW#16#81000000; // ptr type output` gesetzt wird, laut Step 7 Dokumentation ja so:


HexadezimalcodeSpeicherbereichBeschreibung
b#16#81ESpeicherbereich der Eingänge
b#16#82ASpeicherbereich der Ausgänge
b#16#83MSpeicherbereich der Merker
b#16#84DBDatenbaustein
b#16#85DIInstanz-Datenbaustein
b#16#86LLokaldaten (L-Stack)
b#16#87VVorherige Lokaldaten

Also leider keine Kennung/Hexadezimalcode für die Peripherie. Was nun??


Ein Idee wäre es, am Anfang meine Eingangsdaten mit dem BLKMOV/SFC 20 zu holen, und am Ende meines FBs die Daten wieder per BLKMOV auf die Peripherie zu schreiben. Aber beim ANY POINTER für den BLKMOV gibt es nur zusätzlich den HexCode **b#16#80** für "Peripherie" - aber nicht für PA oder PE ...

Hat mir jemand eine Idee für mich?

Vielen Dank und viele Grüße, Jürgen
 
Zuletzt bearbeitet:
Vielen Dank an NBerger - wusste nicht, dass sowas geht - super!

@MSB - Danke Manuel für den Hinweis, das mit den Teilprozessabbildern für eine S7-300 finde ich schon interessant, aber leider komme ich nicht weiter. Auf der von dir verlinkten Seite steht:

> Hinweis: Ob Ihre CPU Teilprozessabbilder unterstützt, entnehmen Sie bitte den technischen Daten.

Wenn ich dann beim Gerätehandbuch "S7-300 CPU 31xC und CPU 31x: Technische Daten" (Stand 03/2011 hier https://support.industry.siemens.com/cs/attachments/8859629/s7300_module_data_manual_de-DE_de-DE.pdf) finde ich im Anhang nur "Teilprozessabbilder: 1" - d.h. dann soviel wie "keine" (1 = ist ja gleich dem vom OB1, oder?)

Weiterhin konnte ich ich leider auch nirgends finden, wo man grundsätzlich ein Teilprozessabbild konfigurieren kann - in den Objekteigenschaften der CPU jedenfalls nicht. Hast du mir da noch einen Tipp?

Vielen Dank! Jürgen
 
Konfig:
Bei der Vergabe jeder erinzelnern Adresse kannst du das Prozessabbild zwischen OB1 und TPA1 wählen ...
TPA.jpg

Beim SFC26 ist 0 dann OB1-PA, und 1-n dann TPA1-n

Zur anderen Frage: Als Bedingung steht v.a. FW > 2.5, was auf viele CPUs zutreffen sollte, wobei k.a. was du genau hast, insbesondere welche FW.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Manuel, vielen Dank!!

Ich habe heute Nachmittag auch noch gekämpft, aber es sieht so aus, als ob mein PN I/O (Hilscher Karte) das nicht kann - ich habe es mit einer ET200 versucht, und siehe da, ich konnte dann das TPA-1 so wie bei dir auf dem Screenshot zuweisen.

Was allerdings trotzdem nicht ging, ist die Zuweisung des TAP-1 zum OB35 - das scheint wirklich etwas für neuere CPUs zu sein?

Vielen Dank nochmals! VG, Jürgen

Pasted_Image_11_09_18__19_15.jpg
 
Das hat nix mit der Hilscher Karte oder sonstigem zu tun, sonden einfach damit, das deine Adresse nicht mehr Teil des Prozessabbildes ist, also einfach das PA vergrößern bei Zyklus/Taktmerker.

Wobei sich bei den großen Blöcken, die du auf der Hilscherkarte hast, wirklich eher SFC14/15 anbieten würde.

Mfg
Manuel
 
Zuletzt bearbeitet:
Stimmt, habe es geändert und jetzt hat es geklappt!! Hast du zufällig auch noch eine Idee, woran es liegen könnte, dass ich das TPA-1 in CPU->Objekteigenschaften-> Weckalarme nicht auswählen kann?? (habe es eben auf eine 317 nachgeschaut, da ist es auch so - scheint ganz wonders vorbereitet werden zu müssen (PROFINET Synchronität, IRT??).


Bezüglich SFC 14/15 - das klingt auch recht gut!! Dafür braucht man den "Umweg" über das Teilprozessabbild nicht, korrekt? Dann sind SFC 14/15 quasi ein BLKMOV für die Peripherie?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bezüglich SFC 14/15 - das klingt auch recht gut!! Dafür braucht man den "Umweg" über das Teilprozessabbild nicht, korrekt? Dann sind SFC 14/15 quasi ein BLKMOV für die Peripherie?
Genau genommen für einzelne konsistente Blöcke von einzelnen Modulen in PN oder DP Devices / Slaves.
Es ist also außer dem (Teil-) oder (OB1) Prozessabbild die einzige Möglichkeit, dass du deine 32 Byte E von dem Modul konsistent, d.h. zeitlich zusammengehörig bekommst.
Wenn du also mehr als 4 Byte konsistent brauchst, dann musst du das Prozessabbild, oder halt SFC14/15 verwenden.
 
Zurück
Oben