String aus Barcode Teilauslesen und vergleichen

Heintje

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Community.

Habe folgendes Problem.

Scanne einen Barcode der aus 27 Zahlen besteht. Also String angelegt in DB mit String[30] plus Kopfdaten also 32 Byte.

Jetzt nehme ich den SFC20 Blockmove, da ich nur einen betsimmten teil aus dem ganzen Barcode benötige.
Also Blockmove P#db1.dbx21.0 Byte 5 nach P#db1.dbx34.0 byte 5

Zweiter Eintrag im DB ist nur ein String[5] plus Kopfdaten also 7 Byte
Da ich nur 5 Zahlen aus dem Barcoe brauche.

P#db1.dbx21.0 Byte 5 Ab dem 21 Byte brauch ich die 5 Zahlen

Danach möchte ich sie Wandeln in DINT
Geht ja auch mit einer SFC

Mein problem ist, das ab und an irgend ein Mist im 2. Byte der Kopfdaten steht. Also in der aktuellen Länge des Strings. Versteh aber nicht warum sich die aktuelle länge veändert. Immer der gleiche Barcode nur das sich die 5 Zahlen innerhalb des Codes ab und zu verändern und ich das mitbekommen möchte.

Wenn ich diese Zahl dann als DINT habe, dann kann ich sie ja ganz normal Vergleichen.

Es sind nur Zahlen.

Wenn ich die einzelnen Bytes beobachte, dann kommen genau die Zahlen die ich scanne und auch brauche. Nur beim Wandeln dann von String nach DINT geht es dann nicht weiter, weil Mist in dem 2. Byte steht.


Kann mir einer Helfen???
 
Hallo,
wenn du aus einem String einen Teil heraus kopierst und als neuen (kürzeren) String zur Weiterverarbeitung (SFC...) in einem neuem String ablegst, hast du keine Kopfdaten mitkopiert.:confused:

Also solltest du die neuen Kopfdaten des (kürzeren) Strings selbst wieder herstellen...
und den kopierten String-Teil erst im DBW 34+2 (also wieder hergestellte Kopfdaten + 2 Byte) ablegen...

Gruss
 
Hallo,
wenn du aus einem String einen Teil heraus kopierst und als neuen (kürzeren) String zur Weiterverarbeitung (SFC...) in einem neuem String ablegst, hast du keine Kopfdaten mitkopiert.:confused:

Also solltest du die neuen Kopfdaten des (kürzeren) Strings selbst wieder herstellen...
und den kopierten String-Teil erst im DBW 34+2 (also wieder hergestellte Kopfdaten + 2 Byte) ablegen...

Gruss

Hallo.
Na das hab ich doch.
Der zweite String fängt bei 32 wieder an. Deshalb füge ich ihn
erst bei 34 wieder ein das die Kopfdaten nicht überschrieben werden.
Oder wie?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum bearbeitest du denn Strings mit Blockmove, und nicht mit den dafür vorgesehenen Bausteinen aus der IEC Bibliothek?
Dort gibt es diverse Bausteine (LEFT, RIGHT, MID) um Strings zu bearbeiten.

Hallo. Mit welchen Bausteinen würdest du es machen?
27 Zahlen. Ich brauche Bsp Zahl 21-26
 
und wie lauten die neuen Kopfdaten in DBB 32 + 33 und wo kommen die her ?

Gruss
In Variablen beobachten ist normalerweise ein kleines
Viereck zu sehen. In den beiden ersten Bytes.
In dem kürzeren String später steht diese kleine Viereck dann im ersten Byte
Im zweiten Byte steht irgendetwas. Keine Ahnung. Weiß ich jetzt nicht mehr.
 
Hi,

in Byte 0 muss die maximale Länge des Strings stehen und im Byte 1 die tatsächliche Länge.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Mit welchen Bausteinen würdest du es machen?
27 Zahlen. Ich brauche Bsp Zahl 21-26

Na MID, wenn dein String 30 (bzw. 27) Zeichen hat scheiden LEFT oder RIGHT doch aus.
Code:
CALL  "MID"
IN     :="DBxy".str1     // Eingangsstring
L      :=6               // Länge der mittleren Zeichenkette
P      :=21              // Position des ersten Zeichens
RET_VAL:="DBxy".str2     // Zielstring
 
Na MID, wenn dein String 30 (bzw. 27) Zeichen hat scheiden LEFT oder RIGHT doch aus.
Code:
CALL  "MID"
IN     :="DBxy".str1     // Eingangsstring
L      :=6               // Länge der mittleren Zeichenkette
P      :=21              // Position des ersten Zeichens
RET_VAL:="DBxy".str2     // Zielstring

Werde ich am Dienstag ausprobieren.
Werde dann den String wandeln nach DINT
Mal sehen ob das geht.
Vielleicht liegt es ja am blockmove
 
Na MID, wenn dein String 30 (bzw. 27) Zeichen hat scheiden LEFT oder RIGHT doch aus.
Code:
CALL "MID"
IN :="DBxy".str1 // Eingangsstring
[U][B]L :=6 // Länge der mittleren Zeichenkette[/B][/U]
P :=21 // Position des ersten Zeichens
RET_VAL:="DBxy".str2 // Zielstring

... er braucht doch 5 zahlen ... ?

P#db1.dbx21.0 Byte 5 Ab dem 21 Byte brauch ich die 5 Zahlen



Also, hoffentlich richtig zu später Stunde hier eine andere Lösung (denke er erhält den Barcode als ASCII) :

(DBB 21 - 30hex) * 10000
+
(DBB 22 - 30hex) * 1000
+
(DBB 23 - 30hex) * 100
+
(DBB 24 - 30hex) * 10
+
(DBB 25 - 30hex) * 1
= Deine Zahl


Gruss
 
Zurück
Oben