Symbolische Parameterübergabe an SFC20

Isha

Level-1
Beiträge
55
Reaktionspunkte
0
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
[INDENT]Struct DatHeizung1 
[INDENT]SollTemp1 int
SollTemp2 int
[/INDENT]End struct
 
Struct DatHeizung2 
[INDENT]SollTemp1 int
SollTemp2 int
[/INDENT]End struct
[/INDENT]
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Hallo Gebs

Stimmt :p. 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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@gebs: endlich sind wir dann da angekommen, was ich erst schon geschrieben habe :rolleyes:

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
 
Hallo Gebs, hallo vierlagig

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

Gruss
Isha
 
Zurück
Oben