3 Char miteinander vergleichen

MK_Auto

Level-1
Beiträge
124
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen
mal ne kurze Frage wie Ihr 3 Byte mit asci also 3 zeichen Vergeleichen würdet
habe eine Liste mit sagen wir mal 20 Stück a 3 asci zeichen
und bei übereinstimmung will ich einen merker bringen.
Geht das nur über immer die 3 Byte vergleichen oder kann ich auch den Ausdruck einfach vergelichen ??
Vielen Dank
Micha
S7300
 
S7 300 Vergleichen

OK ich formuliere es mal anders
Habe 3 Byte mit je einem Char Asci code also 3 Zeichen

diese will ich mit sagen wir mal 20 +3 Zeichen vergleichen
auf übereinstimmung sagen wir mal nummern in dem fall also
eine Typnummer 3 zeichen vergleichen mit meinen 20 fächer a 3 zeichen auf übereinstimmung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

mach doch aus den Daten einen String und durchsuche diesen mit "FIND".
Der "FIND" FC11 ist in der Standardlib/IEC Function Blocks in STep7 zu finden.

Gruss Daniel
 
Wenn die 3 Zeichen hintereinander im Speicher liegen könntest du diese mit einem Doppelwort-Vergleich vergleichen. Du musst nur dann das 4. Byte vorher ausmaskieren damit das beim Vergleich nicht stört.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin mir nicht sicher ob das funktioniert, aber probier folgendes mal:

Jedes Char (entspricht 1 Byte)

man nehme 3 Char + 1 "leeres" Byte => 1 Doppelwort => Wert x im DINT-Format

Lese beide Zeichenfolgen (Doppelwörter) auf diese Weise und vergleiche diese miteinander als DINT

Code:
DB10.DBB0 = '
DB10.DBB1 = A
DB10.DBB2 = B
DB10.DBB3 = C
DB10.DBB4 = '
...


L DB10.DBB1
T DB11.DBB0

L DB10.DBB2
T DB11.DBB1

L DB10.DBB3
T DB11.DBB2

L 0
T DB11.DBB3

... (das Ganze für beide Zeichenfolgen)

L DB11.DBD0
L DB11.DBD4 <== 2. Zeichenfolge
==D
= M1.0
 
Hallo zusammen

danke für die anregungen ja die chars sind bytes
könnte sie verunden und direkt vergleichen nur sin das dann 20 vergeleiche a 3 bytes das bläht sich auf daher beine frage ob man die 3 bytes zusammen vergleichen kann
 
Hi,

siehe Beitrag von mir geht bis 254 Bytes. ;)
Musst nur aus den beiden einen String machen und ab gehts.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
danke für die anregungen ja die chars sind bytes
könnte sie verunden und direkt vergleichen nur sin das dann 20 vergeleiche a 3 bytes das bläht sich auf daher beine frage ob man die 3 bytes zusammen vergleichen kann

Das ganze ist natürlich ideal für ne Schleife mit indirekter Adressierung bzw. Pointern!
 
Beispiel

nur bei 4 vergleichen brauche aber 20
U(
L DB1.DBB 0
L DB2.DBB 0
==I
)
U(
L DB1.DBB 1
L DB2.DBB 1
==I
)
U(
L DB1.DBB 2
L DB2.DBB 2
==I
)
O
U(
L DB1.DBB 0
L DB2.DBB 3
==I
)
U(
L DB1.DBB 1
L DB2.DBB 4
==I
)
U(
L DB1.DBB 2
L DB2.DBB 5
==I
)
O
U(
L DB1.DBB 0
L DB2.DBB 6
==I
)
U(
L DB1.DBB 1
L DB2.DBB 7
==I
)
U(
L DB1.DBB 2
L DB2.DBB 8
==I
)
O
U(
L DB1.DBB 0
L DB2.DBB 9
==I
)
U(
L DB1.DBB 1
L DB2.DBB 10
==I
)
U(
L DB1.DBB 2
L DB2.DBB 11
==I
)
= M 88.0
wobei db 1 ist der mit den allen 20 verglichen wird
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Schreib dir doch einen schönen FC dazu, quasi einen MEMCMP (Memory compare).
Mit zwei Parametern vom Typ ANY und einem boolean Ausgang EQ (Equal). Die Pointer im FC zerlegen und dann mit einer Schleife abarbeiten. Die Schleife wird dann verlassen wenn die ersten Bytes unterschiedlich sind.
Universal einsetzbar...
 
Hallo Thomas suchte was schnelles einfaches wenn ich groß zerlege usw kann ich das auch noch die anderen 16 anhängen wie im Beispiel von mir
 
Dann mach doch eine Schleife ;-) Die Suchfunktion gibt dazu doch einiges her.

Aber wenn das der einzige Vergleich im Programm ist: was spricht denn dagegen es so umzusetzen wie du es jetzt stehen hast? Wenn du die Variablen im DB passend symbolisch hast sieht das doch auch viel besser aus. Wenn diese Vergleiche öfters vorkommen: Auslagern in eine Funktion.

Eine Schleife ist bei 3 Bytes auch nicht unbedingt schneller, spart höchstens etwas Programmspeicher.

Die Variante mit dem Ausmaskieren die ich anfangs erwähnte sähe folgendermaßen aus. Auch wenn das wirklich nicht schön aussieht:
Code:
      L     DB1.DBD    0
      SRD   8
      T     #dw_cmp_val

      L     DB2.DBD    0
      SRD   8
      L     #dw_cmp_val
      <>D   
      SPB   neq

      L     DB2.DBD    3
      SRD   8
      L     #dw_cmp_val
      <>D   
      SPB   neq

      L     DB2.DBD    6
      SRD   8
      L     #dw_cmp_val
      <>D   
      SPB   neq

      L     DB2.DBD    9
      SRD   8
      L     #dw_cmp_val
      <>D   
      SPB   neq

      SET   
      =     M     88.0
      SPA   eq

neq:  CLR   
      =     M     88.0
eq:   NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Code:
      CALL  "BLKMOV"
       SRCBLK :="DB_Daten".DB_VAR       //Eingangsbereich mit 20 Byte
       RET_VAL:=MW0
       DSTBLK :=P#DB2.DBX2.0 BYTE 20    //"DB_Strings".Str mit Versatz um 2 Byte

      L     20                          //Längen
      T     DB2.DBB    0                //in MAX Len Byte des Strings eintragen
      T     DB2.DBB    1                //tatsächliche Länge des Strings eintragen

      CALL  "FIND"
       IN1    :="DB_Strings".Str        //zu durchsuchender String 
       IN2    :="DB_Strings".Find       //String mit z.B. '123'
       RET_VAL:=MW0

      L     MW     0                    //Zeichen '123'
      L     0                           //gefunden?
      <>I   
      =     M      2.0                  //Ja = True

aber da leidet der Zyklus mehr drunter.

Gruss Daniel
 
Danke

für eure Anregungen
werde mal in erfahrung bringen ob das 4te zeichen immer gleich ist dann könnte ich das doppelwort inner schleife vergleichen
 
Hallo,
ist ja interessant hier zu lesen.

@TE: was hast du gegen den Vorschlag von Dalbi - gut ... der hat den Nachteil, das er aus wenig Code besteht und einfach umzusetzen und auch einfach zu durchschauen ist ... dennoch ich halte ihn im genannten Zusammenhang für am Sinnvollsten ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
für eure Anregungen
werde mal in erfahrung bringen ob das 4te zeichen immer gleich ist dann könnte ich das doppelwort inner schleife vergleichen

Das 4. Zeichen ist doch total egal. Lade die ersten drei Zeichen und in das 4. Byte den Wert 0 und schon hast Du was zum vergleichen! (Sowas hatte ich schon mal hier vorher beschrieben)
 
Zurück
Oben