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

Ergebnis 1 bis 5 von 5

Thema: ANY Adresse in SCL

  1. #1
    Registriert seit
    14.01.2015
    Beiträge
    937
    Danke
    271
    Erhielt 156 Danke für 141 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe ein AWL Programm, welches ich in SCL umschreibe. Dort wird auch der SFC14/15 PUT / GET verwendet.

    In AWL habe ich damals die Quelle mit folgendem ANY versorgt: P#DB20.DBX 0.0 BYTE 20
    Dies schluckt SCL ja nicht mehr, er will dort natürlich eine Struktur aus einem DB angegeben haben ( z.B. "Daten".Struktur1 )
    Da der DB aber nicht in diesem Projekt liegt sondern in einem anderen ( die Werte soll der GET ja von dort holen ),
    ist die Struktur in dem Projekt natürlich nicht vorhanden und der CODE wird natürlich nicht kompiliert.

    Wie könnte ich dies umsetzen?

    Danke für eure Hilfe

    Mit Grüßen
    Zitieren Zitieren Gelöst: ANY Adresse in SCL  

  2. "Mensch seid ihr schnell . Ich hatte meinen Beitrag nur wenige Sekunden online stehen und wollte ihn nur noch einmal kurz überdenken.

    Die ID ist immer 16#10, Typ ist vorzugsweise BYTE bzw. 16#02 und der Zeiger hat das Pointer-Format wie auch in AWL . Am einfachsten ist es aber, wenn du den ANY-Pointer von außen als Parameter übergibst. Dann kannst du ihn wie gewohnt z.Bsp. als P#DB20.DBX 0.0 BYTE 20 angeben, Das AT-Konstrukt ist dann garnicht notwendig, einfach nur ANY_TEMP:=ANY_IN. Ich bevorzuge es übrigens, in beiden Steuerungen einen identischen DB für jede Datenrichtung an zu legen. Dann habe ich in beiden Steuerungen die selbe Symbolik und die selben Adressen, wie z.Bsp. "Daten".Struktur1. Das geht natürlich nicht immer."


  3. #2
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.423
    Danke
    710
    Erhielt 611 Danke für 469 Beiträge

    Standard

    Direkt einen Pointer statisch angeben, das geht in SCL schlicht nicht. Du könntest dir allerdings eine Funktion bauen welche dir aus db, start, länge einen any zusammenbaut an einen Temp übergibst welchen du dann wo nötig an eine Schnittstelle hängst.

    mfG René

  4. Folgender Benutzer sagt Danke zu vollmi für den nützlichen Beitrag:

    DeltaMikeAir (07.09.2016)

  5. #3
    Avatar von DeltaMikeAir
    DeltaMikeAir ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.01.2015
    Beiträge
    937
    Danke
    271
    Erhielt 156 Danke für 141 Beiträge

    Standard

    Danke schon mal für eure Hilfe,

    Onkel Dabobert, könntest du mir noch ein kurzes Beispiel geben, welche Werte für folgendes eingegeben werden müssen:
    P#DB111.DBX0.0 BYTE 222

    ID : ???;
    TYP : ???;
    ANZAHL_TYP : 222;
    DB_NR : 111;
    ZEIGER : ???;


    Vielen Dank

  6. #4
    Registriert seit
    06.10.2003
    Beiträge
    3.258
    Danke
    426
    Erhielt 476 Danke für 384 Beiträge

    Standard

    Mensch seid ihr schnell . Ich hatte meinen Beitrag nur wenige Sekunden online stehen und wollte ihn nur noch einmal kurz überdenken.

    Die ID ist immer 16#10, Typ ist vorzugsweise BYTE bzw. 16#02 und der Zeiger hat das Pointer-Format wie auch in AWL . Am einfachsten ist es aber, wenn du den ANY-Pointer von außen als Parameter übergibst. Dann kannst du ihn wie gewohnt z.Bsp. als P#DB20.DBX 0.0 BYTE 20 angeben, Das AT-Konstrukt ist dann garnicht notwendig, einfach nur ANY_TEMP:=ANY_IN. Ich bevorzuge es übrigens, in beiden Steuerungen einen identischen DB für jede Datenrichtung an zu legen. Dann habe ich in beiden Steuerungen die selbe Symbolik und die selben Adressen, wie z.Bsp. "Daten".Struktur1. Das geht natürlich nicht immer.
    Geändert von Onkel Dagobert (07.09.2016 um 13:00 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  7. #5
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.423
    Danke
    710
    Erhielt 611 Danke für 469 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hab fürs Pointerbauen mal n kleinen Versuchsbaustein geschrieben. Den hab ich immer benutzt um die Arbeitsweise zu verinnerlichen.
    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
    Code:
    TYPE "ANY_POINTER"VERSION : 0.1
      STRUCT 	
       SyntaxID : BYTE ;	
       Bereichstyp : BYTE ;	
       Anzahl_Werte : INT ;	
       DB_Nr : INT ;	
       Startadresse : DWORD ;	
      END_STRUCT ;	
    END_TYPE

  8. Folgender Benutzer sagt Danke zu vollmi für den nützlichen Beitrag:

    DeltaMikeAir (07.09.2016)

Ähnliche Themen

  1. TIA SCL Adresse einer In/Out Variable auslesen
    Von wellenbrecher im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 05.07.2016, 13:17
  2. Antworten: 1
    Letzter Beitrag: 26.07.2012, 15:19
  3. Antworten: 15
    Letzter Beitrag: 09.09.2011, 10:56
  4. in SCL Adresse von String im IDB ermitteln
    Von Ralle im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 03.03.2011, 09:39
  5. Antworten: 7
    Letzter Beitrag: 11.03.2008, 10:54

Stichworte

Lesezeichen

Berechtigungen

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