Step 7 ANY Format weiterreichen

EPaulo

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

ich erstelle einen FB, in diesem FB verwende ich den Siemens Baustein TCON.
Nun möchte ich in meinem FB eine IN Variable vom Typ ANY erstellen und diese an den CONNECT Eingang des Bausteines TCON weiterreichen.
Leider akzeptiert der CONNECT Eingang keine ANY Variable solange sie im IN oder INOut deklariert wird. Wenn ich Sie im TEMP deklariere wird Sie akzeptiert.

Kann mir jemand helfen wie ich das Umsetzten kann?
Wie kann ich die Daten weiterreichen, eigentlich wird in dem ANY nur ein Pointer weitergereicht

Das ich eine ANY Variable nicht direkt weiterreichen kann ist mir zwischenzeitlich klar.
Aber wie kopiere ich die Information vom IN ANY auf den TEMP ANY?
Am In ANY steht z.B. P#DB500.DBX0.0

Danke im Voraus
 
Zuletzt bearbeitet:
Hi,

also als Eingang kannst du einen ANY weiterreichen, nur kannst du ihn nicht direkt benutzen. Gehe wiefolgt vor:

1. Sagen wir mal du hast einen Eingang am FB der heißt:

Code:
aPTR_Auftrag : ANY

2. Dann machst du dir am besten ein UDT, was wiefolgt aussieht:

Code:
TYPE "utAnyPointer"
VERSION : 0.1
  STRUCT     
   S7_10h : BYTE  := B#16#10;    //Immer 10h für S7
   Datentyp : BYTE ;    //Datentyp ##00 bis #13 (Besten #02 für Byte)
   Wiederholungsfkt : INT ;    //Größe in Datentyp
   DB_NR : INT ;    //Aufgeschlagener DB wenn ungleich Null
   Speich_Bereich : BYTE ;    //Speicherbereich #81 bis #87
   Konstante : BYTE ;    
   Byte_Bit_Adr : WORD ;    //Byte und Bitadresse
  END_STRUCT ;    
END_TYPE

3. Im FB legst du im Temp-Bereich dann eine Variable von dem UDT an

Code:
uAnyPTR : utAnyPointer

4. Dann schreibst du die Informationen von deinem Eingangs-ANY in das UDT um

Code:
      LAR1  P##aPTR_Auftrag             // Lade anfangsadresse der Variablen in den AR1
      L     B [AR1,P#0.0]
      T     #uAnyPtr.S7_10h
      L     B [AR1,P#1.0]
      T     #uAnyPtr.Datentyp
      L     B [AR1,P#2.0]
      T     #uAnyPtr.Wiederholungsfkt
      L     W [AR1,P#4.0]
      T     #uAnyPtr.DB_NR
      L     B [AR1,P#6.0]
      T     #uAnyPtr.Speich_Bereich
      L     D [AR1,P#6.0]
      SRD   3
      UD    DW#16#FFFF
      T     #uAnyPtr.Byte_Bit_Adr

5. Dann brauchst du noch eine weitere Variable von Typ ANY im Temp-Bereich wieder

Code:
pAny : ANY

6. Jetzt kopierst du dir die Daten aus deinem UDT zurück

Code:
 LAR1     P##pANY
      L     #uAnyPtr.S7_10h
      T     B [AR1,P#0.0]
      L     #uAnyPtr.Datentyp
      T     B [AR1,P#1.0]
      L     #uAnyPtr.Wiederholungsfkt
      T     W [AR1,P#2.0]
      L     #uAnyPtr.DB_NR
      T     W [AR1,P#4.0]
      L     #uAnyPtr.Byte_Bit_Adr
      SLD   3
      T     D [AR1,P#6.0]
      L     #uAnyPtr.Speich_Bereich
      T     B [AR1,P#6.0]

7. Den pANY kannst du jetzt innerhalb des FBs benutzen für SFC20 z.B.

Hinweis: Den Schritt mit dem UDT kann man sich prinzipiell sparen und die Daten anstatts ins UDT direkt ins LW (respektive LB, LD) des pANY im Tempbereich schreiben.

mfg Clyde
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo EPaulo, warst Du krank oder auf einem "Alles vergessen"-Trip? ;)

Schau mal hier. Da hatte ich Dir bereits am 7.3. den Code gepostet:
Durchreichen des ANY-Aktualparameters an den Unter-FB via ANY-Variable in TEMP in AWL:
Code:
[COLOR="#008000"]//AR2 (Multiinstanzoffset) sichern, weil AR2 hier verändert wird[/COLOR]
      TAR2  #AR2_Save                   [COLOR="#008000"]//(DWord in TEMP)[/COLOR]

[COLOR="#008000"]//AR1 auf Adresse des #IN_ANY setzen[/COLOR]
      L     P##IN_ANY                   [COLOR="#008000"]//(DI) Adresse des IN_ANY in dieser FB-Instanz[/COLOR]
      TAR2                              [COLOR="#008000"]//Offset falls dieser FB als Multiinstanz aufgerufen wird[/COLOR]
      UD    DW#16#FFFFFF                [COLOR="#008000"]// Bereichskennung (DB) ausblenden[/COLOR]
      +D
      LAR1                              [COLOR="#008000"]//AR1: Adresse #IN_ANY im IDB[/COLOR]

[COLOR="#008000"]//AR2 auf Adresse des #Temp_ANY setzen[/COLOR]
      LAR2  P##Temp_ANY                 [COLOR="#008000"]//AR2: Adresse #Temp_ANY in TEMP[/COLOR]

[COLOR="#008000"]//den ANY-Aktualparameter von #IN_ANY nach #Temp_ANY kopieren[/COLOR]
[COLOR="#008000"]//quasi *[IDB].[AR1] --> *[AR2][/COLOR]
      L     DID [AR1,P#0.0]             [COLOR="#008000"]//ANY: Kennung + Typ + Länge[/COLOR]
      T     LD  [AR2,P#0.0]
      L     DIW [AR1,P#4.0]             [COLOR="#008000"]//ANY: DB-Nummer[/COLOR]
      T     LW  [AR2,P#4.0]
      L     DID [AR1,P#6.0]             [COLOR="#008000"]//ANY: Bereichsadresse[/COLOR]
      T     LD  [AR2,P#6.0]

[COLOR="#008000"]//AR2 wiederherstellen vor Zugriff auf Instanzvariablen und Unter-Instanzen![/COLOR]
      LAR2  #AR2_Save

[COLOR="#008000"]//Unter-FB-Instanz aufrufen[/COLOR]
      CALL  #Unter_FB_Instanz_1
       IN_ANY  :=#Temp_ANY

Harald
 
Aus dem Siemensforum und ohne AR2

Hallo Martin!

Nicht alle Datentypen können 1:1 durchgereicht werden. Es gibt dafür Regeln, welche Typen bei welchen Aufrufen weitergereicht werden können.

Weiter Info findest du in der S7 Online Hilfe ("Datentypen beim Übergeben von Parametern" bzw. im Handbuch "Programmeren mit S7", welches in den Support Seiten unter folgendem Link zu downloaden ist:

http://support.automation.siemens.com/WW/view/de/18652056

(Kapitel A 3.4.8)

Mein Tipp für dein Problem: lokal eine Variable des Typs ANY anlegen, den Eingangsparameter ANY Byte für Byte auf die lokale Variable kopieren und zum weiterverschalten an einen aufgerufenen FC/FB dann diesen lokalen ANY verwenden.

Beispiel:
Code:
// source info

 L P##IA_DATA // IA_DATA ist IN- Variable vom Typ ANY
 LAR1//AR1 zeigt nun auf die Anfangsadr. der Eingangsvariable
 L P##source // --> source = temporäre Variable vom Typ ANY
 T #p_tmp1 // p_tmp1 (DWORD) ist ein Zeiger auf source

// copy in-parameter ANY to tmp ANY
 L D [AR1,P#0.0]
 T LD [#p_tmp1]//Byte 0 bis Byte 3 des ANYkopieren
 L #p_tmp1
 + 32
 T #p_tmp1 // zeiger auf temp. ANY um 4 Byte weiterstellen
 L D [AR1,P#4.0]
 T LD [#p_tmp1]// Byte 4 bis Byte 7 des ANYkopieren
 L #p_tmp1
 + 32
 T #p_tmp1// zeiger auf temporären ANY um 4 Byte weiterstellen
 L W [AR1,P#8.0]
 T LW [#p_tmp1]// Byte8 bis Byte10 des ANYkopieren

---> jetz steht in der temporären ANY Variable 'source' das selbe wie in IA_DATA und du kannst 'source' weiterverschalten auf andere FC's, FB's,....

Hoffe, dir geholfen zu haben!

Viele Grüße
Hans
 
Aus dem Siemensforum und ohne AR2
Code:
// source info

 L P##IA_DATA // IA_DATA ist IN- Variable vom Typ ANY
 LAR1[COLOR="#FF0000"]//AR1 zeigt nun auf die Anfangsadr. der Eingangsvariable[/COLOR]
Nur weil es im Siemens-Forum steht muß es nicht automatisch richtig sein ;)
Das von mir rot markierte stimmt in einem FB nur manchmal - z.B. dann wenn der FB mit einem eigenen IDB aufgerufen wird.

Harald
 
Zurück
Oben