Step 7 Scl

Markus.ki

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL - Zähler Einzelergebnissen OK NOK soll die Summe aller OK gebildet

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
 
Zuletzt bearbeitet:
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.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];
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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: [COLOR="#0000FF"]INT[/COLOR];
    Summe_NOK: [COLOR="#0000FF"]INT[/COLOR];
    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;     [COLOR="#008000"]//(DB2.DBW2)[/COLOR]
"DB2".Summe_NOK := Summe_NOK;    [COLOR="#008000"]//das muß ein anderes DBW sein, DBW2 wäre sinnfrei[/COLOR]

IF DB2.DX4.0 THEN                [COLOR="#008000"]//besser den symbolischen Name des DBX4.0 hinschreiben![/COLOR]
    FOR i := 1 TO 28 DO
        "DB170".Stueckzaehler[i].OK := 0;
        "DB170".Stueckzaehler[i].NOK := 0;
    END_FOR;
    DB2.DX4.0 := FALSE;          [COLOR="#008000"]//besser den symbolischen Name des DBX4.0 hinschreiben![/COLOR]
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zuletzt bearbeitet:
Zurück
Oben