TIA Eingänge nach STRUCT in einem FB schreiben

ThorstenSt

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

ich möchte einen Multiinstanzfähigen FB erstellen (mehrfach verwendbar).

Die benötigten Ein- und Ausgangssignale möchte ich im STAT-Bereich in einem STRUCT bereitstellen....das heißt jeweils ein STRUCT entsprechend der festgelegten länge der Ein- bzw. Ausgänge.

Die Anfangsadresse der Ein- bzw. Ausgänge soll dabei als INT am Bausteingang variabel festgelegt werden.

Bei Daten bis 4 Byte habe ich das bishher so gelöst:

Code:
  L     #Adressbereich
      SLD   3
      LAR1  
      L     ED [AR1,P#0.0]
      T     #IN_TEMP
      CALL  "BLKMOV"
       SRCBLK :=#IN_TEMP
       RET_VAL:=#R_Fehler
       DSTBLK :=#INPUT

#IN_TEMP ist ein DWORD
#INPUT ist die Structur entsprechend der Eingänge


Nun möchte ich aber zb. EB 100 - EB 105 (6 Byte) in EINER Struktur hinterlegen.
Komme einfach nicht drauf wie ich das ganz elegant hinbekomme...habe mir auch schon SFC14/15 angeschaut aber bin mir nicht sicher ob das damit Funktioniert.


Hardware:
Profinet Controller:
Siemens IM151-8 F

Profinet Device:
WAGO Feldbuskoppler 750-377
- 4FDI/4FDO Modul [Länge 5 Byte] (werden FB nicht benötigt)
- 16DE Modul [Länge 2 Byte] (werden im FB benötigt)
- 16DE Modul [Länge 2 Byte] (werden im FB benötigt)
- 16DE Modul [Länge 2 Byte] (werden im FB benötigt)


LG
Thorsten
 
Code:
 L     #Adressbereich
 SLD   3
 LAR1  
 L     ED [AR1,P#0.0]
 T     #IN_TEMP
  CALL  "BLKMOV"
  SRCBLK :=#IN_TEMP
  RET_VAL:=#R_Fehler
  DSTBLK :=#INPUT

 L     ED [AR1,P#4.0]
 T     #IN_TEMP_2
  CALL  "BLKMOV"
  SRCBLK :=#IN_TEMP_2
  RET_VAL:=#R_Fehler
  DSTBLK :=#INPUT_2
.
.
.

Wenns bei dieser Variante bleiben soll, dann deinen Offset +4 (Doppelwort) erhöhen und Source und Dest. ebenso
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

soweit wäre ich wohl auch schon gekommen :D
Nur würde ich gerne die 6 BYTE in einer Structur haben und nicht aufgeteilt in 2.
Wenn das nicht möglich ist kopiere ich wohl so wie von dir beschrieben jedes Modul in eine Structur. Wäre halt nicht so schön ;) aber funktioniert.

Mit SFC14/15 kann ich wohl auch nur jedes Modul (bei mir dann 16DI) einzeln auslesen/beschreiben, oder?

LG
Thorsten
 
Code:
  L     #Adressbereich
      SLD   3
      LAR1  
      L     ED [AR1,P#0.0]
      T     LD     2
      L     ED [AR1,P#4.0]
      T     LD     4
      L     EW [AR1,P#6.0]
      T     LD     8

________________________
oder



Code:
L     #iEA_Adresse                //Hardware E/A Adresse
      SLD   3                           //Bitbereich ausblenden
      T     #wEA_Temp                   //temporär speichern

      TAR1  #dTempAR1                   //Adressregister retten
      TAR2  #dTempAR2                   //Adressregister retten


      LAR1  #wEA_Temp                   //Startadresse der Quelle in AR1
      LAR2  P##PI                       //Startadresse des Ziels in AR2

      L     PED [AR1,P#0.0]             //1.PED-Word laden
      T     D [AR2,P#0.0]               //und in PI-Temp schreiben

      L     PED [AR1,P#4.0]             //2. PED-Word laden
      T     D [AR2,P#4.0]               //und in PI-Temp schreiben

      LAR1  #dTempAR1                   //Adressregister zurückschreiben      
      LAR2  #dTempAR2                   //Adressregister zurückschreiben

und erweitern
 
Vielen Dank, denke das habe ich soweit verstanden :)

#PI wäre dann meine STRUCT-Variabel im TEMP oder STAT bereicht der Bausteinschnittstelle? Ist das richtig?
 
so sieht nun das Ergebnis aus

Eingänge einlesen [6 Byte]
Code:
L     #HW_Adresse_E        //Hardware E/A Adresse
      SLD   3                    //Bitbereich ausblenden
      T     #HW_Adresse_E_Temp   //temporär speichern

      TAR1  #dTempAR1            //Adressregister retten
      TAR2  #dTempAR2            //Adressregister retten

      LAR1  #HW_Adresse_E_Temp   //Startadresse der Quelle in AR1
      LAR2  P##IN                //Startadresse des Ziels in AR2

      L EW [ AR1 , P#0.0 ]       //1.E-Word laden
      T W [ AR2 , P#0.0 ]        //und in #IN schreiben

      L EW [ AR1 , P#2.0 ]       //2. E-Word laden
      T W [ AR2 , P#2.0 ]        //und in #IN schreiben

      L EW [ AR1 , P#4.0 ]       //3. E-Word laden
      T W [ AR2 , P#4.0 ]        //und in #IN schreiben

      LAR1  #dTempAR1            //Adressregister zurückschreiben      
      LAR2  #dTempAR2

Programm ansich
Code:
 Bit-geklimpere

Ausgänge beschreiben [7 Byte]
Code:
  L     #HW_Adresse_A        //Hardware E/A Adresse
      SLD   3                    //Bitbereich ausblenden
      T     #HW_Adresse_A_Temp   //temporär speichern

      TAR1  #dTempAR1            //Adressregister retten
      TAR2  #dTempAR2            //Adressregister retten

      LAR1  P##OUT               //Startadresse der Quelle in AR1
      LAR2  #HW_Adresse_A_Temp   //Startadresse des Ziels in AR2

      L W [ AR1 , P#0.0 ]        //1.E-Word laden
      T AW [ AR2 , P#0.0 ]       //und in #OUT schreiben

      L W [ AR1 , P#2.0 ]        //2. E-Word laden
      T AW [ AR2 , P#2.0 ]       //und in #OUT schreiben

      L W [ AR1 , P#4.0 ]        //3. E-Word laden
      T AW [ AR2 , P#4.0 ]       //und in #OUT schreiben

      L B [ AR1 , P#6.0 ]        //4. E-Byte laden
      T AB [ AR2 , P#6.0 ]       //und in #OUT schreiben

      LAR1  #dTempAR1            //Adressregister zurückschreiben      
      LAR2  #dTempAR2

#IN und #OUT sind jeweils STRUCT Variablen im STAT bereich.

//EDIT:
jetzt ist nur die Frage ob das so auch Multiinstanz fähig ist, steige da gerade leider nicht ganz durch...Forensuche glüht schon.
Komme nicht ganz mit wo und wann nun genau AR2 zu AR1 addiert werden muss:confused:

Habe es nun erstmal so gelöst...habe es auch mittlerweile halbwegs verstanden :D (s. Thema http://www.sps-forum.de/simatic/545...multiinstanzen-durch-befehl-ar1-begrenzt.html)

Code:
L     P##OUT               //Startadresse der Quelle in AR1
      L     #dTempAR2
      UD    DW#16#FFFFFF
      +AR1
      LAR2  #HW_Adresse_A_Temp   //Startadresse des Ziels in AR2
 
Zuletzt bearbeitet:
Zurück
Oben