Step 7 SCL Array Vergleich - S7-313C

Sickone4

Level-2
Beiträge
68
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich hab momentan ein Problem mit einem ASCII String, der in einem DB als ARRAY (HEX) vorliegt:

in DB1 ab Byte 4 -> Array 0..320 of Byte

davon möchte ich die ersten 16 Bytes vergleichen auf einen anderen String (in HEX)

also prinzipiell

IF Byte1 = W#16#4d THEN xyz , sprich wenn Byte1 = M

bisher hab ich eine IF Abfrage mit 16 Vergleichen, das müsste aber doch durch eine FOR Schleife einfacher gehen oder? Ich weiß nur nicht wie ich das anstellen soll.

Wäre um jede Hilfe dankbar.

Gruß
Sven
 
Wenn du Bytes vergleichen möchtest, wäre das B#16#..

Schau mal in die Step7 SCL Dokumentation (sollte eigentlich mit bei Step7 dabei sein), wie diese Kontrollstruktur geschrieben wird, dann könntest du eventuell nochmal gezielter fragen. So recht ist mir nicht ersichtlich, wo es hakt.

FOR i:= 4 TO 20 BY 1 DO
...;
END_FOR;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du mußt dir auf den String eine AT-Sicht machen, die ihn als Array of Byte sieht.
Die AT-Sicht kannst du dann in einer Schleife durchlaufen.
Es gibt innerhalb halb von SCL aber auch String-Vergleichsroutinen (siehe SCL-Hilfe) - vielleicht macht es mehr Sinn, diese zu nutzen ...

Gruß
Larry
 
Du kannst das auch symbolisch ansprechen.
Es gibt auch die Möglichkeit, einen Stringvergleich zu machen.
Wenn Du nur wissen willst, ob irgendein Wert = "M" ist, könnte das so aussehen:

Code:
VAR_TEMP
  Stringvergleich : BOOL;   
  i : INT;  
END_VAR

BEGIN

FOR i:= 1 TO 16 DO
    Stringvergleich := EQ_STRNG(S1 :='M',S2 := "myDB".STR[i]); 
    IF Stringvergleich THEN
        // Mach irgendwas...
        EXIT;
    END_IF;
END_FOR;

END_FUNCTION
 
hallo Leute, danke für eure antwort!

ich hab folgendes vor: ich möchte mir die SN der MMC Karte auslesen und mit einer eingestellten SN vergleichen -> KnowHow Schutz via SN

so sieht mein quellcode im moment aus:

Code:
 extSN := RDSYSST(
        REQ        := TRUE,             // IN: BOOL
        SZL_ID     := W#16#11c,         // IN: WORD
        INDEX      := W#16#8,           // IN: WORD
        RET_VAL    := error,            // OUT: INT
        BUSY       := A125.6,           // OUT: BOOL
        SZL_HEADER := SZL_HEADER,       // OUT: STRUCT
        DR         := SN_IN             // OUT: ANY        
        );                              // INT

        

    EQUAL := 0;

    
    FOR i :=1 TO 16 DO                  

        IF SN_IN[i] <> SN[i] THEN
          EQUAL := EQUAL+1;        // Wenn ein ASCII (Hex) Zeichen anders ist
        END_IF;

    END_FOR;

    IF EQUAL > 0 THEN
        STP();            //  SPS Stoppen
    END_IF;

Ich habe folgendes Problem damit: ich würde gerne die Arrays komplett prüfen. ABER ich hab das gefühl, da der SFC51 asynchron abgearbeitet wird, dass die For schleife (nur 1 zyklus) viel schneller fertig ist.
habt ihr das schon einmal gemacht? oder ist ein anderer weg sinnvoller? gibt es gar einen "baustein fertig" aufruf für den sfc51, damit ich die for schleife erst danach abfrage?
ist es so überhaupt sinnvoll zu vergleichen?

gruß sven
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Sven,
der SFC51 arbeitet asynchron. Du müßtest also den BUSY auf FALSE abfragen um sicher zu stellen, dass er die Daten zurück geliefert hat - also eine Art Schrittkette mit einbauen.
Ob deine Vorgehensweise an sich sinnvoll ist das mußt du wissen ...

Gruß
Larry
 
hi larry!
ich hab mir mal überlegt, ob ich mit einer case kette/struktur ggf ans ziel komme. was ich mich jedoch generell frage ist, warum ich den busy nicht bemerke, ob der true oder false ist. ich hab mal ganz blöd einfach mal if true then bool = true (arg vereinfacht) quasi als sr glied und mein bool wurde nicht true. ist denn überhaupt ein ausgang oder ein status aus dem sfc51 heraus abrufbar?
 
In der Hilfe zu dem SFC steht:

Sie starten den Lesevorgang, indem Sie beim Aufruf der SFC51 den Eingangsparameter REQ mit 1 belegen. Falls der Lesevorgang sofort ausgeführt werden konnte, liefert die SFC am Ausgangsparameter BUSY den Wert 0 zurück. Falls BUSY den Wert 1 hat, ist der Lesevorgang noch nicht abgeschlossen.

Das kann also durchaus sein, dass Busy gar nicht 1 wird.
Du mußt also, wie Larry schon sagte, Busy auf "False" abfragen, bevor du irgendwelche Ergebnisse aus dem SCF auswertest.
 
Zurück
Oben