Step 7 vergleiche Array von Char simatic S7 v5.6

silva.nrc

Level-2
Beiträge
29
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollegen,

Ich versuche, eine Vergleichsroutine für ein 32-Byte-Array (char) zu programmieren. Grundsätzlich wird das Array korrekt gefüllt, aber ich muss in meiner Logik eine Gegenprüfung durchführen, also muss ich 2 verschiedene Arrays vergleichen. (natürlich gleiche Struktur Arrays)

Ich habe einige Informationen im Forum gelesen, aber die meisten davon sind dem TIA-Portal gewidmet, das bessere Tools als mein S7 v5.6 hat.

Hat jemand ein paar Tipps, um mir in dieser Angelegenheit zu helfen?
Im Anhang ist, was ich bisher gemacht habe!

Vielen Dank!
 

Anhänge

  • FC302.PNG
    FC302.PNG
    17,1 KB · Aufrufe: 34
Ja gehts denn nicht? While hab ich auf einer SPS nie benutzt, da nehm ich nur FOR, schaut aber nicht verkehrt aus. Wirft der Compiler Warnungen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Schleife läuft nur bis maximal #n < 31, also #n = 30. Die Abfragen #n <= 31 bzw. #n < 32 wären OK, damit ggfs auch die Elemente mit dem Index 31 verglichen werden können.

Da Du Deine SchleifenDurchläufe vorzeitig abbrichst, sobald Du einen Unterschied zwischen beiden Arrays erkennst, könntest Du die Schleife per EXIT vor Ausführung von '#n := #n + 1 ;' verlassen und den Inhalt von #n nach Beendung der Schleife als Kriterium auswerten (#n erreicht nur dann den Wert 32, wenn die Schleife nicht vorzeitig abgebrochen wurde, also alle 32 Elemente des einen Arrays mit denen des anderen übereinstimmen). Die temporäre Variable #result wäre dann überflüssig, müsste nicht mit TRUE vorbesetzt werden und würde in der Abfrage im SchleifenKopf entfallen.

Code:
#n := 0 ;

WHILE #n < 32 DO
    IF #arr1[#n] <> #arr2[#n] THEN EXIT; END_IF ;
    #n := #n + 1 ;
END_WHILE ;

#EQ_ARRAY := #n = 32 ;
 
Deine Schleife läuft nur bis maximal #n < 31, also #n = 30. Die Abfragen #n <= 31 bzw. #n < 32 wären OK, damit ggfs auch die Elemente mit dem Index 31 verglichen werden können.

Da Du Deine SchleifenDurchläufe vorzeitig abbrichst, sobald Du einen Unterschied zwischen beiden Arrays erkennst, könntest Du die Schleife per EXIT vor Ausführung von '#n := #n + 1 ;' verlassen und den Inhalt von #n nach Beendung der Schleife als Kriterium auswerten (#n erreicht nur dann den Wert 32, wenn die Schleife nicht vorzeitig abgebrochen wurde, also alle 32 Elemente des einen Arrays mit denen des anderen übereinstimmen). Die temporäre Variable #result wäre dann überflüssig, müsste nicht mit TRUE vorbesetzt werden und würde in der Abfrage im SchleifenKopf entfallen.

Code:
#n := 0 ;

WHILE #n < 32 DO
    IF #arr1[#n] <> #arr2[#n] THEN EXIT; END_IF ;
    #n := #n + 1 ;
END_WHILE ;

#EQ_ARRAY := #n = 32 ;
Heinileini,
Mir hat wirklich gefallen, wie Sie den Code geschrieben haben, er ist viel besser, aber aus irgendeinem Grund habe ich immer noch die gleichen Fehler, wenn ich versuche, ihn zu kompilieren.
Irgendwelche Ideen warum? vielleicht habe ich etwas übersehen.. vielen dank!
 
Zurück
Oben