TIA SCL Adresse einer In/Out Variable auslesen

wellenbrecher

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

ich habe eine S7-300 CPU mit ET200 Serielle Schnittstelle.

Nun möchte ich einen SCL-Baustein schreiben zum Schreiben bzw. Lesen über die serielle Schnittstelle. Der FB2 (S_RCV) und FB3 (S_SEND) benötigen als Input DB-Nummer und DB-Adresse. Diese Daten würde ich gern symbolisch übergeben, d.h. das ich außen am Baustein den UDT mit z.B. den Senddaten antrage. In/Out Variablen werden ja als Pointer übergeben und in AWL kann ich daraus recht einfach die DB-Nummer und Adresse auslesen. Aber wie geht das in SCL?

Evtl. gibt es ja auch noch eine bessere Lösung.

Vielen Dank.
 
Ich würde das dann so machen :
- den Parameter deines Bausteins als Typ "ANY" deklarieren.
- in deinem Baustein den ANY-Pointer auflösen (das geht z.B. mittels eine AT-Sicht)
- nun die Einzeldaten aus der AT-Sicht zur Versorgung der in deinen Baustein eingelagerten FB's nehmen

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du auf deinen UDT im fb noch zugreifen musst kannst du deinen UDT auch als InOut übergeben.

Im Tempbereich dann eine Variable anlegen vom Type any und da reinkopieren.
(Du kannst auch eine bestimmt Variable aus deinen UDT in Any kopieren und bekommst dann noch die ByteNo. )

anschließend s.Larry


Gruß Thomas
 
Larrys Vorgehensweise habe ich mal als Beispielcode dargestellt:

Der eigentliche Code.
Code:
FUNCTION_BLOCK "Baustein_1"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      Startdaten : Any;
      pStartdaten  AT Startdaten : "ANY_POINTER";
      versatz : Int;
   END_VAR


   VAR 
      pAnypointer : "ANY_POINTER";
      pAnypointer_out : "ANY_POINTER";
      IN_Byte : Int;
      IN_Bit : Int;
      OUT_Byte : Int;
      OUT_Bit : Int;
   END_VAR


   VAR_TEMP 
      Anypointer_out : Any;
      pTempANY AT Anypointer_out : "ANY_POINTER";
   END_VAR


   VAR CONSTANT 
      Eingänge : DWord := 16#8100_0000;
      Ausgänge : DWord := 16#8200_0000;
      Merker : DWord := 16#8300_0000;
      Datenbaustein : DWord := 16#8400_0000;
      Instanz_DB : DWord := 16#8500_0000;
      LokalDaten : DWord := 16#8600_0000;
      VorherigeLokalDaten : DWord := 16#8700_0000;
   END_VAR




BEGIN
    (* Eingangs any in einen Stat Any kopieren dann kann man sehen was mit dem ANY "Startdaten" am IN passiert. 
    Das ist im Normalen Code nicht nötig. Mann kann auch direkt mit "pStartdaten" arbeiten *)
    #pAnypointer := #pStartdaten;
    
    #IN_Byte := DWORD_TO_INT(SHR(IN := SHL(IN := #pStartdaten.Startadresse, N := 8), N := 11)); (* Startbyte errechnen *)
    #IN_Bit := DWORD_TO_INT(SHR(IN := SHL(IN := #pStartdaten.Startadresse, N := 29), N := 29)); (* Startbit errechnen *)
    
    #OUT_Byte := 30; // dem Byte mal einen festen Wert zuweisen
    #OUT_Bit := 3; // dem Startbit mal einen festen Wert zuweisen
    
    (* nun kann man die Startadresse für einen weiteren Pointer errechnen *)
    #pAnypointer_out.Startadresse := SHL(IN := INT_TO_DWORD(#OUT_Byte), N := 3) OR INT_TO_DWORD(#OUT_Bit) OR #Datenbaustein;
    
    (* aus dem Stat in den Temp kopieren. Any lässt sich in Stat nicht deklarieren.
    nun kann mit "Anypointer_out" ein Baustein beschickt werden der ein ANY braucht. Man könnte stat ANY auch Remote ald Datentyp nehmen.
    Der Aufbau ist derselbe (für PUT/GET z.B.)*)
    
    #pTempANY := #pAnypointer_out;
    
END_FUNCTION_BLOCK

Den Anypointer als UDT zusammengestellt, dass auch wirklich alles vollsymbolisch funktioniert.
Code:
TYPE "ANY_POINTER"
VERSION : 0.1
  STRUCT     
   SyntaxID : BYTE ;    
   Bereichstyp : BYTE ;    
   Anzahl_Werte : INT ;    
   DB_Nr : INT ;    
   Startadresse : DWORD ;    
  END_STRUCT ;    
END_TYPE
 
Zuletzt bearbeitet:
Vielen Dank für die hilfreichen Antworten:

Ich habe es wie von Thomas und Larry beschrieben gemacht.

1. InOut Variable für Sende bzw. Empfangsdaten
2. Im Temp-Bereich einen Anypointer mit AT-Struktur überlagert.
3. Die InOut Variable auf den Anypointer kopiert
4. DB-Adresse und Nummer auslesen
5. FBs versorgen

Hat wunderbar funktioniert und ich kann die Sendedaten zusätzlich noch manipulieren.

Die Vorgehensweise den InOut auf einen Anypointer kopieren usw. kannt ich noch nicht. Man lernt halt nie aus.

Danke nochmal an alle.

Gruß Christian
 
Zurück
Oben