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

Ergebnis 1 bis 7 von 7

Thema: Fehler bei Ausfürhung von MID in SCL

  1. #1
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.595
    Danke
    63
    Erhielt 261 Danke für 221 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe eine Anwendung in der ich einen Profibus-Scanner auslese.
    Je nach Barcodelänge benötige ich unterschiedliche Teile aus dem Barcode. Ich lese also die Barcodelänge aus und nutze den MID-Befehl, um den relevanten Teil zu lesen.

    Folgende Zeilen in SCL funktionieren:

    Code:
    IF SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.Barcodelaenge = 20 THEN
            tmpSendedaten:=MID(IN:=SCAN_COMMDB.Scanner[ScannerIndex].READ.Barcode,L:=9,P:=12);
        ELSIF SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.Barcodelaenge = 25 THEN
            tmpSendedaten:=MID(IN:=SCAN_COMMDB.Scanner[ScannerIndex].READ.Barcode,L:=9,P:=16);
        END_IF;
        SCAN_COMMDB.Scanner[ScannerIndex].Sendedaten:=tmpSendedaten;
    -SCAN_COMMDB.Scanner[ScannerIndex].Sendedaten ist als STRING[9] in einem Global-DB deklariert.
    -tmpSendedaten ist ebenfalls als STRING[9] deklariert und ist eine TEMP-Variable.

    Wenn ich den Code ohne den "Umweg" über tmpSendedaten schreibe und direkt die Variable SCAN_COMMDB.Scanner[ScannerIndex].Sendedaten mit dem MID-Befehl verwende, geht die CPU auf STOP.
    Warum?
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.
    Zitieren Zitieren Fehler bei Ausfürhung von MID in SCL  

  2. #2
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    OK ... und was war der Grund für den Stop (laut Diagnose) ?

  3. #3
    Registriert seit
    09.06.2008
    Beiträge
    138
    Danke
    16
    Erhielt 13 Danke für 13 Beiträge

    Standard

    Und wie sieht denn die Variablendeklaration aus?

  4. #4
    Tigerente1974 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.595
    Danke
    63
    Erhielt 261 Danke für 221 Beiträge

    Standard

    Zitat Zitat von Lupo Beitrag anzeigen
    OK ... und was war der Grund für den Stop (laut Diagnose) ?
    Das ist das Dumme dabei. Ich habe den Versuchsaufbau schon wieder abgebaut und war zunächst zufrieden dass es funktioniert. Die Meldung der Diagnose kann ich jetzt leider nicht mehr wiedergeben.

    Hier die Quelle für den DB:

    Code:
    DATA_BLOCK DB401
    TITLE =
    VERSION : 1.0
    
    STRUCT
        SCANNER:ARRAY[1..4]OF STRUCT     
            READ:STRUCT         // Lesedaten 
                HEADER:STRUCT   // Headerinformation
                    Lesetorstatus:BOOL:=FALSE;     //0: aus / 1: ein
                    NeuesErgebnis:BOOL:=FALSE;     //0: nein / 1: ja
                    ErgZustand:BOOL:=FALSE;   //0: Gutlesung / 1: NOREAD
                    WeitereErg:BOOL:=FALSE; //weitere Ergebnisse im Puffer
                    Pufferueberlauf:BOOL:=FALSE;   //0: nein / 1: ja
                    NeuesErg:BOOL:=FALSE;    //0->1: neues Ergebenis / 1->0: neues Ergebnis
                    ErgebnisToggle:BOOL:=FALSE;  //0->1: NOREAD / 1->0: NOREAD
                    WartenAufQuit:BOOL:=FALSE;     //0: Grundszustand / 1: Quittierung erwartet
                    Barcodelaenge:BYTE:=B#16#0;     
                END_STRUCT;
                Barcode:STRING[28]:='----------------------------';
            END_STRUCT; 
            Sendedaten:STRING[9]:='---------';
        END_STRUCT;   
    END_STRUCT;
    
    BEGIN
    
    END_DATA_BLOCK
    Und hier die Quelle für den FB:

    Code:
    FUNCTION SCAN_COMM:VOID
    VAR_INPUT
        ScannerIndex:INT;
    END_VAR
    VAR_IN_OUT
        Start:BOOL;
        DataQuit:BOOL;
    END_VAR
    VAR_TEMP
        Status_SFC20:INT;
        tmpSendedaten:STRING[9];
    END_VAR
    VAR_OUTPUT
        Lesetor:BOOL;
        DataReset:BOOL;
    END_VAR
         
    
    BEGIN
    
    
    // Daten von Scanner lesen
    "SCAN_COMMDB".SCANNER[ScannerIndex].READ.Barcode:='----------------------------';
    Lesetor := Start;
    
    SCAN_READ(INDEX:=ScannerIndex);
    
    IF SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.ErgZustand AND Start THEN
        Start:=FALSE;
        SCAN_COMMDB.Scanner[ScannerIndex].Sendedaten:='000000000';
    END_IF;
    DataReset:=SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.ErgZustand;
    
    IF SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.NeuesErgebnis AND NOT SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.ErgZustand AND Start THEN
        Start := FALSE;
        DataQuit := NOT DataQuit; // Quittierung toggeln
        SCAN_COMMDB.Scanner[ScannerIndex].Sendedaten:='---------';
        tmpSendedaten:='---------';
        IF SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.Barcodelaenge = 20 THEN
            tmpSendedaten:=MID(IN:=SCAN_COMMDB.Scanner[ScannerIndex].READ.Barcode,L:=9,P:=12);
        ELSIF SCAN_COMMDB.SCANNER[ScannerIndex].READ.HEADER.Barcodelaenge = 25 THEN
            tmpSendedaten:=MID(IN:=SCAN_COMMDB.Scanner[ScannerIndex].READ.Barcode,L:=9,P:=16);
        END_IF;
        SCAN_COMMDB.Scanner[ScannerIndex].Sendedaten:=tmpSendedaten;
    END_IF;
    
    END_FUNCTION
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  5. #5
    Tigerente1974 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.595
    Danke
    63
    Erhielt 261 Danke für 221 Beiträge

    Standard

    Grade nochmal mit PLCSIM gecheckt. In der Simulation bleibt die SPS in RUN.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.801
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Bei der Version bei der deine CPU in Stop geht wird dir der Lokaldatenspeicher in der CPU ausgehen. Was hast du denn für eine CPU-Typ?

    Aus welchen Gründen auch immer werden die String-Funktionen die SCL verwendet werden nicht direkt auf den DB-Daten ausgeführt, sondern diese erst auf lokale Strings kopiert und dann wieder zurückgeschrieben. Im ungünstigsten Fall kommen da zwei Temp-Strings mit der üblichen Stringlänge von 254 Zeichen zusammen, macht also mindestens 512 Bytes Lokaldatenverbrauch.
    Aus dem Grund wird es bei dir auch in Plcsim oder einer anderen größeren CPU laufen, denn dort ist der Lokaldatenstack dann ausreichend groß.

  7. #7
    Tigerente1974 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.595
    Danke
    63
    Erhielt 261 Danke für 221 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das war eine 313-2DP von Vipa. Wenn Du richtig liegst, ist mir nur nicht ganz klar warum es dann über den Umweg klappt. Allerdings habe ich mich bisher auch noch nicht so intensiv mit dem Speichermanagement befasst. Den Code brauche ich später in einer 317-2DP. Die dürfte auf jeden Fall mehr Lokaldatenspeicher haben. Werde das dann noch einmal testen.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

Ähnliche Themen

  1. Fehler bei AT Funktion in SCL
    Von Bensen83 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 01.08.2011, 09:55
  2. Fehler bei der Installation von Simocode ES
    Von Tommy1981 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.08.2010, 10:13
  3. MID-FC in SCL funktioniert nicht
    Von nobby_nobbs im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 19.03.2009, 02:14
  4. SCL MID Funktion
    Von Uli_87 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.02.2009, 10:32
  5. Fehler bei der Installation von WinCC
    Von tomberlin im Forum HMI
    Antworten: 2
    Letzter Beitrag: 20.08.2007, 15:00

Lesezeichen

Berechtigungen

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