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

Ergebnis 1 bis 10 von 10

Thema: SCL Frage

  1. #1
    Registriert seit
    22.12.2015
    Beiträge
    60
    Danke
    5
    Erhielt 2 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    kann mir jemand helfen? Warum funktioniert der SCL Code nicht mit dem FILL? Beim BLKMOV ist das kein Problem. Danke

    Code:
    FUNCTION UDF_Fill_TypeToDB: BOOL  
    TITLE = 'Fill DB Range with Type'
    //Author...: RWo 06.03.12
    VERSION : '1.0'
    AUTHOR  : RWo
    NAME    : DBtoTyp
    FAMILY  : RWo_LIB
    KNOW_HOW_PROTECT
    VAR_INPUT
      Source:     ANY;  //target pointer (Any)
      //Source_DB:  INT;  //source data block
      //Source_BY:  INT;  //source start byte
      //Target:     ANY;  //target pointer (Any)
      Target_DB:  INT;  //
      Target_BY:  INT;  //
      ByteCount:  INT;  //number of byte to copy
    END_VAR
    VAR_IN_OUT
    END_VAR
    VAR_OUTPUT
      //SourceObj:  INT;  //Source object
      //SourceVal:  INT;  //source value
      //TargetObj:  INT;  //Target object
      //TargetVal:  INT;  //target value 
    END_VAR
    VAR_TEMP
      RET_V:  INT;
      QUELLE: ANY;
      ZIEL:   ANY;
      (*
      //Wir basteln uns einen Any Pointer für die Quelle .....................................
      sQuell AT QUELLE :STRUCT
        S7BYTE :BYTE;   // Byte 0       Reserviert für S7 (10h)
        DatTyp :BYTE;   // Byte 1       Datentyp *1
        Anzahl :INT;    // Byte 2+3     Länge der Variablen
        DBNR   :INT;    // Byte 4+5     DB-Nummer
        //SpBer1 :BYTE;   // Byte 6       Datentyp beim Auslesen *3 (Speicherbereich *2)
        //Null   :BYTE;   // Byte 7       Null beim Auslesen
        //SpBer2 :WORD;   // Byte 8+9     Speicherbereich Nummer beim Auslesen *3
        Zeiger :DWORD;  // Byte 6+7+8+9 Bereichszeiger_DW OR Adressword_DW (ShiftLinks 3)
      END_STRUCT;
      *)
      //Wir basteln uns einen Any Pointer für das Ziel .......................................
      sZiel AT ZIEL :STRUCT
        S7BYTE :BYTE;   // Byte 0       Reserviert für S7 (10h)
        DatTyp :BYTE;   // Byte 1       Datentyp *1
        Anzahl :INT;    // Byte 2+3     Länge der Variablen
        DBNR   :INT;    // Byte 4+5     DB-Nummer
        //SpBer1 :BYTE;   // Byte 6       Datentyp beim Auslesen *3 (Speicherbereich *2)
        //Null   :BYTE;   // Byte 7       Null beim Auslesen
        //SpBer2 :WORD;   // Byte 8+9     Speicherbereich Nummer beim Auslesen *3
        Zeiger :DWORD;  // Byte 6+7+8+9 Bereichszeiger_DW OR Adressword_DW (ShiftLinks 3)
      END_STRUCT;  
    
      (* ===================================================================================== 
       *1) Codierung der Datentypen ----------------------------------------------------------
        Hexadezimalcode Datentyp    Beschreibung
        b#16#00         NIL         Nullpointer
        b#16#01         BOOL        Bits
        b#16#02         BYTE        Bytes (8 Bits)
        b#16#03         CHAR        Zeichen (8 Bits)
        b#16#04         WORD        Wörter (16 Bits)
        b#16#05         INT         Ganzzahlen (16 Bits)
        b#16#06         DWORD       Wörter (32 Bits)
        b#16#07         DINT        Ganzzahlen (32 Bits)
        b#16#08         REAL        Gleitpunktzahlen (32 Bits)
        b#16#09         DATE        Datum
        b#16#0A         TIME_OF_DAY (TOD) Uhrzeit
        b#16#0B         TIME        Zeit
        b#16#0C         S5TIME      Datentyp S5TIME
        b#16#0E         DATE_AND_TIME (DT)Datum und Zeit (64 Bits)
        b#16#13         STRING      Zeichenkette
       *2) Codierung der Speicherbereiche ----------------------------------------------------
        Hexadezimalcode Bereich     Beschreibung
        b#16#80         P           Speicherbereich der Peripherie
        b#16#81         E           Speicherbereich der Eingänge
        b#16#82         A           Speicherbereich der Ausgänge
        b#16#83         M           Speicherbereich der Merker
        b#16#84         DB          Datenbaustein
        b#16#85         DI          Instanz-Datenbaustein
        b#16#86         L           Lokaldaten (L-Stack)
        b#16#87         V           Vorherige Lokaldaten
       *3) ANY-Format bei Parametertypen (zum auslesen von Information) ----------------------
        Hexadezimalcode Datentyp    Beschreibung
        b#16#17         BLOCK_FB    FB-Nummer
        b#16#18         BLOCK_FC    FC-Nummer
        b#16#19         BLOCK_DB    DB-Nummer
        b#16#1A         BLOCK_SDB   SDB-Nummer
        b#16#1C         COUNTER     Nummer des Zählers
        b#16#1D         TIMER       Nummer der Zeit
      ===================================================================================== *)
    END_VAR
    
    BEGIN
    //Init
    //----------------------------------------------------------------------------------------
      OK := TRUE; RET_V := 0; 
      (*
      //Zusammenstellen des Quellpointers
      sQuell.S7BYTE    := B#16#10;
      sQuell.DatTyp    := B#16#02;
      sQuell.Anzahl    := ByteCount;
      sQuell.DBNR      := Source_DB;
      //sQuell.Null      := B#16#0;
      sQuell.Zeiger    := DW#16#84000000 OR SHL (IN:= INT_TO_DWORD(Source_BY), N:=3); //eintragen
      *)
      //Zusammenstellen des Zielpointers
      sZiel.S7BYTE   := B#16#10;
      sZiel.DatTyp   := B#16#02;
      sZiel.Anzahl   := ByteCount;
      sZiel.DBNR     := Target_DB;
      //sZiel.Null     := B#16#0;
      sZiel.Zeiger   := DW#16#84000000 OR SHL (IN:= INT_TO_DWORD(Target_BY), N:=3); //eintragen
      
      //direktes kopieren des ANY Pointers
      QUELLE := Source;
      //ZIEL := Target;
      
    //----------------------------------------------------------------------------------------
    //Programm
    //----------------------------------------------------------------------------------------
      // Aufruf des SFC 20 fürs kopieren
      //RET_V := BLKMOV(SRCBLK := QUELLE ,DSTBLK := ZIEL);
      
      // Aufruf des SFC 21 fürs füllen  
      RET_V := FILL(BVAL := QUELLE, BLK := ZIEL);
                
      //Auslesen
      //SourceObj   := VON.SpBer1
      //SourceVal   := VON.SpBer2;
      //TargetObj   := NACH.SpBer1;
      //TargetVal   := NACH.SpBer2;
    
    //END ------------------------------------------------------------------------------
      IF RET_V <> 0 OR NOT OK THEN 
        UDF_Fill_TypeToDB := TRUE; 
      ELSE 
        UDF_Fill_TypeToDB := FALSE; 
      END_IF; 
      OK:=TRUE;
    END_FUNCTION
    Zitieren Zitieren SCL Frage  

  2. #2
    Registriert seit
    14.01.2015
    Beiträge
    592
    Danke
    171
    Erhielt 95 Danke für 87 Beiträge

    Standard

    was geht denn an welcher Stelle nicht, welche Steuerung, welche Programmiersoftware.

  3. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.172
    Danke
    129
    Erhielt 1.506 Danke für 1.107 Beiträge

    Standard

    Was für einen Rückgabewert bekommst du denn?
    Und was für Adressbereiche übergibst du dem Baustein?
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  4. #4
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    60
    Danke
    5
    Erhielt 2 Danke für 1 Beitrag

    Standard

    -32478 ist der Fehlercode. Aufgerufen wird der FC in einem FB, die Quelle ist ein INT, das Ziel ist ein Bereich über mehrere Strukturen.

    Code:
          CALL  "FILL"
           BVAL   :=#t.iZERO
           RET_VAL:=#t.iRETVAL
           BLK    :=P#DB3213.DBX250.0 BYTE 106
    Rufe ich den Fill direkt auf gehts. Die Parameter sind gleich...
    Geändert von s7Opa (26.07.2016 um 13:18 Uhr)

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.172
    Danke
    129
    Erhielt 1.506 Danke für 1.107 Beiträge

    Standard

    Wenn #t.iZERO eine Temp-Variable ist, dann ist die Bereichskennung DB (0x84) aber falsch die du dort eincodierst.

    8x22 sagt "Bereichslängenfehler beim Lesen eines Parameters"
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  6. #6
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    60
    Danke
    5
    Erhielt 2 Danke für 1 Beitrag

    Standard

    ...die Bereichskennung gilt nur für das Ziel (im SCL), oder? Der normale Fillaufruf kann es doch.

  7. #7
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    60
    Danke
    5
    Erhielt 2 Danke für 1 Beitrag

    Standard

    ...ahhh ich habs. Du warst nah dran. Der ANY für die Quelle muß auf eine double zeigen.


    (verdammte Filed PG Tastatur=
    Geändert von s7Opa (26.07.2016 um 13:38 Uhr)

  8. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.172
    Danke
    129
    Erhielt 1.506 Danke für 1.107 Beiträge

    Standard

    Der Parametertyp von BVAL ist aber ANY. Du kannst da zwar direkt eine Variable dranschreiben, ist und bleibt aber immer noch ein Any.
    Bzw. wahrscheinlich verbirgt dir der AWL-Editor, dass er daraus im Hintergrund einen Any-Zeiger bastelt.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  9. #9
    s7Opa ist offline Benutzer
    Themenstarter
    Registriert seit
    22.12.2015
    Beiträge
    60
    Danke
    5
    Erhielt 2 Danke für 1 Beitrag

    Standard

    ...ach was. Das scheint mir eher mit dem Aufruf bzw. bei der ANY-Übergabe des SFC21 in SCL zu liegen. Denn, nochmal, beim direkten Aufruf gehts.

    8x22 sagt "Bereichslängenfehler beim Lesen eines Parameters"
    Deine Fehlerbeschreibung war der Zünder...
    Geändert von s7Opa (26.07.2016 um 13:48 Uhr)

  10. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.172
    Danke
    129
    Erhielt 1.506 Danke für 1.107 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Du musst es mir ja nicht glauben wenn du nicht willst, es ist aber so. Der Parametertyp ist ANY.
    Du baust dir selber einen Bereichszeiger mit einer höchstwahrscheinlich falschen Bereichskennung, ob es so ist lässt sich nur definitiv sagen wenn wir auch den Bausteinaufruf und die Schnittstelle sehen. Für den SFC intern wären das bei deiner Konstruktion (der Parameter ist Variable im Temp-Bereich) imho die Vor-Vor-Vorgängerlokaldaten, und das geht nicht.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

Ähnliche Themen

  1. Step 7 SCL Editor Frage
    Von Sickone4 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 25.08.2014, 08:51
  2. Frage zu SCL
    Von petzi im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 30.09.2010, 10:03
  3. Eine Frage zu Variablen in SCL
    Von petzi im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 24.09.2010, 10:19
  4. Frage für SCL'er
    Von dinner4one im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.05.2008, 14:10
  5. Frage an SCL Experten
    Von dinner4one im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.05.2008, 10:03

Lesezeichen

Berechtigungen

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