Step 7 Profinet Slave Eingang zu Struct

Bergungsdackel

Level-1
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Und zwar habe ich einen Profinet Slave mit 64 Eingangsbytes. Dies kopiere ich mit dem SFC14 in ein Array[1..8] of Struct (dieses Struct hat wiederum 8 Bytes => 8x8 = 64) - alles in einem FB.
Wie kann ich nun nur die 8 Bytes am Index X rausholen? Also beispielsweise möchte ich in ein weiteres Struct (auch 8 Bytes) die Bytes vom Index 2 aus meinem Array kopieren.

Sprache wäre KOP und nutze Step7 Classic

Gruß
Bergungsdackel
 
Mit SFC20 BLKMOV.
Wenn die Daten in ein ARRAY[1..8] von STRUCT .. deklariert sind, dann ist die Code ungf. wieso:
"DB_slave".Eingaenge.Daten[2] --> BLKMOV --> "DB_bearbeiten".Daten

Leider ist ein dynamische Index in KOP nicht möglich in STEP7 Klassik.
in KOP muss du das Index fest angeben.
Wenn das Index dynamisch sein muss, dann musst du das Programm entweder in AWL oder SCL erstellen.
TIA und S7-1500 hat hier ein Vorteil, weil man kann in KOP und FUP 99.9% machen was man in SCL machen kann, inklusiv dynamische Indizierung in Arrays.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du willst eine Struktur kopieren ---> SFC20 "BLKMOV" verwenden:
Code:
                 +----------------+
                 |     SFC20      |
                 |    "BLKMOV"    |
-----------------|EN           ENO|---------------
                 |                |
#ArrayStruct[2]--|SRCBLK   RET_VAL|--#tempInt
                 |                |
                 |          DSTBLK|--#EinStruct
                 +----------------+
In STAT des FB hast Du z.B.
Code:
ArrayStruct : ARRAY [1..8] OF STRUCT
  Byte1 : Byte
  Byte2 : Byte
  Byte3 : Byte
  Byte4 : Byte
  Byte5 : Byte
  Byte6 : Byte
  Byte7 : Byte
  Byte8 : Byte

EinStruct : STRUCT
  Byte1 : Byte
  Byte2 : Byte
  Byte3 : Byte
  Byte4 : Byte
  Byte5 : Byte
  Byte6 : Byte
  Byte7 : Byte
  Byte8 : Byte

Oder noch schöner einen eigenen UDT "MeinTyp" verwenden:
Code:
"MeinTyp"
STRUCT
  Byte1 : Byte
  Byte2 : Byte
  Byte3 : Byte
  Byte4 : Byte
  Byte5 : Byte
  Byte6 : Byte
  Byte7 : Byte
  Byte8 : Byte
END_STRUCT
und im FB in STAT
Code:
ArrayStruct : ARRAY [1..8] OF "MeinTyp"
EinStruct : "MeinTyp"

Harald
 
Vielen Dank erstmal. Mit BLKMOV (SFC20) hab ich es auch versucht, es geht nur darum, dass das Index dynamisch sein muss. Also das Array sind sozusagen 8 Kanäle und welcher Kanal ausgewählt wird, steht als Input-Variable zur Verfügung. Könnte mir jemand auf die Sprünge helfen, wie ich das (mit AWL?) realisieren kann. Ich selbst habe mit AWL fast noch nie gearbeitet, weswegen es ein wenig schwierig ist.

Mit SFC20 BLKMOV.
Wenn die Daten in ein ARRAY[1..8] von STRUCT .. deklariert sind, dann ist die Code ungf. wieso:
"DB_slave".Eingaenge.Daten[2] --> BLKMOV --> "DB_bearbeiten".Daten

Leider ist ein dynamische Index in KOP nicht möglich in STEP7 Klassik.
in KOP muss du das Index fest angeben.
Wenn das Index dynamisch sein muss, dann musst du das Programm entweder in AWL oder SCL erstellen.
TIA und S7-1500 hat hier ein Vorteil, weil man kann in KOP und FUP 99.9% machen was man in SCL machen kann, inklusiv dynamische Indizierung in Arrays.
Hast du dazu ein Tipp wie sich das mit AWL realisieren lässt? Auf S7-300...
 
Da es bei Dir nur 8 Möglichkeiten gibt, von wo kopiert wird, könntest Du einfach und leicht verständlich 8 Netzwerke in KOP programmieren:
Code:
                                      +----------------+
                                      |     SFC20      |
        +---------+                   |    "BLKMOV"    |
--------| CMP ==I |-------------------|EN           ENO|---------------
        |         |                   |                |
#Index--|IN1      |  #ArrayStruct[1]--|SRCBLK   RET_VAL|--#tempInt
        |         |                   |                |
     1--|IN2      |                   |          DSTBLK|--#EinStruct
        +---------+                   +----------------+

                                      +----------------+
                                      |     SFC20      |
        +---------+                   |    "BLKMOV"    |
--------| CMP ==I |-------------------|EN           ENO|---------------
        |         |                   |                |
#Index--|IN1      |  #ArrayStruct[2]--|SRCBLK   RET_VAL|--#tempInt
        |         |                   |                |
     2--|IN2      |                   |          DSTBLK|--#EinStruct
        +---------+                   +----------------+

...
                                      +----------------+
                                      |     SFC20      |
        +---------+                   |    "BLKMOV"    |
--------| CMP ==I |-------------------|EN           ENO|---------------
        |         |                   |                |
#Index--|IN1      |  #ArrayStruct[8]--|SRCBLK   RET_VAL|--#tempInt
        |         |                   |                |
     8--|IN2      |                   |          DSTBLK|--#EinStruct
        +---------+                   +----------------+

Harald
 
Da es bei Dir nur 8 Möglichkeiten gibt, von wo kopiert wird, könntest Du einfach und leicht verständlich 8 Netzwerke in KOP programmieren:
Code:
                                      +----------------+
                                      |     SFC20      |
        +---------+                   |    "BLKMOV"    |
--------| CMP ==I |-------------------|EN           ENO|---------------
        |         |                   |                |
#Index--|IN1      |  #ArrayStruct[1]--|SRCBLK   RET_VAL|--#tempInt
        |         |                   |                |
     1--|IN2      |                   |          DSTBLK|--#EinStruct
        +---------+                   +----------------+

                                      +----------------+
                                      |     SFC20      |
        +---------+                   |    "BLKMOV"    |
--------| CMP ==I |-------------------|EN           ENO|---------------
        |         |                   |                |
#Index--|IN1      |  #ArrayStruct[2]--|SRCBLK   RET_VAL|--#tempInt
        |         |                   |                |
     2--|IN2      |                   |          DSTBLK|--#EinStruct
        +---------+                   +----------------+

...
                                      +----------------+
                                      |     SFC20      |
        +---------+                   |    "BLKMOV"    |
--------| CMP ==I |-------------------|EN           ENO|---------------
        |         |                   |                |
#Index--|IN1      |  #ArrayStruct[8]--|SRCBLK   RET_VAL|--#tempInt
        |         |                   |                |
     8--|IN2      |                   |          DSTBLK|--#EinStruct
        +---------+                   +----------------+

Harald
Das ist natürlich eine super Idee, danke dir! Fürn Anfang wirds reichen, eine Möglichkeit mit AWL werde ich trotzdem Mal probieren (allein für den Lerneffekt).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist natürlich eine super Idee, danke dir! Fürn Anfang wirds reichen, eine Möglichkeit mit AWL werde ich trotzdem Mal probieren (allein für den Lerneffekt).
Ich wurde nicht alzuviel Mühe in AWL investieren. Dann lieber SCL. Kannst du auch mit TIA verwenden oder sogar andere SPSen (dann aber Structured Text genannt).
 
Ich wurde nicht alzuviel Mühe in AWL investieren. Dann lieber SCL.
Dann müsste man den ganzen Baustein in SCL schreiben oder einen extra Baustein (FC) aufrufen.
In Step7 classic kann man leider noch nicht einzelne Netzwerke in SCL schreiben, sondern nur in AWL.

Um AWL-Code für dynamischen Index zu schreiben, müsste man genauer wissen, wo ArrayStruct und EinStruct wirklich liegen (In der FB-Instanz? Oder per Bausteinparameter übergeben? Oder Zugriff auf globalen DB? Oder ... ).

Harald
 
Dann müsste man den ganzen Baustein in SCL schreiben oder einen extra Baustein (FC) aufrufen.
In Step7 classic kann man leider noch nicht einzelne Netzwerke in SCL schreiben, sondern nur in AWL.

Um AWL-Code für dynamischen Index zu schreiben, müsste man genauer wissen, wo ArrayStruct und EinStruct wirklich liegen (In der FB-Instanz? Oder per Bausteinparameter übergeben? Oder Zugriff auf globalen DB? Oder ... ).

Harald
Ich hole per SFC14 64 Eingangsbytes in ein Array[1..8] of Struct (das hat 8 Bytes --> 8x8 = 64). Das Array liegt als static in meinem FB, dann möchte ich je nach Kanal (Eingangsparameter meines FBs) aus diesem Array 8 Bytes in mein Struct (liegt ebenfalls als static in meinem FB) legen - arrayindex ist sozusagen Kanal 1-8. Mein Ansatz ist, sich den static area offset zu berechnen, danach den Index reinladen, addieren zu startadresse von Array, danach addieren zu static area offset?
Ich komme ursprünglich aus der Hochsprachenprogrammierung, weswegen es mir eventuell schwer fällt.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich komme ursprünglich aus der Hochsprachenprogrammierung, weswegen es mir eventuell schwer fällt.
naja, recherchiere doch mal zum Thema Pointer in AWL. Aber meiner Meinung macht das keinen Sinn.
- in AWL unter S7-1500 kannst Du Arrays variabel indizieren (viele Neuanlagen sind halt S7-1500)
- in AWL unter S7-300 ist es immer gut, Pointer zu vermeiden (war schon immer meine Meinung)
- ein SCL-Baustein für S7-300 braucht keine Pointer (SCL lernen macht mehr Sinn als AWL lernen)
- es gibt die KOP-Lösung von PN/DP (was brauchst Du denn noch)
- ...
 
Mein Ansatz ist, sich den static area offset zu berechnen, danach den Index reinladen, addieren zu startadresse von Array, danach addieren zu static area offset?
Ich komme ursprünglich aus der Hochsprachenprogrammierung, weswegen es mir eventuell schwer fällt.
Eigentlich brauchst Du nur die "Hochsprache"-SCL-Anweisung: #EinStruct := #ArrayStruct[#Index];
In TIA kann man das so als SCL-Netzwerk in ein KOP-Programm einfügen (das müsste sogar auch direkt als KOP-Anweisung gehen?). In Step7 classic geht das aber nicht.

In Step7 classic kann man das Kopieren in einen FC auslagern, der in SCL programmiert ist:
Code:
              +---------------+
              |  "FC_Kopier"  |
--------------|EN          ENO|--------------
              |               |
      #Index--|Index          |
#ArrayStruct--|IN             |
  #EinStruct--|OUT            |
              +---------------+
Code:
FUNCTION "FC_Kopier" : VOID
VAR_INPUT
  Index : INT;
END_VAR
VAR_IN_OUT
  IN : ARRAY [1..8] OF "MeinTyp";
  OUT : "MeinTyp";
END_VAR

  OUT := IN[Index];
END_FUNCTION


Man kann auch das Kopieren direkt im FB in AWL programmieren. Entweder mit ganz vielen "elementaren" AWL-Anweisungen als Kopierschleife mit indirekter Adressierung, oder lediglich die Adresse #ArrayStruct[#Index] als ANY-Pointer zusammenbasteln und an den SFC20 BLKMOV übergeben. (zu ANY-Pointer siehe Hilfe zu Step7 > Format des Parametertyps ANY)
Code:
VAR_TEMP
  pSrcStruct : ANY;  //variabler ANY-Pointer
  tempInt : INT;
END_VAR


//ANY-Pointer #pSrcStruct auf #ArrayStruct[#Index] basteln
      LAR1  P##pSrcStruct               //Pointer auf die ANY-Variable in TEMP

      L     W#16#1002                   //ANY-Kennung + Datentyp Byte
      T     LW [AR1,P#0.0]              //ANY: ANY-Kennung + Datentyp

      L     8                           //SizeOf der Struktur in Bytes
      T     LW [AR1,P#2.0]              //ANY: Wiederholfaktor

      L     DINO                        //IDB-Nummer dieser FB-Instanz
      T     LW [AR1,P#4.0]              //ANY: DB-Nummer

//    Adresse #ArrayStruct[#Index] im IDB berechnen
      L     #Index                      //Index 1..8
      +     -1                          //--> 0..7
      L     8                           //SizeOf der Struktur in Bytes
      *I                                //--> Anzahl Bytes #ArrayStruct[#Index] zu Anfangsadresse #ArrayStruct[]
      SLD   3                           //--> Offset als P#Byteadresse.0
      L     P##ArrayStruct              //Anfangsadresse #ArrayStruct[] in dieser Instanz (P#DIXn.0)
      +D                                //--> Adresse von #ArrayStruct[#Index] in dieser Instanz
      TAR2                              //Multiinstanz-Offset dieser Instanz aus AR2 holen
      UD    DW#16#FFFFFF                //Bereichskennung (DB) ausblenden
      +D                                //--> Adresse von #ArrayStruct[#Index] im IDB 
      T     LD [AR1,P#6.0]              //ANY: Bereichsadresse

//Kopieren #ArrayStruct[#Index] nach #EinStruct 
      CALL  "BLKMOV"                    //SFC20
       SRCBLK :=#pSrcStruct
       RET_VAL:=#tempInt
       DSTBLK :=#EinStruct

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich brauchst Du nur die "Hochsprache"-SCL-Anweisung: #EinStruct := #ArrayStruct[#Index];
In TIA kann man das so als SCL-Netzwerk in ein KOP-Programm einfügen (das müsste sogar auch direkt als KOP-Anweisung gehen?). In Step7 classic geht das aber nicht.

In Step7 classic kann man das Kopieren in einen FC auslagern, der in SCL programmiert ist:
Code:
              +---------------+
              |  "FC_Kopier"  |
--------------|EN          ENO|--------------
              |               |
      #Index--|Index          |
#ArrayStruct--|IN             |
  #EinStruct--|OUT            |
              +---------------+
Code:
FUNCTION "FC_Kopier" : VOID
VAR_INPUT
  Index : INT;
END_VAR
VAR_IN_OUT
  IN : ARRAY [1..8] OF "MeinTyp";
  OUT : "MeinTyp";
END_VAR

  OUT := IN[Index];
END_FUNCTION


Man kann auch das Kopieren direkt im FB in AWL programmieren. Entweder mit ganz vielen "elementaren" AWL-Anweisungen als Kopierschleife mit indirekter Adressierung, oder lediglich die Adresse #ArrayStruct[#Index] als ANY-Pointer zusammenbasteln und an den SFC20 BLKMOV übergeben. (zu ANY-Pointer siehe Hilfe zu Step7 > Format des Parametertyps ANY)
Code:
VAR_TEMP
  pSrcStruct : ANY;  //variabler ANY-Pointer
  tempInt : INT;
END_VAR


//ANY-Pointer #pSrcStruct auf #ArrayStruct[#Index] basteln
      LAR1  P##pSrcStruct               //Pointer auf die ANY-Variable in TEMP

      L     W#16#1002                   //ANY-Kennung + Datentyp Byte
      T     LW [AR1,P#0.0]              //ANY: ANY-Kennung + Datentyp

      L     8                           //SizeOf der Struktur in Bytes
      T     LW [AR1,P#2.0]              //ANY: Wiederholfaktor

      L     DINO                        //IDB-Nummer dieser FB-Instanz
      T     LW [AR1,P#4.0]              //ANY: DB-Nummer

//    Adresse #ArrayStruct[#Index] im IDB berechnen
      L     #Index                      //Index 1..8
      +     -1                          //--> 0..7
      L     8                           //SizeOf der Struktur in Bytes
      *I                                //--> Anzahl Bytes #ArrayStruct[#Index] zu Anfangsadresse #ArrayStruct[]
      SLD   3                           //--> Offset als P#Byteadresse.0
      L     P##ArrayStruct              //Anfangsadresse #ArrayStruct[] in dieser Instanz (P#DIXn.0)
      +D                                //--> Adresse von #ArrayStruct[#Index] in dieser Instanz
      TAR2                              //Multiinstanz-Offset dieser Instanz aus AR2 holen
      UD    DW#16#FFFFFF                //Bereichskennung (DB) ausblenden
      +D                                //--> Adresse von #ArrayStruct[#Index] im IDB
      T     LD [AR1,P#6.0]              //ANY: Bereichsadresse

//Kopieren #ArrayStruct[#Index] nach #EinStruct
      CALL  "BLKMOV"                    //SFC20
       SRCBLK :=#pSrcStruct
       RET_VAL:=#tempInt
       DSTBLK :=#EinStruct

Harald
Danke dir für diesen Ansatz!
 
Zurück
Oben