Step 7 ANY Adresse in SCL

DeltaMikeAir

User des Jahres 2018; 2023
Beiträge
21.726
Reaktionspunkte
7.197
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
 
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é
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 :ROFLMAO: . 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.
 
Zuletzt bearbeitet:
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
 
Zurück
Oben