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

Ergebnis 1 bis 5 von 5

Thema: SCL Adresse einer In/Out Variable auslesen

  1. #1
    Registriert seit
    15.02.2011
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Frage


    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.
    Zitieren Zitieren SCL Adresse einer In/Out Variable auslesen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.409
    Danke
    392
    Erhielt 2.342 Danke für 1.949 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    wellenbrecher (05.07.2016)

  4. #3
    Registriert seit
    16.04.2014
    Ort
    Hamburg
    Beiträge
    46
    Danke
    2
    Erhielt 3 Danke für 3 Beiträge

    Standard

    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

  5. Folgender Benutzer sagt Danke zu IckeSI für den nützlichen Beitrag:

    wellenbrecher (05.07.2016)

  6. #4
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.424
    Danke
    710
    Erhielt 612 Danke für 469 Beiträge

    Standard

    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
    Geändert von vollmi (05.07.2016 um 13:25 Uhr)

  7. #5
    wellenbrecher ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.02.2011
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. Step 7 Adresse im DB auslesen ?
    Von Waelder im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.07.2013, 17:57
  2. Antworten: 15
    Letzter Beitrag: 09.09.2011, 10:56
  3. Antworten: 5
    Letzter Beitrag: 30.06.2009, 11:48
  4. PB-Adresse auslesen
    Von Wlaner im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 12.01.2007, 10:20
  5. Antworten: 2
    Letzter Beitrag: 23.09.2004, 09:26

Stichworte

Lesezeichen

Berechtigungen

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