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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: IF Abfrage in SCL

  1. #1
    Registriert seit
    03.12.2004
    Beiträge
    92
    Danke
    13
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe eine Problem mit eine If-Abfrage:

    Code:
    FUNCTION FC113 : VOID
    
    VAR_TEMP
        // temporäre Variablen
        I:INT;                              // Schmiervariable in For-Schleifen
        J:INT;                              // Schmiervariable in For-Schleifen
    END_VAR 
    VAR_INPUT
        // INPUT Variablen deklarieren
        bPositionierung_starten:BOOL;       // Startbefehl um die Posiitonierung zu starten
        iRollendurchmesser:INT;             // Rollendurchmesser des Jumbos im Abwickler
        iDW_Soll:INT;                       // Datenwort, wo die Positionsollwerte in den DBs stehen
        iDB_Zaehlerkarte:BLOCK_DB;          // Datenbaustein Zählerkarte
        iDW_Zaehlerkarte:INT;               // Datenwort Zählerkarte, wo die Position in den DBs stehen
        
    END_VAR
    VAR_OUTPUT
        // OUTPUT Variablen deklarieren
        bRausfahren:BOOL;                   // Motor muss rausfahren
        bReinfahren:BOOL;                   // Motor muss reinfahren
    END_VAR
    VAR_IN_OUT
        // IN_OUTPUT Variablen deklarieren
        bPosition_OK:BOOL;                  // Positionierung abgeschlossen, POS_OK
        bPositionierung_REIN:BOOL;          // Motor ist aktuell am Positionieren / REINfahren, POS_ON
        bPositionierung_RAUS:BOOL;          // Motor ist aktuell am Positionieren / RAUSfahren, POS_ON
    END_VAR
    
    // Anweisungsteil
    
        CASE iRollendurchmesser OF
        100..150:          
            IF bPositionierung_starten = true THEN
                
                // Richtstab reinfahren starten
                IF bPositionierung_REIN = false AND DB41.DW[iDW_Soll] > iDB_Zaehlerkarte.DW[iDW_Zaehlerkarte] THEN
                    bReinfahren := true;
                    bPositionierung_REIN := true;
                END_IF;
                // Richtstab reinfahren Position erreicht
                IF bPositionierung_REIN = true AND DB41.DW&#91;iDW_Soll&#93; <= iDB_Zaehlerkarte.DW&#91;iDW_Zaehlerkarte&#93; THEN  
                    bReinfahren &#58;= false;
                    bPositionierung_REIN &#58;= false;
                    bPosition_OK &#58;= true;
                END_IF;
                
                // Richtstab rausfahren starten
                IF DB41.DW&#91;iDW_Soll&#93; < iDB_Zaehlerkarte.DW&#91;iDW_Zaehlerkarte&#93; AND bPositionierung_RAUS = false THEN
                    bRausfahren &#58;= true;
                    bPositionierung_RAUS &#58;= true;
                END_IF;
                // Richtstab rausfahren Position erreicht
                IF bPositionierung_RAUS = true AND DB41.DW&#91;iDW_Soll&#93; >= iDB_Zaehlerkarte.DW&#91;iDW_Zaehlerkarte&#93; THEN
                    bRausfahren &#58;= false;
                    bPositionierung_RAUS &#58;= false;
                    bPosition_OK &#58;= true;
                END_IF;
       
                
                
            END_IF;
    
            
        80..99&#58;
            ;
            
        60..79&#58;
            
            ;
        40..59&#58;
            
            ;
        1..39&#58;
            
            ;
    
      ELSE&#58;
        // Anweisungen_ELSE
        ;
      END_CASE;
      
    END_FUNCTION
    Bei diesen Code bekomme ich in allen IF-Anweisungen der inneren IF-Schleifen im CASE folgende Fehlermeldungen:
    ==> Unzulässige Operandentypen
    ==> Ausdruck muss von Datentyp BOOL sein

    Die Datenwörter in den DBs sind alle in INT deklariert.

    vielen Dank im voraus
    Frank
    Zitieren Zitieren IF Abfrage in SCL  

  2. #2
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard

    Hallo, probier es mal mit Klammern:



    // Richtstab reinfahren starten
    IF (bPositionierung_REIN = false) AND (DB41.DW[iDW_Soll] > iDB_Zaehlerkarte.DW[iDW_Zaehlerkarte]) THEN
    bReinfahren := true;
    bPositionierung_REIN := true;
    END_IF;

  3. #3
    Anonymous Gast

    Standard

    Klappt mit Klammern leider auch nicht.

    Habe aber folgendes experementel ermittelt:

    IF bPositionierung_REIN = false AND iDB_Zaehlerkarte.DW[iDW_Zaehlerkarte] <> DB41.DW[iDW_Soll] THEN
    bReinfahren := true;
    bPositionierung_REIN := true;
    END_IF;

    mit "<>" klappt es mit "<" nicht ....

  4. #4
    fbeine ist offline Benutzer
    Themenstarter
    Registriert seit
    03.12.2004
    Beiträge
    92
    Danke
    13
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ups, hatte mich nicht angemeldet ..., der Gast war meine Wenigkeit

    gruss Frank

  5. #5
    Anonymous Gast

    Standard

    Du musst um einen DB per Variable aufzurufen die Funktion WORD_TO_BLOCK_DB nutzen und für die DB brauchst du eine Word Variable.

    Des weiteren beginne generell eine IF Variable mit
    IF NOT bPositionierung_REIN AND (

    und nicht

    IF bPositionierung_REIN = true

    Ich hoffe ich konnte helfen !!!

    Gruss
    Thomas

  6. #6
    fbeine ist offline Benutzer
    Themenstarter
    Registriert seit
    03.12.2004
    Beiträge
    92
    Danke
    13
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Thomas,

    wo muss ich denn die BLOCK_DB deklarieren ?
    wie müsste denn der Code aussehen ?

    ich habe folgendes getestet, ohne erfolg ...

    VAR_INPUT
    // INPUT Variablen deklarieren
    bPositionierung_starten:BOOL; // Startbefehl um die Posiitonierung zu starten
    iRollendurchmesser:INT; // Rollendurchmesser des Jumbos im Abwickler
    iDW_Soll:INT; // Datenwort, wo die Positionsollwerte in den DBs stehen
    iDB_Zaehlerkarte:BLOCK_DB; // Datenbaustein Zählerkarte INT
    wDB_Zaehlerkarte:WORD; // Datenbaustein Zählerkarte WORD
    iDW_Zaehlerkarte:INT; // Datenwort Zählerkarte, wo die Position in den DBs stehen
    END_VAR

    VAR_IN_OUT
    // IN_OUTPUT Variablen deklarieren
    bPosition_OK:BOOL; // Positionierung abgeschlossen, POS_OK
    bPositionierung_REIN:BOOL; // Motor ist aktuell am Positionieren / REINfahren, POS_ON
    bPositionierung_RAUS:BOOL; // Motor ist aktuell am Positionieren / RAUSfahren, POS_ON
    BLOCK_DB_Zaehlerkarte:BLOCK_DB;
    END_VAR



    // Anweisungsteil
    BLOCK_DB_Zaehlerkarte := WORD_TO_BLOCK_DB(wDB_Zaehlerkarte);
    CASE iRollendurchmesser OF
    100..150:
    IF bPositionierung_starten = true THEN

    // Richtstab reinfahren starten
    // IF bPositionierung_REIN = false AND iDB_Zaehlerkarte.DW[iDW_Zaehlerkarte] < DB41.DW[iDW_Soll] THEN
    IF bPositionierung_REIN = false AND BLOCK_DB_Zaehlerkarte.DW[iDW_Zaehlerkarte] < DB41.DW[iDW_Soll] THEN
    bReinfahren := true;
    bPositionierung_REIN := true;


    gruss Frank

  7. #7
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Block_DB geht nur so zu verwenden:

    Beispiel für Datentypen für Parameter
    Code:
    FUNCTION ABSTAND &#58; REAL
    VAR_INPUT
        MeinDB &#58; BLOCK_DB;
        ZEIT &#58; TIMER ;
    END_VAR
    VAR_TEMP
        INDEX &#58; INT ;
    END_VAR
    BEGIN
    
    ABSTAND &#58;= DWORD_TO_REAL&#40;MeinDB.DD4&#41; ;
    
    END_FUNCTION
    Du mußt die DB-Nummer übergeben und WORD_TO_BLOCK_DB benutzen:

    Code:
    VAR_INPUT
      // Eingangsparameter
      DB_Nr&#58; INT;
      StartP&#58; INT;
      Anzahl&#58; INT;
     
    END_VAR
    
    VAR_IN_OUT
      // Durchgangsparameter
    END_VAR
    
    VAR_OUTPUT
     // Ausgangsparameter
      MAXIMUM&#58; DINT;
    END_VAR
    
    VAR_TEMP
      // temporäre Variablen
      Wert&#58; DINT;
      I&#58; INT;
    END_VAR
    
    BEGIN
      // Anweisungsteil
      MAXIMUM &#58;= 0;
     
       FOR I &#58;= 1 TO Anzahl DO
           Wert &#58;= DWORD_TO_DINT&#40;WORD_TO_BLOCK_DB&#40;INT_TO_WORD&#40;DB_Nr&#41;&#41;.DD&#91;StartP+&#40;&#40;I-1&#41;*4&#41;&#93;&#41;; 
          
           IF MAXIMUM < Wert THEN MAXIMUM &#58;= Wert; END_IF;          
    END_FOR;
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. #8
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Mit Franks Bsp. könnte es dann so aussehen:

    Code:
                // Richtstab reinfahren starten 
                IF NOT bPositionierung_REIN AND WORD_TO_INT&#40;DB41.DW&#91;iDW_Soll&#93;&#41; > WORD_TO_INT&#40;iDB_Zaehlerkarte.DW&#91;iDW_Zaehlerkarte&#93;&#41; THEN 
                    bReinfahren &#58;= true; 
                    bPositionierung_REIN &#58;= true; 
                END_IF;
    SCL weiß leider nicht dass es sich um Intergerwerte handelt. Daher ist ohne Konvertierung "WORD_TO_INT" der Befehl "<>" zulässig, andere Vergleichsbefehle hingegen nicht.


    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  9. #9
    fbeine ist offline Benutzer
    Themenstarter
    Registriert seit
    03.12.2004
    Beiträge
    92
    Danke
    13
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Guten Morgen alle zusammen,

    kann sein, dass ich mich zu dumm anstelle, aber ich bekomme es nicht zum laufen.
    Ich habe es folgendermassen versucht:

    Code:
    VAR_INPUT
        // INPUT Variablen deklarieren
        bPositionierung_starten&#58;BOOL;       // Startbefehl um die Posiitonierung zu starten
        iRollendurchmesser&#58;INT;             // Rollendurchmesser des Jumbos im Abwickler
        iDW_Soll&#58;INT;                       // Datenwort, wo die Positionsollwerte in den DBs stehen
        iDB_Zaehlerkarte&#58;INT;               // Datenbaustein Zählerkarte INT
        iDW_Zaehlerkarte&#58;INT;               // Datenwort Zählerkarte, wo die Position in den DBs stehen
    END_VAR
    
    
    // Richtstab reinfahren starten 
                IF NOT bPositionierung_REIN AND DB41.DW&#91;iDW_Soll&#93; > WORD_TO_BLOCK_DB&#40;INT_TO_WORD&#40;iDB_Zaehlerkarte&#41;&#41;.DW&#91;iDW_Zaehlerkarte&#93; THEN 
                    bReinfahren &#58;= true; 
                    bPositionierung_REIN &#58;= true; 
                END_IF;
    aber es kommen 2 Fehlermeldungen:
    ==> Unzulässige Operandentypen
    ==> Der Ausdruck muss von Typ BOOL sein

    vieleicht habt ihr ja noch eine zündende Idee ....

    Gruss Frank

  10. #10
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also nochmal: probier es mal mit Klammern.

    // Richtstab reinfahren starten
    IF NOT bPositionierung_REIN AND ( DB41.DW[iDW_Soll] > WORD_TO_BLOCK_DB(INT_TO_WORD(iDB_Zaehlerkarte)).DW[iDW_Zaehlerkarte] ) THEN
    bReinfahren := true;
    bPositionierung_REIN := true;
    END_IF;

    SCL ist PASCAL für S7 !!!

Ähnliche Themen

  1. Abfrage Bit und if Abfrage
    Von Move im Forum HMI
    Antworten: 5
    Letzter Beitrag: 11.05.2011, 21:58
  2. <> Abfrage
    Von husox81 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.04.2010, 10:18
  3. if- Abfrage
    Von Hannes im Forum Sonstige Steuerungen
    Antworten: 0
    Letzter Beitrag: 08.07.2009, 16:45
  4. abfrage SQL-Datenbank
    Von mertens2 im Forum PC- und Netzwerktechnik
    Antworten: 12
    Letzter Beitrag: 14.11.2008, 13:39
  5. bcd abfrage
    Von Hobby programmierer im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 26.05.2005, 22:51

Lesezeichen

Berechtigungen

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