TIA Datenbaustein nach bestimmten Wert durchsuchen

Daniel_B.

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

ich bräuchte zu folgender Thematik etwas Hilfe:

Ich programmiere (TIA V15) aktuell eine Fördertechnik Anlage mit einem Sick lector 630 Kamerasystem welches ein Data Matrix Code ließt. Ich verwende hierzu den Sick Standard Baustein in meiner CPU1511 --> Dies funktioniert auch ohne Probleme. In diesem Code stehen jeweils die Locationen wo ich die Pakete ausschleusen muss. Vor jedem Code steht das kürzel "2L" und danach ca. 6 Byte lang das was ich gerne lesen würde. Den von der Kamera gelesen Code möchte ich nun durchsuchen auf diese "2L" und die nächsten 6 Bytes nach dem "2L" in einen extra Datenbaustein verschieben. Hintergrund ist, dass der Locationen Code immer in einem anderen Datenbereich steht. Siehe auch Bilder: (Beispiel Code 66LD)

Bild_2.jpgBild_1.jpg

Danach möchte ich die 6 Bytes mit den 30 festen Codes vergleichen (Z.B. ein Code ist: 66LD, 6LH usw.) und auf bestimmte Bahnen ausschleusen.

Da ich alles in SCL machen muss und mich damit nicht so gut auskenne, wäre ich sehr dankbar wenn mir jemand sagen kann wie ich dies programmieren kann um den DB zu durchsuchen. Am besten wäre wenn mir jemand genau den SCL Code sendet. :D Vermutlich mit einer For Schleife, oder?

Freue mich auf eure Hilfe.

Viele Grüße

Daniel
 
Hallo, da es ein String ist würde ich mit den Siemens FCs FIND, MID und COMPARE arbeiten.

Mit FIND bestimmst du die Position von „2L“. Mit MID kopierst du den Teil des Strings den dir FIND gibt in eine andere Stringvariable, welche du mit COMPARE (oder bei 1200/1500) mit normalen Vergleicher auf deinen 30 Codes vergleichst. Die FCs müsstest du Rechts bei Erweiterte Anweisung - Strings oder so ähnlich finden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was heißt ca. 6 Zeichen? Entweder es ist eine gleichbleibende Länge oder du brauchst noch eine Endekennung.
Außerdem sprichst du von 6 Zeichen nach der Kennung '2L', zeigst dann aber 4 Zeichen in deinem Bild.
 
Normalerweise gibt es hier nicht sofort Code, sonst mutiert das hier zum Hausaufgabenforum.
Ich gehe mal davon aus, du hast noch ein paar weitere Probleme zu lösen.

Daher hier mal 2 Funktionen, die dir bei der oben angefragten Problematik helfen, insofern deine Frage korrekt gestellt war.
Ich hab mal die "Unklarheit" in deiner Fragestellung mit berücksichtigt, daher ist es leicht komplizierter, als es sein müßte,

Lege einen FC an, im Temp-Bereich folgende Deklarationen:

i : Int
Code_Len : Int

Dann einmal dein DB, im Code mußt du noch das richtige "Fach" anpassen
Dann einmel ein 2. DB (Codebaustein)von mir:

Suchcode: String
Zielcode: Array[0..30] of String
Fundstelle: Int



Hier der Code:

Code:
//'2L' suchen und wenn gefunden ablegen
//mal angenommen, dein Array ''Barcode" geht von 0 bis 255

FOR #i := 0 TO (255 - 9) DO
    
    "Codebaustein".Suchcode := '000000';  //6 Füllzeichen für den zukünftigen Code in den String schreiben
    IF "Datenplätze".Datenplatz_1.Barcode[#i] = '2' AND "Datenplätze".Datenplatz_1.Barcode[#i + 1] = 'L' THEN
        "Codebaustein".Suchcode[1] := "Datenplätze".Datenplatz_1.Barcode[#i + 2];
        "Codebaustein".Suchcode[2] := "Datenplätze".Datenplatz_1.Barcode[#i + 3];
        "Codebaustein".Suchcode[3] := "Datenplätze".Datenplatz_1.Barcode[#i + 4];
        "Codebaustein".Suchcode[4] := "Datenplätze".Datenplatz_1.Barcode[#i + 5];
        "Codebaustein".Suchcode[5] := "Datenplätze".Datenplatz_1.Barcode[#i + 6];
        "Codebaustein".Suchcode[6] := "Datenplätze".Datenplatz_1.Barcode[#i + 7];
        EXIT;
    END_IF;
END_FOR;


//in DB "Codebaustein" stehen in einem Array die möglichen Vergleichscodes (kannst du fest oder über HMI variabel machen)
//der Code liefert eine Nummer zurück, die der Stelle des gefundenen Codes im Array entspricht.
//0 = nichts gefunden

"Codebaustein".Fundstelle := 0;
IF "Codebaustein".Suchcode <> 'xxxxxx' THEN
    FOR #i := 1 TO 30 DO
        #Code_Len := LEN("Codebaustein".Zielcode[#i]);
        IF #Code_Len > 0 THEN
            IF "Codebaustein".Zielcode[#i] = LEFT(IN := "Codebaustein".Suchcode, L := #Code_Len) THEN
                "Codebaustein".Fundstelle := #i;
                EXIT;
            END_IF;
        END_IF;
    END_FOR;
END_IF;

Der Code holt imer 8 Zeichen nach '2L aus dem DB.
Dann prüft er gegen die 30 Platze im DB "Codebaustein", wobei es reicht, wenn der Code aus 'Codebaustein' in den 6 gefundenen Zeichen, ab dem 1. enthalten ist. Das funktioniert also auch, wenn
dein Code im 'Codebaustein' nur 3 Zeichen hat.
Ausgegeben wird eine Nummer, die dem Platz entspricht, bei 0 wurde nichts gefunden.
Damit ist der Vergleich erledigt, du kannst z.Bsp. mit den Nummern weiterarbeiten oder in einer Case-Struktur ('F1' und Case eingeben) jeweils geziehlt Code abarbeiten.

FOR #i := 0 TO (255 - 9) DO

'-9' ist wichtig. 1. hat es keinen Sinn, weiter nach '2L' zu suchen, wenn der Platz für den Code dahinter nicht mehr reicht.
2. ist dummerweise in den letzten 9 Zeichen ein '2L' käme es im folgenden Code zum Zugriff auf berechnete Array-Elemente, die es gar nicht gibt --> GANZ SCHLECHT IN EINER SPS
Daher auch die Frage, ob die Länge deiner Zeichenfolge denn wirklich variiert, hier könnte eine Zeichenfolge nicht gefunden werden. Geht auch anders zu machen (mit Abfragen im Code, ob der
berechnete Index im Arry liegt), aber wenn nötig, kannst du das selbst noch abändern. Ich vermute es ist ok so, '2L' wird eher nie ganz weit hinten stehen, wenn noch Folgeinformationen im Code stehen.

Der Code ist als Beispiel zu verstehen, normalerweise würde ich das noch schön kapseln, also mit INPOUT, OUTPUT und INOUT versehen, so dass man nicht direkt in die DB greift und den Baustein variabler einsetzen kann. Außerdem wird er immer abgearbeitet, was für die Zykluszeit fatal ist, wenn man viele soche Dinge macht. Daher noch ein Startbit vorsehen, das dafür sorgt, das der Code nur abgearbeitet wird, wenn man das Ergebnis auch benötigt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,

auch Dir vielen Dank für deine Hilfe. Habe das jetzt aber mit dem Find String ziemlich einfach lösen können.

Du hast recht, das nächste Mal Frage ich nicht gleich nach einem Code. :)

Gruß

Daniel
 
Zurück
Oben