Step 7 Suche im DB nach bestimmte Barcode

Goeky

Level-1
Beiträge
48
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich muss gescannte Barcode mit dem Barcodes die sich in einer bestimmten DB befinden vergleichen. Barcodes in DB sind ca. 100 Stück.
Wenn Barcode was ich gescannt habe auch im DB vorhanden ist wird Ausgang 1 gesetzt und ich muss irgendwie mit dem Zeitstempel in dem selben DB oder in ein anderes melden, dass dieses Barcode gescannt ist. DB wird dann von OPC-Server bearbeitet und in ein externes Datenbank geschrieben.

Zuerst ist aber wichtig wie ich in einer DB nach Barcode suche. Wie soll ich vorgehen? Oder gibt es dazu Beispiele?
 
Hallo,
du mußt dir eine Schleifen-Routine aufbauen, die den DB scannt. Dazu gibt es im Forum sicherlich auch Beispiele (Foren-Suche).
Falls SCL eine Option für dich ist dann wäre das ein überschaubarer Code, der dafür nötig ist. Bei AWL ist das schon ein bißchen was anderes ...

Gruß
Larry
 
Dann hast du m.E. 2 Optionen :

1.) ihr besorgt SCL und du kannst das Ganze als vernünftig durchschaubaren Code erzeugen
2.) du beisst dich durch das AWL- und das Pointer- und das indirekte-Adressieren-Thema durch

Ich würde zu 1.) tendieren - auch wenn 2.) vom Lernanspruch natürlich was hat ... - was hast du nu vor ?

Gruß
Larry
 
Wenn es nur mit AWL geht, kommst du um indirekte Adressierung nicht herum.
Dazu liest du zuerst einmal in der FAQ des Forums nach, da ist ein guter Beitrag drin.

Zum Programm:

Liegt der Barcode als String vor?
Wie ist der DB mit den 100 String angelegt?

Dann mußt du jeweils den Barcode n aus dem Vergleichs-DB in einen internen String des FB kopieren (Blockmove, SFC20), diesen mit dem gescannten Wert vergleichen (FC 10 EQ_STRNG aus der Standard-Library).
Wenn keine Gleichheit vorhanden ist, dann den nächsten String aus dem DB laden (Adresse entsprechend berechnen).
Bei 100 Strangs kann es sein, dass du die Zykluszeit sehr hochtreibst, solltest du das in einem Schleifendurchgang machen. In diesem Fall mußt du die Suche u.U. noch auf mehrere SPS-Zyklen verteilen, das würde ich aber erst angehen, wenn die Suche als solche funktioniert.
Wenn du Strangs umkopierst mußt du immer aufpassen, Siemens-Strings in der S7 haben 2 Byte Kopf. Byte 1 = max. Länge des String (Länge, mit der der String definiert wurde), Byte 1 = tatsächliche Länge des String. Also Aufpassen, bei der Adressberechnung.

In SCL ginge das um Welten einfacher zu machen!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
in etwa so (einfach) sähe das in SCL aus, wobei hier noch ein paar Bits ausgegeben werden, die ebenfalls in der Tabelle stehen.

Code:
FUNCTION FC252 : INT


Title = 'L_Matrix'
//
// Zuordnung von Bits aus einer Tabelle an Hand eines Namens heraussuchen
// die Bits der erste Fundstelle werden ausgegeben 
//
Version : '1.0'
author  : rally
name    : LMATRIX
family  : SYSTEM


VAR_INPUT
  // Eingangsparameter
  Part_NO: STRING[8];    //Part-No
END_VAR


VAR_OUTPUT // Ausgangsparameter
  Output_1: Bool;    //Farbmatrix Ausgang 1 von 4 
  Output_2: Bool;    //Farbmatrix Ausgang 2 von 4 
END_VAR


VAR_TEMP
    // temporäre Variablen
  I: INT;
  EQ: BOOL;
  Temp_String1: STRING[8];
  Temp_String2: STRING[8];
  Laengenmatrix: BYTE;
  atLaengenmatrix AT Laengenmatrix: ARRAY[1..8] of BOOL;
END_VAR


FC252 := 0;
EQ := 0;
Output_1 := False;
Output_2 := False;


// Anweisungsteil
FOR I := 1 TO 50 DO
  
   Temp_String1 := "S52_Laengentabelle".Laengenmatrix[I].Part_No;
   Temp_String2 := Part_NO;
    
   EQ := EQ_STRNG(S1 := Temp_String1 // IN: STRING
            ,S2 := Temp_String2  // IN: STRING
            ); // BOOL
   IF EQ THEN
      Laengenmatrix := "S52_Laengentabelle".Laengenmatrix[I].Laengenmatrix;
      Output_1 := atLaengenmatrix[1];
      Output_2 := atLaengenmatrix[2];
      FC252 := I;
      EXIT;
   END_IF; 
END_FOR;   
  
END_FUNCTION

Der DB ist dabei als Array of String definiert (bzw. bei mir als Array of Struct mit einem String und einer Bitmatrix)
Mit einer halbwegs schnellen SPS geht das in meinem Fall ohne Aufteilung auf mehrere Zyklen.
 
Zuletzt bearbeitet:
Danke für die Antworten, ich muss erst mal mit AWL Schreiben müssen.
Also ich hatte gerade ein Gespräch mit Kollegen. Wir benötigen eine DB Tabelle max. mit 20 Barcodes als String. Nur in der Tabelle wird gesucht.
Ich verwende CPU 315F und es wird eigentlich keine weitere Aufgaben haben als gescannte Barcodes zu vergleichen. Ich denke ich brauche nicht auf die Zykluszeit zu achten.
 
Wenn es schnell sein soll und die Barcodes mehr oder weniger statisch sind, würde ich die Barcodes im DB schon sortiert ablegen, und dann mittels binärer Suche prüfen ob der gesuchte Barcode vorhanden ist.
Entweder du sortierst den DB schon im Offline-Projekt, oder schreibst eine Funktion die die Codes entweder einmalig initial oder auf Anforderung sortiert.

Wenn die SPS aber wirklich sonst nichts zu tun hat, kannst du auch mit dem Holzhammer loslegen und von vorne bis hinten durchsuchen. Hängt auch davon ab wie weit sich die Barcodes voneinander unterscheiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Goeky,
ich habe mal vor 2 Jahren eine Suchfunktion für Datenbausteine in AWL geschrieben. Damit kann man innerhalb eines Datenbausteins nach allen Formaten (von Bit bis String) und auch nach UDT's suchen.
Wenn du mir sagen kannst wie genau der Barcode abgelegt wird mit Zeitstempel, Zeichenlänge etc. pass ich dir das Programm an und kann dir den Baustein hier posten.

MfG
Martin

Edit:
Mal ein Programmauszug.
Bisher läuft die SUFU so das er einen 32-Zeichen-String innerhalb eines DB's sucht.
Die SUFU kann Zwischensprünge machen und in einer anderen SUFU habe ich sogar eingebaut mehrere Vergleiche innerhalb eines Zykluses zu machen, kann ich hier ggf. auch Nachtragen.
Wenn Interesse besteht einfach bescheid sagen :)
Code:
NW2: Zähler für Suchlauf nach UDT/String im DB
    U     #String_gefunden
    SPB   N3S1
    L     #DB_LEN
    L     #UDT_LEN
    -I    
    L     #Zaehler_SUFU
    ==D   
    SPBN  N1S1
    L     #Offset
    SPA   N1S2
N1S1: L     #UDT_LEN
       +D    
N1S2: T     #Zaehler_SUFU

NW3: erste Übereinstimmung im String finden
    L     #Zaehler_SUFU
    L     2
    +D    
    L     P#1.0
    *D    
    T     #P_UDT
    AUF   #DB_Nr
    L     DBB [#P_UDT]
    L     #ID[2]
    ==D   
    S     #String_gefunden
    NOT   
    BEB   

NW4: Zähler für Suchlauf nach String im DB
N3S1: L     #Zaehler_Vergleich_String
       L     31
       ==D   
       SPBN  N3S2
       L     0
       SPA   N3S3
N3S2: L     #Zaehler_Vergleich_String
       L     1
       +D    
N3S3: T     #Zaehler_Vergleich_String


NW5: Zähler für Vergleichswert
      L     #Zaehler_String_IN
      L     31
      ==D   
      SPBN  N4S1
      L     0
      SPA   N4S2
N4S1: TAK   
      L     1
      +D    
N4S2: T     #Zaehler_String_IN
 
Zuletzt bearbeitet:
Zurück
Oben