TIA SCL Umsetzung V 5.5 auf TIA 1X

magus111

Level-1
Beiträge
123
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Forum

Mal ein Problem das bei der Umsetzung von einer SCL Quelle aufgetaucht ist.
Und zwar handelt es sich um eine Quelle die mir 2 Werte heraussuchen soll und mir diese ausgibt.
Bei der Umsetzung in TIA bekomme ich unten aufgeführte Fehler:

6,Ungültiger Ein-, Aus- oder Durchgangsparameter.,,,08:26:37
3,Anzahl der an die Funktion oder den Funktionsbaustein übergebenen Parameter abweichend.,,,08:26:37
14,Ungültiger Datentyp.,,,08:26:37
18,Ungültige ARRAY-Variable.,,,08:26:37
19,Ungültige ARRAY-Variable.,,,08:26:37
23,Ungültige ARRAY-Variable.,,,08:26:37
24,Ungültige ARRAY-Variable.,,,08:26:37
28,Ungültiger Datentyp.,,,08:26:37

in Step 7 5.5 ist alles sauber :)

der SCL Quote


Code:
//Baustein zur Entnahme von Positionswerten int aus einen AB. 
//Als Werte werden x und y zur Verfügung gestellt. 
//Überprüfung zur maximalen Positionsanzahl wird gemacht sowie 
//längenabfrage des DB´s.
//Sollte der DB nicht Lang genug sein wird ein Fehler ausgegeben.

FUNCTION_BLOCK FB10
VAR_TEMP
    // temporäre Variablen
        ter : INT ;
        Fehler_DB :INT ; //Fehler DB
END_VAR
VAR
    // statische Variablen
        test : WORD := 10 ;
        laenge_DB :WORD ;
        z: INT;
        DB_Laenge :WORD ;
        Max_Position_I:INT;
        DB_Laenge_I:INT;
        APOSX : INT;
        APOSY : INT;
END_VAR
VAR_INPUT
        Position : WORD;
        Max_Position : WORD;
        B : INT;
        c : INT;
        DB_IN : BLOCK_DB;
END_VAR 

 VAR_OUTPUT
        A1:BOOL := false;
        POSX : WORD;
        POSY : WORD;
        RetVal:INT;
    END_VAR
  
 
Z:= TEST_DB(DB_NUMBER := 1 // IN: WORD
         ,DB_LENGTH :=DB_Laenge  // OUT: WORD
         ,WRITE_PROT := A1 // OUT: BOOL
         ,RET_VAL := RetVal
        ); 
        
 Max_Position_I:= WORD_TO_INT (Max_Position);
 ter := WORD_TO_INT (Position);
 DB_Laenge_I:= (WORD_TO_INT (DB_Laenge)/4);
 
IF ter < Max_Position_I AND  DB_Laenge_I >= Max_Position_I THEN 
        m99.0 := True;  
                 IF ter = 0 THEN 
                 APOSX := (0);
                 APOSY := (2);
                 POSX := DB_IN.DW [(APOSX)];
                 POSY := DB_IN.DW [(APOSY)];
               ELSE
                 APOSX := ((ter-0)*4);
                 APOSY := ((ter-0)*4+2);
                 POSX := DB_IN.DW [(APOSX)];
                 POSY := DB_IN.DW [(APOSY)];
                 
                END_IF;
ELSE
    M99.0 := false ;
    POSX := 0;
    POSY := 0;
END_IF;
 
  
 
    

               
END_FUNCTION_BLOCK


Bedanke mich schon mal

Magus111
 
hi
du hast den Baustein migriert und dann hast du diese Fehler bekommen?

Wenn du einfach die Quelle nimmst und sie in TIA aufmachen willst erkennt er nicht alles weil sich was an der Syntax geändert hat. Wenn das so war migriere erstmal das Projekt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen

Ich hatte das durch den SCL Converter V1.0 (632053296) gejagt abgelegt.
Glaube ich habe wie du schon sagtest mit der Syntax ein Problem.
Der Siemens Mitarbeiter von damals Umsteierkurs hat das angedeutet konnte aber nichts konkretes dazu sagen.
Der kommt glaube ich zum einen mit der Schreibweise der Indirekten Adressierung nicht klar und zum einen habe ich da einen Merker drin (gebe zu ist nicht schon :( ) und der Test für die Länge des Datenbausteines geht wohl nicht.
 
So geht das: (der Test DB hat keinen RetVal mehr)

Code:
FUNCTION_BLOCK "FB10"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.0
   VAR_INPUT 
      Position : Word;
      Max_Position : Word;
      B : Int;
      c : Int;
      DB_IN : Block_DB;
   END_VAR


   VAR_OUTPUT 
      A1 : Bool;
      POSX : Word;
      POSY : Word;
      RetVal : Int;
   END_VAR


   VAR 
      test : Word := W#16#A;
      laenge_DB : Word;
      z : Int;
      DB_Laenge : Word;
      Max_Position_I : Int;
      DB_Laenge_I : Int;
      APOSX : Int;
      APOSY : Int;
   END_VAR


   VAR_TEMP 
      ter : Int;
      Fehler_DB : Int;   // Fehler DB
   END_VAR




BEGIN
	
	
	#z := TEST_DB(DB_NUMBER := 1, DB_LENGTH => #DB_Laenge, WRITE_PROT => #A1);
	        
	 #Max_Position_I:= WORD_TO_INT (#Max_Position);
	 #ter := WORD_TO_INT (#Position);
	 #DB_Laenge_I:= (WORD_TO_INT (#DB_Laenge)/4);
	 
	IF #ter < #Max_Position_I AND  #DB_Laenge_I >= #Max_Position_I THEN 
	        "Tag_1" := True;  
	                 IF #ter = 0 THEN 
	                 #APOSX := (0);
	                 #APOSY := (2);
	                 #POSX := #DB_IN.DW((#APOSX)) ;
	                 #POSY := #DB_IN.DW((#APOSY)) ;
	               ELSE
	                 #APOSX := ((#ter-0)*4);
	                 #APOSY := ((#ter-0)*4+2);
	                 #POSX := #DB_IN.DW((#APOSX)) ;
	                 #POSY := #DB_IN.DW((#APOSY)) ;
	                 
	                END_IF;
	ELSE
	    "Tag_1" := false ;
	    #POSX := 0;
	    #POSY := 0;
	END_IF; 
	
	               
	
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Und für die 1500 müsstest du noch ein bisschen was tun:

Code:
FUNCTION_BLOCK "FB10"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.0
   VAR_INPUT 
      Position : Word;
      Max_Position : Word;
      B : Int;
      c : Int;
      DB_IN : DB_ANY := DB 1;
   END_VAR


   VAR_OUTPUT 
      A1 : Bool;
      POSX : Word;
      POSY : Word;
      RetVal : Int;
   END_VAR


   VAR 
      test : Word := W#16#A;
      laenge_DB : Word;
      z : Int;
      DB_Laenge : Word;
      Max_Position_I : Int;
      DB_Laenge_I : Int;
      APOSX : Int;
      APOSY : Int;
   END_VAR


   VAR_TEMP 
      ter : Int;
      Fehler_DB : Int;   // Fehler DB
      SCL_MIGRA_TEMP_INT_1 : Int;
      Migra_DB_LENGTH : UDInt;
   END_VAR




BEGIN
	
	
	(* classic code: #z := TEST_DB(DB_NUMBER := 1, DB_LENGTH => #DB_Laenge, WRITE_PROT => #A1);*)
	#SCL_MIGRA_TEMP_INT_1:=ATTR_DB(REQ:=True,DB_NUMBER:=1,DB_LENGTH=>#Migra_DB_LENGTH,ATTRIB:=(* ToReplace_#A1 *));
	#DB_Laenge:=UDINT_TO_WORD(#Migra_DB_LENGTH);
	#z := #SCL_MIGRA_TEMP_INT_1;
	        
	 #Max_Position_I:= WORD_TO_INT (#Max_Position);
	 #ter := WORD_TO_INT (#Position);
	 #DB_Laenge_I:= (WORD_TO_INT (#DB_Laenge)/4);
	 
	IF #ter < #Max_Position_I AND  #DB_Laenge_I >= #Max_Position_I THEN 
	        "Tag_1" := True;  
	                 IF #ter = 0 THEN 
	                 #APOSX := (0);
	                 #APOSY := (2);
	                 (* classic code: #POSX := #DB_IN.DW((#APOSX)) ;*)
	                 #POSX := PEEK_WORD(area:=16#84,dbNumber:=#DB_IN,byteOffset:=(#APOSX)) ;
	                 (* classic code: #POSY := #DB_IN.DW((#APOSY)) ;*)
	                 #POSY := PEEK_WORD(area:=16#84,dbNumber:=#DB_IN,byteOffset:=(#APOSY)) ;
	               ELSE
	                 #APOSX := ((#ter-0)*4);
	                 #APOSY := ((#ter-0)*4+2);
	                 (* classic code: #POSX := #DB_IN.DW((#APOSX)) ;*)
	                 #POSX := PEEK_WORD(area:=16#84,dbNumber:=#DB_IN,byteOffset:=(#APOSX)) ;
	                 (* classic code: #POSY := #DB_IN.DW((#APOSY)) ;*)
	                 #POSY := PEEK_WORD(area:=16#84,dbNumber:=#DB_IN,byteOffset:=(#APOSY)) ;
	                 
	                END_IF;
	ELSE
	    "Tag_1" := false ;
	    #POSX := 0;
	    #POSY := 0;
	END_IF; 
	
	               
	
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
erst mal danke für die schnelle Hilfe.
eine Sache habe ich da nicht auf dem Schirm was hat du an den "#DB_IN.DW[(#APOSY)" und zwar den DW gemacht Schreibweise ist gleich zu dem was ich oben gepostet habe aber jetzt habe ich keinen roten underliner mehr drunter :confused: .
 
Wieso übergebt ihr eigentlich nicht sowas wie P#DB9.DBX0.0? //Startadresse zu übergebender DB
Im FC schreibe ich dann datenarray of array[1..3,1..4] of int. //Deklaration entspricht DB

Wenn ich das noch parametrierbar machen will übergebe ich die Arraygröße von aussen oder innen.
Also ich finde das viel einfacher.Oder übersehe ich hier irgendwas?man lernt ja gern dazu.:)
 
Zurück
Oben