Step 7 Cognex Datamen erkannten Code auslesen und vergleichen

automatenkind

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
habe schon in ähnlichen Themn gesucht, jedoch nicht so recht gefunden was mir weiterhilft.
Deshalb jetzt auf diesen weg.
Ich habe einen Cognex Datamen DMR-302, den ich per ProfiNet mit meiner CPU315 verbunden habe.
Dieser Scanner soll Barcodes lesen und dann im Programm vergleichen.
Ich bekomme den ausgelesen Code in der VAT in den PEW 280 bis 286 (siehe bild) ,
oder auch im Scanner Result DB113.dbb336-343 als Zeichen angezeigt.

Dataman.jpg

Jetzt meine Frage:
Wie bekomme ich diesen gelesen Barcode als Zeichen in die Steuerung zur weiteren Bearbeitung?
Wenn ich mir die Wörter oder Bytes in mein Programm lade bekomme ich logischerweise immer den HEX wert angezeigt!
Kann ich diese dann auch in der Steuerung wieder zu den Zeichen umwandeln wie in der VAT um ihn dann nachher zu vergleichen?

Sorry aber ist irgendwie blöd zu beschreiben:roll:aber ich bekomme diesen Zahlen nicht aneinander in die Steuerung ,auch nicht mit Tipps aus ähnlichen Themen.:???:

Vielen Dank im vorraus
MFG
 
Wenn ich z.B. versuche die PEW`s in einen String zu fassen bekomme ich wieder andere Werte in denen der code auch enthalten ist, aber nicht so wie ich ihn brauche.

Dataman2.jpg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit was und zu welchem Zweck möchtest du denn Vergleichen? Die HEX-Werte sind ja auch für jedes Zeichen einmalig. Könntest also auch die HEX-Werte vergleichen.
 
Das sind Artikelnummern , die verglichen werden sollen ob Kartons und angewählter Artikel übereinstimmen.
wollte an andererer Stelle im Programm also eigentlich nur die Artikelnummern eintragen und dann vergleichen.
Klar würde das auch im Hex gehen, aber ich bekomme ja nicht einmal diese HEX werte hintereinander zu einem wert oder string oder ähnlichem zusammengefügt.

Ich hätte also gerne aus diesen PEW`s oder den Bytes eine zusammenhängende Nummer , wenn das irgendwie möglich ist!
 
Zuletzt bearbeitet:
Wo bekomms du deine Artikelnummer her mit der du vergleichen willst?
HMI oder haendischer eintrag in einem DB?
aber eigentlich egal wie du kannst doch deine vergleiche mit jedem möglichen Format durchführen, also Byte, Word oder Doppelword. Oder willst du es unbedingt in einem zusammenhängenden Format durchführen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal vielen Dank für die schnellen Antworten!!!!
Am HMI wird das Programm angewählt ,welches dann die Artikelnummer hinterlegt hat.
Ich hätte dann natürlich gerne eine zusammenhängende "Artikelnummer" die ich der im Programm hinterlegten gegenüberstellen und vergleichen kann.
Wie schon beschrieben bekomme ich diese ja in der VAT als Zeichen zu sehen, es muss doch nun möglich sein diese auch so im Programm anzuzeigen und diese EW`s aneinanderzu reihen, oder?
 
Es macht eigentlich immer Sinn, eine Variable so weiter zu verarbeiten wie es ihren eigentlichen Inhalts entspricht.
Von da her würde es m.E. schon Sinn machen, aus dem Char-Array, dass der Scanner zurückliefert, einen String zu machen und den dann mit den SPS-Funktionen (wie z.B. EQ_String) weiter zu verarbeiten.

@TE:
Du machst einfach folgendes :
Du legst dir einen String an, dessen Länge ausreichend ist.
Diesen String initialisierst du (Einträge in die Header-Bytes).
Nun überträgst du deine Scanner-Bytes in den Nutzdatenbereich des Strings (ab Byte 2 des Strings-Anfangs).
Fertig ...

Gruß
Larry
 
Na dann mach dir doch in einem DB einen String wo du dann entsprechend deine PEW rein kopierst. musst nur dran denken die ersten Zeichen sind für die laenge des Strings. Damit, wenn du dir das zusammengebastelt hast ,kannst du aus den Standard Library den FC10 "eq_String_IEC" nehmen und deine beiden Strings vergleichen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für euren super Einsatz!!!
Ich stehe da nur etwas auf dem Schlauch, habe noch nie mit Strings hantiert;) und bin ziemlich am Anfang beim Programmieren.
Ich habe mir ja einen FB angelegt, indem ich eine Statische VAR als String angelegt habe. Was muss ich mir da jetzt initialisieren?
Wie lade ich dei PEW`s in den String? Einfach L PEW... T DB...String[3,4,5 usw.]? Oder wie lasse ich die ersten beiden bytes frei?
Entschuldigt meine Unwissenheit.
 
Naja ... du hast dir einen String deklariert mit der Länge 10 Zeichen (z.B.)
Nun besteht der String aus 2 Kopfbytes - das erste gibt die deklarierte Länge an (hier müßtest du dann die 10 reinschreiben), das 2.Byte die tatsächliche Länge (das wären dann vielleicht 8 Zeichen - also der Bereich, den du wirklich davon nutzt). In den folgenden Bytes stehen dann deine Nutzdaten. Hier könntest du nun tatsächlich die Daten Byte- oder Wortweise hineinkopieren (mit L PEW xyz und T W xyz) bzw. in deinem Fall besser : du bildest dir einen Pointer auf deine Stringdeklaration und überträgst mittels des Pointers.

Gruß
Larry
 
Datamen4.PNGIrgendetwas muss ich falsch machen, mache es genau so wie beschrieben, bekomme aber keine Daten im DB.
Wie deklariere ich die einzelnen Bytes ??? z.B. die Kopfbytes um bei dem Beispiel zu bleiben.
L 10 (für die länge)
T string[1] (mit eckiger klammer)??? oder wie deklariere ich das erste byte?

L 8 (Der bereich der genutzt wird)
T string[2] (eckige klammer für byte 2)???
 

Anhänge

  • dataman3.jpg
    dataman3.jpg
    39,7 KB · Aufrufe: 17
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
string[1] ist das erste Byte des Nutzdatenbereichs deines Strings.
Schau dir doch vielleicht einfach mal den Aufbau eines Strings in der S7-Hilfe an.
Du müßtest dir einen Pointer auf deinen String bilden.
Nun schreibst du an Pointer-Adresse [+0] und [+1] deine String-Kopfdaten hinein.
Die Nutzdaten deines String kommen dann ab Pointer-Adresse [+2] + folgende. Das wird eigentlich klar wenn du dir den Aufbau anschaust.

Strings sind in AWL eigentlich nicht unbedingt sinnvoll zu handeln - dafür wäre SCL deutlich besser geeignet ...

Gruß
Larry
 
Hallo Larry,
nochmals vielen Dank für deine mühe!
Die S7 Hilfe habe ich mir schon zu Herzen genommen, das ist mir auch alles verständlich mit dem STRING.
Nur leider bekomme ich, wenn ich es genau so mache, nichts in meinem DB angezeigt wenn ich meine einzelnen Zeichen in die Bytes des STRING´s transferiere.
Dann muss ich wohl mal an die Pointer dran ;)

Danke!!
 
Nur leider bekomme ich, wenn ich es genau so mache, nichts in meinem DB angezeigt wenn ich meine einzelnen Zeichen in die Bytes des STRING´s transferiere.
Den Inhalt von Strings kann man nicht direkt im DB beobachten. Man muß jedes Byte einzeln (oder höchstens als Dword) in einer Variablentabelle beobachten.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo nochmal;)
das mit dem String hat dank eurer Hilfe geklappt. Nochmals vielen Dank.
Jetzt habe ich, wie es nunmal immer ist, das nächste Problem :| und wäre nochmal dankbar für eure Hilfe.
Und zwar bekomme ich einen EAN code(Artikelnummer) byteweise vom scanner, und die richtige Artikelnummer als DINT vom System.
Diese beiden Nummern müssen nun auf Gleichheit verglichen werden.
Leider bekomme ich aber nicht beide auf einen Nenner, sprich entweder von byte zu INT oder umgekehrt.Und so habe ich natürlich auch nie gleiche codes.
Kennt jemand da einen Lösungsansatz?
mfg
 
Entweder den DINT in STRING wandeln und als String oder zeichenweise mit dem CHAR-Array des EAN vergleichen, oder den EAN in DINT wandeln und die DINT vergleichen. Die IEC-Funktionen DI_STRNG und STRNG_DI sind Dein Freund. Oft schreibt man sich auch schnell selber eine Umwandlung.

Harald
 
Zurück
Oben