Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: Symbolische Parameterübergabe an SFC20

  1. #1
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Ich muss Daten von einem DB in andere DB's kopieren. Mit dem SFC20 kein Problem. Nun ändert aber der DB-Aufbau von einem Projekt zum andern, so dass die Anfangsadresse der Daten immer anders ist. Der symbolische Name und die Länge der zu kopierenden Daten bleibt aber immer gleich.

    Die DB''s bestehen aus Strukturen. Ich möchte nun für die Kopierfunktion den Strukturname verwenden.

    Aufbau der DB's:
    Code:
    DB1,DB2
    
    Struct DatHeizung1
    SollTemp1 int SollTemp2 int
    End struct Struct DatHeizung2
    SollTemp1 int SollTemp2 int
    End struct
    Ich möchte die Daten kopieren indem ich sagen kann:
    Kopiere DB1;DatHeizung1, 4Byte nach DB2;DatHeizung1

    Wie mache ich das in S7 mit dem SFC20?

    Gruss Isha
    Zitieren Zitieren Symbolische Parameterübergabe an SFC20  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    du mußt dir ziel- und quellpointer zusammenbasteln

    http://www.sps-forum.de/showpost.php...54&postcount=2
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Es geht auch symbolisch! Man muss aber den DBs auch Symbole zuordnen:

    Code:
     CALL  "BLKMOV"
           SRCBLK :="test1".Sollwert1
           RET_VAL:=MW1
           DSTBLK :="test2".Sollwert1
    Grüße
    Gebs

  4. #4
    Isha ist offline Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Gebs

    Stimmt . Es funktioniert wenn im DB eine Struktur ist.
    Leider aber habe ich nun keine Struktur wie vorher beschrieben.

    Die Daten die ich kopieren muss befinden sich in einem Instanz-DB.
    Im Instanz-DB hat es Multiinstanz-FBs:
    DB1:
    DatHeizung1 Typ:FB200
    DatHeizung2 Typ:FB200
    etc.

    Der FB200 hat IN/OUT-Variablen und auch statische Variablen.
    Nun muss ich die IN/OUT-Variablen in einen andern DB kopieren.

    Wenn ich den symbolischen Namen angebe, wird mir angezeigt die Zugriffslänge sei 1 Bit.

    Gruss
    Isha

  5. #5
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Hallo Isha,

    ich hab' mal ein wenig rumprobiert. Die Symbolische Adressierung bei Multiinstanzen
    funktioniert leider nur, wenn man in den einzelnen VAR-Bereichen Strukturen deklariert.
    Man kann dann auch nur die einzelnen Bereiche Symbolisch adressieren.

    Anbei noch meine Testbausteine:

    Code:
    FUNCTION_BLOCK FB 1
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      IN : STRUCT     
       IN_Wert1 : WORD ;    
       IN_Wert2 : WORD ;    
       IN_Bool1 : BOOL ;    
      END_STRUCT ;    
    END_VAR
    VAR_OUTPUT
      out : STRUCT     
       OUT_Wert1 : WORD ;    
       OUT_Wert2 : WORD ;    
       OUT_Bool1 : BOOL ;    
      END_STRUCT ;    
    END_VAR
    VAR
      stat : STRUCT     
       STAT_WERT1 : WORD ;    
       STAT_Wert2 : WORD ;    
       STAT_Bool1 : BOOL ;    
      END_STRUCT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    
    
    END_FUNCTION_BLOCK
    
    FUNCTION_BLOCK FB 2
    TITLE =
    VERSION : 0.1
    
    
    VAR
      Multi1 : FB 1;    
      Multi2 : FB 1;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    
    
    END_FUNCTION_BLOCK
    
    FUNCTION FC 1 : VOID
    TITLE =
    VERSION : 0.1
    
    BEGIN
    NETWORK
    TITLE =
    
          CALL "BLKMOV" (
               SRCBLK                   := "test3".Multi1.IN,
               RET_VAL                  := MW     1,
               DSTBLK                   := "test3".Multi2.IN);
    
          CALL "BLKMOV" (
               SRCBLK                   := "test3".Multi1.out,
               RET_VAL                  := MW     1,
               DSTBLK                   := "test3".Multi2.out);
    
          CALL "BLKMOV" (
               SRCBLK                   := "test3".Multi1.stat,
               RET_VAL                  := MW     1,
               DSTBLK                   := "test3".Multi2.stat);
    
    END_FUNCTION
    
    DATA_BLOCK "test3"
    TITLE =
    VERSION : 0.1
    
     FB 2
    BEGIN
       Multi1.IN.IN_Wert1 := W#16#0; 
       Multi1.IN.IN_Wert2 := W#16#0; 
       Multi1.IN.IN_Bool1 := FALSE; 
       Multi1.out.OUT_Wert1 := W#16#0; 
       Multi1.out.OUT_Wert2 := W#16#0; 
       Multi1.out.OUT_Bool1 := FALSE; 
       Multi1.stat.STAT_WERT1 := W#16#0; 
       Multi1.stat.STAT_Wert2 := W#16#0; 
       Multi1.stat.STAT_Bool1 := FALSE; 
       Multi2.IN.IN_Wert1 := W#16#0; 
       Multi2.IN.IN_Wert2 := W#16#0; 
       Multi2.IN.IN_Bool1 := FALSE; 
       Multi2.out.OUT_Wert1 := W#16#0; 
       Multi2.out.OUT_Wert2 := W#16#0; 
       Multi2.out.OUT_Bool1 := FALSE; 
       Multi2.stat.STAT_WERT1 := W#16#0; 
       Multi2.stat.STAT_Wert2 := W#16#0; 
       Multi2.stat.STAT_Bool1 := FALSE; 
    END_DATA_BLOCK
    Ich hoffe es hilft Dir weiter!

    Grüße
    Gebs

  6. #6
    Isha ist offline Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Gebs, das habe ich befürchtet.

    Leider handelt es sich bei meiner Anwendung um eine F-CPU und ein Sicherheitsprogramm. Die Daten möchte ich aus dem Sicherheitsprogramm kopieren und auswerten.

    Leider sind im Sicherheitsprogramm keine Strukturen erlaubt.
    Warum diese Schikane ist, wissen vermutlich nicht mal die Verantwortlichen von Siemens!

    Gruss
    Isha

  7. #7
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Hallo Isha,

    es gibt noch 2 Möglichkeiten die Daten über Symbolik zu kopieren.
    Beide sind aber nicht "das gelbe vom Ei".

    Möglichkeit 1: alles "zu Fuß" kopieren
    Code:
        L     "Daten".DatHeizung1.SollTemp1
        T     "Daten".DatHeizung2.SollTemp1
    Möglichkeit 2: Du nimmst den FC 2 den ich geschrieben habe statt des SFC20
    (@all: bitte nicht schlagen. Ich weiss, dass man so nicht programmieren sollte)
    Code:
    FUNCTION FC 1 : VOID
    TITLE =
    VERSION : 0.1
    
    BEGIN
    NETWORK
    TITLE =
    
    
          CALL FC     2 (
               Quelle                   := "Daten".DatHeizung1.SollTemp1,
               Ziel                     := "Daten".DatHeizung2.SollTemp1);
    
    
    END_FUNCTION
    
    FUNCTION FC 2 : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      Quelle : ANY ;    
      Ziel : ANY ;    
    END_VAR
    VAR_TEMP
      Temp_Quelle : ANY ;    
      Temp_Ziel : ANY ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    // Pointer für SFC 20 SRCBLK bilden
          L     P##Quelle; // Adresse des Any-Pointers laden
          LAR1  ; // ins Adressregister 1
    
          L     P##Temp_Quelle; // Adresse des temp. Any laden
          LAR2  ; // ins AR2
    
          L     D [AR1,P#0.0]; // Erstmal die kompletten Daten aus Any #Quelle
          T     D [AR2,P#0.0]; // in Any #Temp_Quelle kopieren
    
          L     D [AR1,P#4.0]; 
          T     D [AR2,P#4.0]; 
    
          L     W [AR1,P#8.0]; 
          T     W [AR2,P#8.0]; 
    
          L     4; // Anzahl zu kopierender Bytes
          T     W [AR2,P#2.0]; // im Any #Temp_Quelle ablegen
    
    // Pointer für SFC 20 DSTBLK bilden
          L     P##Ziel; // Adresse des Any-Pointers laden
          LAR1  ; // ins Adressregister 1
    
          L     P##Temp_Ziel; // Adresse des temp. Any laden
          LAR2  ; // ins AR2
    
          L     D [AR1,P#0.0]; // Erstmal die kompletten Daten aus Any #Ziel
          T     D [AR2,P#0.0]; // in Any #Temp_Ziel kopieren
    
          L     D [AR1,P#4.0]; 
          T     D [AR2,P#4.0]; 
    
          L     W [AR1,P#8.0]; 
          T     W [AR2,P#8.0]; 
    
          L     4; // Anzahl zu kopierender Bytes
          T     W [AR2,P#2.0]; // im Any #Temp_Ziel ablegen
    
    
          CALL "BLKMOV" (
               SRCBLK                   := #Temp_Quelle,
               RET_VAL                  := MW     0,
               DSTBLK                   := #Temp_Ziel);
    END_FUNCTION
    
    FUNCTION_BLOCK FB 1
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      SollTemp1 : INT ;    
      SollTemp2 : INT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    
    
    END_FUNCTION_BLOCK
    
    FUNCTION_BLOCK FB 2
    TITLE =
    VERSION : 0.1
    
    
    VAR
      DatHeizung1 : FB 1;    
      DatHeizung2 : FB 1;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    
    
    END_FUNCTION_BLOCK
    
    DATA_BLOCK "Daten"
    TITLE =
    VERSION : 0.1
    
     FB 2
    BEGIN
       DatHeizung1.SollTemp1 := 0; 
       DatHeizung1.SollTemp2 := 0; 
       DatHeizung2.SollTemp1 := 0; 
       DatHeizung2.SollTemp2 := 0; 
    END_DATA_BLOCK
    Du trägst dann bei Quelle bzw. Ziel das 1. DBW ein, das kopiert werden soll.
    Im FC 2 kannst Du dann falls notwendig die Kopierlänge anpassen.

    Grüße
    Gebs

  8. #8
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    @gebs: endlich sind wir dann da angekommen, was ich erst schon geschrieben habe
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  9. #9
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    @gebs: endlich sind wir dann da angekommen, was ich erst schon geschrieben habe
    Mir schien, dass es für Isha am wichtigsten war mit Symbolik zu arbeiten.
    Deshalb habe ich natürlich als erstes nach einfachen Lösungen hierzu gesucht.
    Bei Ralles Baustein kann man nicht Symbolik arbeiten. Darum hatte ich mich nicht
    weiter damit beschäftigt.

    Grüße
    Gebs

  10. #10
    Isha ist offline Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Gebs, hallo vierlagig

    Vielen Dank für eure Hilfe.
    Die Lösung mit dem FC2 funktioniert wunderbar.

    Gruss
    Isha

Ähnliche Themen

  1. FC's mit Parameterübergabe
    Von Gini im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 10.09.2009, 09:39
  2. Parameterübergabe FB <-> HMI
    Von eYe im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 22.03.2009, 11:38
  3. CC und Parameterübergabe
    Von PHANTOMIAS im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.04.2008, 07:42
  4. Parameterübergabe mit CALL FCx
    Von lastweb im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 25.01.2007, 21:43
  5. S7 200: SBR (CALL) mit Parameterübergabe
    Von Willu im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 09.07.2006, 22:45

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •