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

Ergebnis 1 bis 7 von 7

Thema: SCL Umsetzung V 5.5 auf TIA 1X

  1. #1
    Registriert seit
    01.02.2008
    Beiträge
    93
    Danke
    9
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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
    ------------------------------------------------------------------------------------
    Ein Danke schadet niemanden spornt aber an


    Wer Rechtschreibfehler findet soll diese behalten....
    Zitieren Zitieren SCL Umsetzung V 5.5 auf TIA 1X  

  2. #2
    Registriert seit
    17.12.2010
    Beiträge
    222
    Danke
    21
    Erhielt 75 Danke für 53 Beiträge

    Standard

    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.

  3. #3
    Registriert seit
    01.02.2008
    Beiträge
    93
    Danke
    9
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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.
    ------------------------------------------------------------------------------------
    Ein Danke schadet niemanden spornt aber an


    Wer Rechtschreibfehler findet soll diese behalten....

  4. #4
    Registriert seit
    17.12.2010
    Beiträge
    222
    Danke
    21
    Erhielt 75 Danke für 53 Beiträge

    Standard

    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
    Geändert von daschris (04.09.2015 um 09:46 Uhr)

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

    magus111 (04.09.2015)

  6. #5
    Registriert seit
    17.12.2010
    Beiträge
    222
    Danke
    21
    Erhielt 75 Danke für 53 Beiträge

    Standard

    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

  7. Folgender Benutzer sagt Danke zu daschris für den nützlichen Beitrag:

    magus111 (04.09.2015)

  8. #6
    Registriert seit
    01.02.2008
    Beiträge
    93
    Danke
    9
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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 .
    ------------------------------------------------------------------------------------
    Ein Danke schadet niemanden spornt aber an


    Wer Rechtschreibfehler findet soll diese behalten....

  9. #7
    Registriert seit
    19.06.2015
    Beiträge
    459
    Danke
    26
    Erhielt 40 Danke für 35 Beiträge

    Standard


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

Ähnliche Themen

  1. [TIA-V11] Rechnet TIA falsch bei SCL
    Von BlackLizzard im Forum Simatic
    Antworten: 43
    Letzter Beitrag: 09.02.2016, 02:59
  2. Sonstiges Umsetzung von S5 auf S7
    Von Micromac im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 04.07.2014, 16:22
  3. Umsetzung von AWL nach SCL TIA V11
    Von Ingo dV im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 30.08.2012, 12:42
  4. Antworten: 1
    Letzter Beitrag: 23.01.2012, 17:06
  5. Umsetzung RS232 auf Profibus Step7
    Von steven001 im Forum Simatic
    Antworten: 31
    Letzter Beitrag: 17.10.2008, 21:59

Lesezeichen

Berechtigungen

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