Step 7 SCL vergleichen

Zuletzt bearbeitet:
Also ich glaube du verrennst dich ein bisschen mit den Schleifen..

Du hast eine Zeichenfolge von 2 bis 17, in dieser sollst du suchen wie viele Zahlen zwischen 0 bis 5 sich in dieser befinden und dann addieren wie oft welche Zahl vor kommt? Ist die Annahme richtig?

Ich hab das zB jetzt mit diesem Aufbau gelöst:
Code:
IF Start THEN
    FOR .. DO
        // Hier darf dein Code stehen
        IF .. THEN
            // Hier darf dein Code stehen
        END_IF;
    END_FOR;
    Start:= FALSE;
END_IF;
Ja genau richtig. In wiefern ändert dein Code etwas?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach, das hatte ich vor Jahren schon mal gefragt .... ohne befriedigende Antwort...
Also "flüchtiger DB-Bereich" meint "DB im Arbeitsspeicher"?
Kann man im Programm auch auf "nicht flüchtige DB-Bereiche" zugreifen (...)
 
Muss ich nicht eigentlich wenn ich etwas vergleichen will = = verwenden?
Nein sondern "=" hier mal eine Übersicht der Operatoren. TIA unterringelt dir das zweite = aber normalerweise.

**PotenzArithmetisch
+unäres Plus (Vorzeichen)Arithmetisch
-unäres Minus (Vorzeichen)Arithmetisch
NOTNegationLogisch
*MultiplikationArithmetisch
/DivisionArithmetisch
MODModulo-FunktionArithmetisch
DIVGanzzahlige DivisionArithmetisch
+AdditionArithmetisch
-SubtraktionArithmetisch
<kleiner alsVergleicher
>größer alsVergleicher
<=kleiner gleichVergleicher
>=größer gleichVergleicher
=GleichheitVergleicher
<>UngleichheitVergleicher
AND; &UNDLogisch
XORExklusiv-ODERLogisch
ORODERLogisch
: =ZuweisungZuweisung
 
Warum sollte der Bereichslängenfehler-Diagnosepuffer-Eintrag einen Unterschied zwischen remanentem und nichtremanentem DB-Bereich machen?
Aber genug OT. Außer Siemens weiß das wohl niemand, was mit "Flüchtiger DB-Bereich" wirklich gemeint ist...
 
Hallo Ricardos,

vielleicht hilft es mal das ganze einfach runterzuschreiben und wenn das tut schauen wie der Code sich eleganter bewerkstelligen lässt.

Gruss

Code:
BEGIN
    //Array of Byte nach Array of Char
    FOR #i := 0 TO 17 DO
        "SpielDB".gewandelt[#i] := BYTE_TO_CHAR("SpielDB".Ergebniss[#i]);
    END_FOR;
   
   
   
    IF #Start THEN
        //Zähler nullen
        #"Zähler"[0]  := 0;
        #"Zähler"[1]  := 0;
        #"Zähler"[2]  := 0;
        #"Zähler"[3]  := 0;
        #"Zähler"[4] := 0;
        #"Zähler"[5]  := 0;
        // Auswerten des Arrays
        FOR #j := 0 TO 17 DO
            IF "SpielDB".gewandelt[#j] = '0' THEN
                #"Zähler"[0] := #"Zähler"[0] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '1' THEN
                #"Zähler"[1] := #"Zähler"[1] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '2' THEN
                #"Zähler"[2] := #"Zähler"[2] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '3' THEN
                #"Zähler"[3] := #"Zähler"[3] + 1;
            ELSIF "SpielDB".gewandelt[#j] = #CHAR_4 THEN
                #"Zähler"[4] := #"Zähler"[4] + 1;
            ELSIF "SpielDB".gewandelt[#j] = #CHAR_5 THEN
                #"Zähler"[5] := #"Zähler"[5] + 1;
            END_IF;
        END_FOR;
        #Start := FALSE;
    END_IF;
END_FUNCTION_BLOCK
 
Ja genau richtig. In wiefern ändert dein Code etwas?
Ich hab nur eine Schleife verwendet wie du siehst, das war ja der Hinweis an dich durchzudenken wie du es einfach(er) lösen könntest.


Hallo Ricardos,

vielleicht hilft es mal das ganze einfach runterzuschreiben und wenn das tut schauen wie der Code sich eleganter bewerkstelligen lässt.

Gruss

Code:
BEGIN
    //Array of Byte nach Array of Char
    FOR #i := 0 TO 17 DO
        "SpielDB".gewandelt[#i] := BYTE_TO_CHAR("SpielDB".Ergebniss[#i]);
    END_FOR;
 
 
 
    IF #Start THEN
        //Zähler nullen
        #"Zähler"[0]  := 0;
        #"Zähler"[1]  := 0;
        #"Zähler"[2]  := 0;
        #"Zähler"[3]  := 0;
        #"Zähler"[4] := 0;
        #"Zähler"[5]  := 0;
        // Auswerten des Arrays
        FOR #j := 0 TO 17 DO
            IF "SpielDB".gewandelt[#j] = '0' THEN
                #"Zähler"[0] := #"Zähler"[0] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '1' THEN
                #"Zähler"[1] := #"Zähler"[1] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '2' THEN
                #"Zähler"[2] := #"Zähler"[2] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '3' THEN
                #"Zähler"[3] := #"Zähler"[3] + 1;
            ELSIF "SpielDB".gewandelt[#j] = #CHAR_4 THEN
                #"Zähler"[4] := #"Zähler"[4] + 1;
            ELSIF "SpielDB".gewandelt[#j] = #CHAR_5 THEN
                #"Zähler"[5] := #"Zähler"[5] + 1;
            END_IF;
        END_FOR;
        #Start := FALSE;
    END_IF;
END_FUNCTION_BLOCK

Da hatte jemand den gleichen Gedanken ;)

Code:
IF #StartEval THEN
    FOR #i := 2 TO 17 DO
        IF #DAT[#i] = #QR_CODE_0 THEN
            #CNT[0] := #CNT[0] + 1;
        ELSIF #DAT[#i] = #QR_CODE_1 THEN
            #CNT[1] := #CNT[1] + 1;
        ELSIF #DAT[#i] = #QR_CODE_2 THEN
            #CNT[2] := #CNT[2] + 1;
        ELSIF #DAT[#i] = #QR_CODE_3 THEN
            #CNT[3] := #CNT[3] + 1;
        ELSIF #DAT[#i] = #QR_CODE_4 THEN
            #CNT[4] := #CNT[4] + 1;
        ELSIF #DAT[#i] = #QR_CODE_5 THEN
            #CNT[5] := #CNT[5] + 1;
        END_IF;
    END_FOR;
    #StartEval := false;
END_IF;
IF #StartClear THEN
    #CNT := #tempCntEmpty;
    #StartClear := 0;
END_IF;

Das sieht dann am Ende so aus:
Screenshot 2024-01-31 132500.png
 
ich mach das jetzt nach und melde mich dann. Wieso schreibst du hier Char und bei denen zuvor nicht?
Weil er eben als Beispiel wohl dir den Weg über Konstanten oder ohne Konstanten zeigen wollte.

Du brauchst nicht 2 oder 3 Schleifen um ein Array abzuarbeiten, da du eh den Zeiger inkrementierst, du musst nur auslesen welche Zahl gerade in dem aufgezeigten Fach steht und dementsprechend den Zähler addieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ist es so gemeint von dir?
1706712841819.png
Hallo Ricardos,

vielleicht hilft es mal das ganze einfach runterzuschreiben und wenn das tut schauen wie der Code sich eleganter bewerkstelligen lässt.

Gruss

Code:
BEGIN
    //Array of Byte nach Array of Char
    FOR #i := 0 TO 17 DO
        "SpielDB".gewandelt[#i] := BYTE_TO_CHAR("SpielDB".Ergebniss[#i]);
    END_FOR;
  
  
  
    IF #Start THEN
        //Zähler nullen
        #"Zähler"[0]  := 0;
        #"Zähler"[1]  := 0;
        #"Zähler"[2]  := 0;
        #"Zähler"[3]  := 0;
        #"Zähler"[4] := 0;
        #"Zähler"[5]  := 0;
        // Auswerten des Arrays
        FOR #j := 0 TO 17 DO
            IF "SpielDB".gewandelt[#j] = '0' THEN
                #"Zähler"[0] := #"Zähler"[0] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '1' THEN
                #"Zähler"[1] := #"Zähler"[1] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '2' THEN
                #"Zähler"[2] := #"Zähler"[2] + 1;
            ELSIF "SpielDB".gewandelt[#j] = '3' THEN
                #"Zähler"[3] := #"Zähler"[3] + 1;
            ELSIF "SpielDB".gewandelt[#j] = #CHAR_4 THEN
                #"Zähler"[4] := #"Zähler"[4] + 1;
            ELSIF "SpielDB".gewandelt[#j] = #CHAR_5 THEN
                #"Zähler"[5] := #"Zähler"[5] + 1;
            END_IF;
        END_FOR;
        #Start := FALSE;
    END_IF;
END_FUNCTION_BLOCK
 
Nur weils mir gerade auffällt unter Berücksichtigung meiner array's is diese convertierung ja falsch oder. Ich verwende ja den DAT_INT net. aber wie soll ich das dann schreiben das es richtig wäre? 1706716623049.png
 
Hallo,
sag du es mir...
Nur weils mir gerade auffällt unter Berücksichtigung meiner array's is diese convertierung ja falsch oder. Ich verwende ja den DAT_INT net. aber wie soll ich das dann schreiben das es richtig wäre? Anhang anzeigen 74914
Ich habe in meinem Beispiel ein Array of Byte ("SpielDB".Ergebniss[#i]) dieses konvertiere ich in ein Array of Char ("SpielDB".gewandelt[#i]) da im späteren Code auf Char verglichen wird. Auf was vergleichst du? Wenn du auf Charakter vergleichst dann musst du auch in Charakter konvertieren.
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur weils mir gerade auffällt unter Berücksichtigung meiner array's is diese convertierung ja falsch oder. Ich verwende ja den DAT_INT net. aber wie soll ich das dann schreiben das es richtig wäre? Anhang anzeigen 74914
Ich weiß nicht wieso du an deinem Integer so festhältst wenn es hier nicht um reale Zahlen sondern Zeichen geht.

Du hast oben zwei komplette Lösungen stehen, einmal mit einer Umwandlung (David), einmal ohne (meine).

In der Schleife ab Zeile 27 beschreibst du auch den Bereich den du liest? Wieso? Daten in einem Empfangsbereich werden nicht verändert sondern in einen anderen Bereich transferiert und dann dort gearbeitet. Deswegen heißt es ja auch Empfangsbereich und Arbeitsbereich.
 
Ich habe das Gefühl, dass es sich wesentlich eleganter lösen lassen würde, wenn der Code erst prüft, ob es sich bei dem INPUT um reine Chars zwischen 30h und 35h handelt, daraus dann die korrespondierenden Integer-Werte bildet, und dann Zähler in einem Array inkrementiert.

Code:
tempArray := FC_WandleCharInputToInt(InputArray);

for each element do
    if tempArray[i] is validInt then
        Cnt[tempArray[i]]++;
    else
        CntError++;
end_for;

Also, so sinngemäßg
 
Hallo,
sag du es mir...

Ich habe in meinem Beispiel ein Array of Byte ("SpielDB".Ergebniss[#i]) dieses konvertiere ich in ein Array of Char ("SpielDB".gewandelt[#i]) da im späteren Code auf Char verglichen wird. Auf was vergleichst du? Wenn du auf Charakter vergleichst dann musst du auch in Charakter konvertieren.
Gruß
Ja eh so wie ichs reingesendet habe oder?
Ich verstehs wirklich net was ich falsch mache.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe das Gefühl, dass es sich wesentlich eleganter lösen lassen würde, wenn der Code erst prüft, ob es sich bei dem INPUT um reine Chars zwischen 30h und 35h handelt, daraus dann die korrespondierenden Integer-Werte bildet, und dann Zähler in einem Array inkrementiert.

Code:
tempArray := FC_WandleCharInputToInt(InputArray);

for each element do
    if tempArray[i] is validInt then
        Cnt[tempArray[i]]++;
    else
        CntError++;
end_for;

Also, so sinngemäßg
Wusste gar nicht, dass so SCL aussieht
 
Viele Wege führen nach Rom, ob der Code jetzt 30 oder 25 Zeilen hat, durch die kleine Schleife muss der Zyklus sowieso durch. Manchmal ist es schöner verständlicher zu schreiben, als alles in 5 Zeilen weniger zu quetschen.
 
Zurück
Oben