Need4Speed
Level-2
- Beiträge
- 32
- Reaktionspunkte
- 0
-> 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).
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:
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):
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:
[TABLE="class: grid, width: 500, align: center"]
[TR]
[TD]Hexadezimalcode[/TD]
[TD]Speicherbereich[/TD]
[TD]Beschreibung[/TD]
[/TR]
[TR]
[TD]b#16#81[/TD]
[TD]E[/TD]
[TD]Speicherbereich der Eingänge[/TD]
[/TR]
[TR]
[TD]b#16#82[/TD]
[TD]A[/TD]
[TD]Speicherbereich der Ausgänge[/TD]
[/TR]
[TR]
[TD]b#16#83[/TD]
[TD]M[/TD]
[TD]Speicherbereich der Merker[/TD]
[/TR]
[TR]
[TD]b#16#84[/TD]
[TD]DB[/TD]
[TD]Datenbaustein[/TD]
[/TR]
[TR]
[TD]b#16#85[/TD]
[TD]DI[/TD]
[TD]Instanz-Datenbaustein[/TD]
[/TR]
[TR]
[TD]b#16#86[/TD]
[TD]L[/TD]
[TD]Lokaldaten (L-Stack)[/TD]
[/TR]
[TR]
[TD]b#16#87[/TD]
[TD]V[/TD]
[TD]Vorherige Lokaldaten[/TD]
[/TR]
[/TABLE]
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
habe mal wieder eine Frage zum beliebten Thema "Pointer"

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:
[TABLE="class: grid, width: 500, align: center"]
[TR]
[TD]Hexadezimalcode[/TD]
[TD]Speicherbereich[/TD]
[TD]Beschreibung[/TD]
[/TR]
[TR]
[TD]b#16#81[/TD]
[TD]E[/TD]
[TD]Speicherbereich der Eingänge[/TD]
[/TR]
[TR]
[TD]b#16#82[/TD]
[TD]A[/TD]
[TD]Speicherbereich der Ausgänge[/TD]
[/TR]
[TR]
[TD]b#16#83[/TD]
[TD]M[/TD]
[TD]Speicherbereich der Merker[/TD]
[/TR]
[TR]
[TD]b#16#84[/TD]
[TD]DB[/TD]
[TD]Datenbaustein[/TD]
[/TR]
[TR]
[TD]b#16#85[/TD]
[TD]DI[/TD]
[TD]Instanz-Datenbaustein[/TD]
[/TR]
[TR]
[TD]b#16#86[/TD]
[TD]L[/TD]
[TD]Lokaldaten (L-Stack)[/TD]
[/TR]
[TR]
[TD]b#16#87[/TD]
[TD]V[/TD]
[TD]Vorherige Lokaldaten[/TD]
[/TR]
[/TABLE]
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: