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

Results 1 to 8 of 8

Thread: Scl

  1. #1
    Join Date
    04.09.2018
    Posts
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen,
    ich möchte einen Gesamtstückzähler OK / NOK mittels SCL realisieren.

    Das Programm habe ich wie folgt geschrieben, leider habe ich noch Probleme mit der Einbindung des Datenbausteins.

    Z18 Ausdruck nicht korrekt;

    Vielen Dank für eure Unterstützung!

    Code:
    FUNCTION FC2 : VOID
    
    VAR_TEMP
        Summe_OK: WORD;
        Summe_NOK: WORD;
        i: INT;    
        bte: STRING;
    END_VAR
    
    BEGIN
    Summe_OK := 0;
    
    FOR i := 1 TO 28 DO
        bte := i&'.OK'
        Summe_OK := DB170.DBW[bte];     
    END_FOR;
    DB2.DBW0 := Summe_OK;
    
    Summe_NOK := 0;
    FOR i := 1 TO 28 DO
        Summe_NOK := DB170.DBW[i.NOK];
        
    END_FOR;
    DB2.DBW2 := Summe_NOK;
    
                                            
    IF DB2.DBX4.0 = true THEN                                        
        
        FOR i := 1 TO 28 DO
            DB170.DBW[i.OK] := 0;
         END_FOR;
        FOR i := 1 TO 28 DO
            DB170.DBW[i.NOK] := 0;
         END_FOR;
        DB2.DBX4.0 := false;
            
     END_IF;
        
    END_FUNCTION
    Code:
    [DATA_BLOCK DB 170
    TITLE =
    VERSION : 0.1
    
      STRUCT  
       Stueckzaehler : ARRAY  [1 .. 50 ] OF STRUCT  
        Reset : BOOL ; 
        OK : INT ; 
        NOK : INT ; 
       END_STRUCT ; 
      END_STRUCT ; 
    BEGIN
       Stueckzaehler[1].Reset := FALSE; 
       Stueckzaehler[1].OK := 0; 
       Stueckzaehler[1].NOK := 0; 
       Stueckzaehler[2].Reset := FALSE; 
       Stueckzaehler[2].OK := 0; 
       Stueckzaehler[2].NOK := 0; 
       Stueckzaehler[3].Reset := FALSE; 
       Stueckzaehler[3].OK := 0; 
       Stueckzaehler[3].NOK := 0; 
       Stueckzaehler[4].Reset := FALSE; 
       Stueckzaehler[4].OK := 0; 
       Stueckzaehler[4].NOK := 0; 
       Stueckzaehler[5].Reset := FALSE; 
       Stueckzaehler[5].OK := 0; 
       Stueckzaehler[5].NOK := 0; 
       Stueckzaehler[6].Reset := FALSE; 
       Stueckzaehler[6].OK := 0; 
       Stueckzaehler[6].NOK := 0; 
       Stueckzaehler[7].Reset := FALSE; 
       Stueckzaehler[7].OK := 0; 
       Stueckzaehler[7].NOK := 0; 
       Stueckzaehler[8].Reset := FALSE; 
       Stueckzaehler[8].OK := 0; 
       Stueckzaehler[8].NOK := 0; 
       Stueckzaehler[9].Reset := FALSE; 
       Stueckzaehler[9].OK := 0; 
       Stueckzaehler[9].NOK := 0; 
       Stueckzaehler[10].Reset := FALSE; 
       Stueckzaehler[10].OK := 0; 
       Stueckzaehler[10].NOK := 0; 
       Stueckzaehler[11].Reset := FALSE; 
       Stueckzaehler[11].OK := 0; 
       Stueckzaehler[11].NOK := 0; 
       Stueckzaehler[12].Reset := FALSE; 
       Stueckzaehler[12].OK := 0; 
       Stueckzaehler[12].NOK := 0; 
       Stueckzaehler[13].Reset := FALSE; 
       Stueckzaehler[13].OK := 0; 
       Stueckzaehler[13].NOK := 0; 
       Stueckzaehler[14].Reset := FALSE; 
       Stueckzaehler[14].OK := 0; 
       Stueckzaehler[14].NOK := 0; 
       Stueckzaehler[15].Reset := FALSE; 
       Stueckzaehler[15].OK := 0; 
       Stueckzaehler[15].NOK := 0; 
       Stueckzaehler[16].Reset := FALSE; 
       Stueckzaehler[16].OK := 0; 
       Stueckzaehler[16].NOK := 0; 
       Stueckzaehler[17].Reset := FALSE; 
       Stueckzaehler[17].OK := 0; 
       Stueckzaehler[17].NOK := 0; 
       Stueckzaehler[18].Reset := FALSE; 
       Stueckzaehler[18].OK := 0; 
       Stueckzaehler[18].NOK := 0; 
       Stueckzaehler[19].Reset := FALSE; 
       Stueckzaehler[19].OK := 0; 
       Stueckzaehler[19].NOK := 0; 
       Stueckzaehler[20].Reset := FALSE; 
       Stueckzaehler[20].OK := 0; 
       Stueckzaehler[20].NOK := 0; 
       Stueckzaehler[21].Reset := FALSE; 
       Stueckzaehler[21].OK := 0; 
       Stueckzaehler[21].NOK := 0; 
       Stueckzaehler[22].Reset := FALSE; 
       Stueckzaehler[22].OK := 0; 
       Stueckzaehler[22].NOK := 0; 
       Stueckzaehler[23].Reset := FALSE; 
       Stueckzaehler[23].OK := 0; 
       Stueckzaehler[23].NOK := 0; 
       Stueckzaehler[24].Reset := FALSE; 
       Stueckzaehler[24].OK := 0; 
       Stueckzaehler[24].NOK := 0; 
       Stueckzaehler[25].Reset := FALSE; 
       Stueckzaehler[25].OK := 0; 
       Stueckzaehler[25].NOK := 0; 
       Stueckzaehler[26].Reset := FALSE; 
       Stueckzaehler[26].OK := 0; 
       Stueckzaehler[26].NOK := 0; 
       Stueckzaehler[27].Reset := FALSE; 
       Stueckzaehler[27].OK := 0; 
       Stueckzaehler[27].NOK := 0; 
       Stueckzaehler[28].Reset := FALSE; 
       Stueckzaehler[28].OK := 0; 
       Stueckzaehler[28].NOK := 0; 
       Stueckzaehler[29].Reset := FALSE; 
       Stueckzaehler[29].OK := 0; 
       Stueckzaehler[29].NOK := 0; 
       Stueckzaehler[30].Reset := FALSE; 
       Stueckzaehler[30].OK := 0; 
       Stueckzaehler[30].NOK := 0; 
       Stueckzaehler[31].Reset := FALSE; 
       Stueckzaehler[31].OK := 0; 
       Stueckzaehler[31].NOK := 0; 
       Stueckzaehler[32].Reset := FALSE; 
       Stueckzaehler[32].OK := 0; 
       Stueckzaehler[32].NOK := 0; 
       Stueckzaehler[33].Reset := FALSE; 
       Stueckzaehler[33].OK := 0; 
       Stueckzaehler[33].NOK := 0; 
       Stueckzaehler[34].Reset := FALSE; 
       Stueckzaehler[34].OK := 0; 
       Stueckzaehler[34].NOK := 0; 
       Stueckzaehler[35].Reset := FALSE; 
       Stueckzaehler[35].OK := 0; 
       Stueckzaehler[35].NOK := 0; 
       Stueckzaehler[36].Reset := FALSE; 
       Stueckzaehler[36].OK := 0; 
       Stueckzaehler[36].NOK := 0; 
       Stueckzaehler[37].Reset := FALSE; 
       Stueckzaehler[37].OK := 0; 
       Stueckzaehler[37].NOK := 0; 
       Stueckzaehler[38].Reset := FALSE; 
       Stueckzaehler[38].OK := 0; 
       Stueckzaehler[38].NOK := 0; 
       Stueckzaehler[39].Reset := FALSE; 
       Stueckzaehler[39].OK := 0; 
       Stueckzaehler[39].NOK := 0; 
       Stueckzaehler[40].Reset := FALSE; 
       Stueckzaehler[40].OK := 0; 
       Stueckzaehler[40].NOK := 0; 
       Stueckzaehler[41].Reset := FALSE; 
       Stueckzaehler[41].OK := 0; 
       Stueckzaehler[41].NOK := 0; 
       Stueckzaehler[42].Reset := FALSE; 
       Stueckzaehler[42].OK := 0; 
       Stueckzaehler[42].NOK := 0; 
       Stueckzaehler[43].Reset := FALSE; 
       Stueckzaehler[43].OK := 0; 
       Stueckzaehler[43].NOK := 0; 
       Stueckzaehler[44].Reset := FALSE; 
       Stueckzaehler[44].OK := 0; 
       Stueckzaehler[44].NOK := 0; 
       Stueckzaehler[45].Reset := FALSE; 
       Stueckzaehler[45].OK := 0; 
       Stueckzaehler[45].NOK := 0; 
       Stueckzaehler[46].Reset := FALSE; 
       Stueckzaehler[46].OK := 0; 
       Stueckzaehler[46].NOK := 0; 
       Stueckzaehler[47].Reset := FALSE; 
       Stueckzaehler[47].OK := 0; 
       Stueckzaehler[47].NOK := 0; 
       Stueckzaehler[48].Reset := FALSE; 
       Stueckzaehler[48].OK := 0; 
       Stueckzaehler[48].NOK := 0; 
       Stueckzaehler[49].Reset := FALSE; 
       Stueckzaehler[49].OK := 0; 
       Stueckzaehler[49].NOK := 0; 
       Stueckzaehler[50].Reset := FALSE; 
       Stueckzaehler[50].OK := 0; 
       Stueckzaehler[50].NOK := 0; 
    END_DATA_BLOCK
    Last edited by Markus.ki; 22.11.2018 at 13:01.
    Reply With Quote Reply With Quote Answered: SCL - Zähler Einzelergebnissen OK NOK soll die Summe aller OK gebildet  

  2. "
    Quote Originally Posted by Markus.ki View Post
    leider habe ich noch Probleme mit der Einbindung des Datenbausteins.
    Nee, das geht so überhaupt nicht. Weder von der Syntax her, noch von der Logik.
    Besser:
    Code:
    VAR_TEMP
        Summe_OK: INT;
        Summe_NOK: INT;
        i: INT;
    END_VAR
    
    BEGIN
    
    Summe_OK := 0;
    Summe_NOK := 0;
    
    FOR i := 1 TO 28 DO
        Summe_OK  := Summe_OK  + "DB170".Stueckzaehler[i].OK;
        Summe_NOK := Summe_NOK + "DB170".Stueckzaehler[i].NOK;
    END_FOR;
    "DB2".Summe_OK  := Summe_OK;     //(DB2.DBW2)
    "DB2".Summe_NOK := Summe_NOK;    //das muß ein anderes DBW sein, DBW2 wäre sinnfrei
    
    IF DB2.DX4.0 THEN                //besser den symbolischen Name des DBX4.0 hinschreiben!
        FOR i := 1 TO 28 DO
            "DB170".Stueckzaehler[i].OK := 0;
            "DB170".Stueckzaehler[i].NOK := 0;
        END_FOR;
        DB2.DX4.0 := FALSE;          //besser den symbolischen Name des DBX4.0 hinschreiben!
    END_IF;
    Welchen symbolischen Name haben Deine DB170 und DB2? Den müsstest Du anstatt dem "DB170" und "DB2" hinschreiben.

    Siehe in der Hilfe zu STEP7:
    Inhalt > Aufruf von Hilfen zu Optionspaketen > Bausteine programmieren mit S7-SCL > Globale Daten > Datenbausteine > Übersicht der Datenbausteine
    und die nachfolgenden 3 Kapitel zu absoluter, indizierter und strukturierter Zugriff auf Datenbausteine

    Harald"


  3. #2
    Join Date
    26.03.2013
    Posts
    101
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Default

    Hi,

    also wenn ich das richtig blicke was du da vor hast (und das ist reichlich schwierig bei deinem Programmierstil ) dann hast du trotzdem die Indizierung nicht korrekt gemacht

    DB170.DBW[i.NOK] := 0;


    müsste wenn dann heißen

    DB170.DBW[i].NOK := 0;

    auch hier bin ich mir unsicher ob SCL das so kann. C und C# sicherlich, aber SCL?? Hab ich ehrlich gesagt noch nie probiert...
    bte := i&'.OK'
    Summe_OK := DB170.DBW[bte];

  4. Folgender Benutzer sagt Danke zu soundmachine123 für den nützlichen Beitrag:

    Markus.ki (22.11.2018)

  5. #3
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    15,182
    Danke
    1,243
    Erhielt 4,469 Danke für 3,603 Beiträge

    Default

    Quote Originally Posted by Markus.ki View Post
    leider habe ich noch Probleme mit der Einbindung des Datenbausteins.
    Nee, das geht so überhaupt nicht. Weder von der Syntax her, noch von der Logik.
    Besser:
    Code:
    VAR_TEMP
        Summe_OK: INT;
        Summe_NOK: INT;
        i: INT;
    END_VAR
    
    BEGIN
    
    Summe_OK := 0;
    Summe_NOK := 0;
    
    FOR i := 1 TO 28 DO
        Summe_OK  := Summe_OK  + "DB170".Stueckzaehler[i].OK;
        Summe_NOK := Summe_NOK + "DB170".Stueckzaehler[i].NOK;
    END_FOR;
    "DB2".Summe_OK  := Summe_OK;     //(DB2.DBW2)
    "DB2".Summe_NOK := Summe_NOK;    //das muß ein anderes DBW sein, DBW2 wäre sinnfrei
    
    IF DB2.DX4.0 THEN                //besser den symbolischen Name des DBX4.0 hinschreiben!
        FOR i := 1 TO 28 DO
            "DB170".Stueckzaehler[i].OK := 0;
            "DB170".Stueckzaehler[i].NOK := 0;
        END_FOR;
        DB2.DX4.0 := FALSE;          //besser den symbolischen Name des DBX4.0 hinschreiben!
    END_IF;
    Welchen symbolischen Name haben Deine DB170 und DB2? Den müsstest Du anstatt dem "DB170" und "DB2" hinschreiben.

    Siehe in der Hilfe zu STEP7:
    Inhalt > Aufruf von Hilfen zu Optionspaketen > Bausteine programmieren mit S7-SCL > Globale Daten > Datenbausteine > Übersicht der Datenbausteine
    und die nachfolgenden 3 Kapitel zu absoluter, indizierter und strukturierter Zugriff auf Datenbausteine

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Markus.ki (22.11.2018)

  7. #4
    Join Date
    29.03.2004
    Posts
    7,077
    Danke
    164
    Erhielt 2,136 Danke für 1,524 Beiträge

    Default

    "OK" ist in SCL ein Schlüsselwort und darf als Bezeichner nicht verwendet werden. Das müsste dann auch noch z.B. in "AnzahlOK" umbenannt werden.

  8. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Markus.ki (22.11.2018)

  9. #5
    Join Date
    03.12.2008
    Posts
    928
    Danke
    213
    Erhielt 240 Danke für 150 Beiträge

    Default

    Hallo
    Vielleicht könntest du ja erst mal beschreiben was das genau werden soll.

    Also ich interpretiere das so:
    Aus 28 Einzelergebnissen OK soll die Summe aller OK gebildet werden und im DB2.DBW0 landen.
    Aus 28 Einzelergebnissen NOK soll die Summe aller NOK gebildet werden und im DB2.DBW2 landen.

    Hier sollen die Einzelzähler genullt werden.
    Code:
    IF DB2.DBX4.0 = true THEN                                        
        
        FOR i := 1 TO 28 DO
            DB170.DBW[i.OK] := 0;
         END_FOR;
        FOR i := 1 TO 28 DO
            DB170.DBW[i.NOK] := 0;
         END_FOR;
        DB2.DBX4.0 := false;
            
     END_IF;
    Verstehe ich das soweit richtig?


    PS: Ein aussagekräftiger Thread-Titel kann auch nie was schaden.

  10. Folgender Benutzer sagt Danke zu Paul für den nützlichen Beitrag:

    Markus.ki (22.11.2018)

  11. #6
    Join Date
    14.01.2015
    Posts
    5,435
    Danke
    1,195
    Erhielt 1,168 Danke für 870 Beiträge

    Default

    Ich würde auch alle fixen Datentypen wie "DB2.DBX4.0" symbolisch eingeben. Dann hat man den großen Vorteil,
    verschieben sich später diese fixen Eingaben durch Änderungen im entsprechenden FB, so kompiliert man das
    Programm einmal komplett neu ( MAK Datei ) und die Adressänderung wird automatisch angepasst.
    Mit Grüßen

    Gesendet von meinem Nokia 6310

  12. Folgender Benutzer sagt Danke zu DeltaMikeAir für den nützlichen Beitrag:

    Markus.ki (22.11.2018)

  13. #7
    Markus.ki is offline Neuer Benutzer
    Themenstarter
    Join Date
    04.09.2018
    Posts
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Default

    so jetzt hab ich alles mal angepasst, und symbolisch gearbeitet

    Beim Übersetzen schonmal 0 Fehler , dafür schonmal allen vielen Dank.

    Code:
    FUNCTION FC2 : VOID
    //VERSION : 0.2
    
    VAR_TEMP
        Summe_OK: INT;
        Summe_NOK: INT;
        i: INT;
    END_VAR
    BEGIN
    Summe_OK := 0;
    Summe_NOK := 0;
     
    //NETWORK Stückzähler
    IF "Counters".Start THEN
    FOR i := 1 TO 28 DO
        Summe_OK  := Summe_OK  + "ST3 - Part Counter".Stueckzaehler[i].PartOK;
        Summe_NOK := Summe_NOK + "ST3 - Part Counter".Stueckzaehler[i].PartNOK;
    END_FOR;
        "Counters".START := FALSE;  
    "Counters".Summe_OK  := Summe_OK;    
    "Counters".Summe_NOK := Summe_NOK;
    END_IF;
    
    //NETWORK Reset Alle Zähler
    IF "Counters".RESET_COUNTER_ALL THEN                
        FOR i := 1 TO 28 DO
            "ST3 - Part Counter".Stueckzaehler[i].PartOK := 0;
            "ST3 - Part Counter".Stueckzaehler[i].PartNOK := 0;
        END_FOR;
        "Counters".RESET_COUNTER_ALL := FALSE;          
        
    END_IF;
      
     END_FUNCTION
    Last edited by Markus.ki; 22.11.2018 at 13:25.

  14. #8
    Markus.ki is offline Neuer Benutzer
    Themenstarter
    Join Date
    04.09.2018
    Posts
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja genau so soll die Funktion sein

Similar Threads

  1. Replies: 1
    Last Post: 23.01.2012, 17:06
  2. SCL: FB Aufruf unter SCL mit Variablen DB
    By ThorstenK in forum Programmierstrategien
    Replies: 32
    Last Post: 10.02.2011, 19:15
  3. Replies: 4
    Last Post: 07.10.2006, 00:34
  4. SCL - AWL Kommando "SRD" in SCL
    By Floh in forum Simatic
    Replies: 4
    Last Post: 09.06.2006, 09:37
  5. Brauche Hilfe bei SCL.SFC Aufrufen in SCL
    By Gerold in forum Simatic
    Replies: 10
    Last Post: 06.10.2005, 10:47

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •