Step 7 Pointer an FB übergeben für Zieladresse (BLK) am "SFC_FILL"

chrissi0907

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

ich habe mir einen FB erstellt, in dem ich mehrere Werte in einen DB schreibe. Dieser Vorgang wird nur einmalig gemacht, wenn die Steuerung eingeschalten wird.
Damit keine falschen Informationen im Ziel-DB stehen, wird dieser vorab immer mit dem SFC21 "SFC_FILL" mit 0en beschrieben.

Ich übergebe alle Daten von außen an den DB, dass dieser quasi modular ist. Nun habe ich das Problem, dass ich den Ausgang BLK des "SFC_FILL" als Pointer im Format P#DB3333.DBX0.0 BYTE 8 übergeben muss. Diesen Pointer würde ich gerne entweder auch in diesem Format als IN-Parameter übergeben oder alternativ mir im Baustein zusammenbauen.

Code:
      CALL  "SFC_FILL"
       BVAL   :=#Wert_0
       RET_VAL:=#Status
       BLK    :=P#DB3333.DBX0.0 BYTE 8

Habe mir schon hier auch einige Beiträge angeschaut aber zu einer Funktionierenden Lösung bin ich leider nie gekommen :(
Kann mir hier jemand auf die Sprünge helfen? :confused:

Ist es wirklich so umständlich einen Pointer an den Baustein zu übergeben?


Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Link, ich habe schon einige hier im Forum gefunden, diesen jedoch noch nicht.

Nur leider komm ich damit auch nicht ans Ziel.

Folgendes habe ich eingerichtet:

Baustein Aufruf im OB1:
Code:
      CALL  FB     4 , DB4
       IA_DATA     :=P#DB44.DBX0.0 BYTE 16

Baustein Inhalt FB4:
Code:
FUNCTION_BLOCK FB 4
TITLE =
{ S7_language := '9(1) Englisch (USA)  25.03.2014  08:14:02' }
VERSION : 0.1




VAR_INPUT
  IA_DATA : ANY ;    
END_VAR
VAR
  Wert_0 : WORD ;    
  Status : INT ;    
END_VAR
VAR_TEMP
  source : ANY ;    
  p_tmp1 : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =


// 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


NETWORK
TITLE =
      CALL "SFC_FILL" (
           BVAL                     := #Wert_0,
           RET_VAL                  := #Status,
           BLK                      := #p_tmp1);
END_FUNCTION_BLOCK


Leider werden die Werte im angegebenen DB44 nicht mit 0 überschrieben. Sprich die Übergabe funktioniert nicht.
Kann mir jemand sagen, wass ich falsch mache? Habe es aus meiner Sicht wie oben beschrieben gemacht... :confused::-(

Viele Grüße
 
Zurück
Oben