Werte in einem DB suchen und vergleichen

Kodan

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

möchte ein Auswahlmenü mit einem Op7 erstellen.
D.H. ich habe einen DB in dem ich Daten ablege.

Lege ein Array das folgende Stuktur hat.

0.0 String[20] Inhalt `28-0204-01A´ als Anfangs bzw. Aktualwert
22.0 String[20] Inhalt `Produktname X´ als Anfangs bzw. Aktualwert
44.0 INT 4 als Anfangs bzw. Aktualwert

dieses Array wiederholt sich nun x Mal... D.h. alle 46 Byte kommt ein neuer Datensatz.

Meine Frage wie kann ich nun gezielt nach dem Sting/Wert 28-0204-01A im DB suchen (Wert natürlich variabel) ?

Habe nun wirklich lange im Forum gesucht aber leider nichts gefunden bzw. evtl den falschen Suchbegriff benutzt.

Gruß
 
...
0.0 String[20] Inhalt `28-0204-01A´ als Anfangs bzw. Aktualwert
22.0 String[20] Inhalt `Produktname X´ als Anfangs bzw. Aktualwert
44.0 INT 4 als Anfangs bzw. Aktualwert

dieses Array wiederholt sich nun x Mal... D.h. alle 46 Byte kommt ein neuer Datensatz.
...

Das ist kein Array.

Ich würde erstmal diese Struktur aus den drei werten in eine UDT Packen und in dem DB wirklich ein Array mit dem Type des UDTs anlegen.

Dann in SCL einfach eine Forschleife bauen die das Array durchsucht und immer das erste Element des UDTs mit dem Vergleichswert vergleicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo danke für die Antwort...

Über die Struktur eines UDT werd ich mich noch schlau machen...

Mit SCL ist es nicht weit her bei mir....

Wäre für weite hilfe dankbar..

Gruß
 
Du mußt einen SFC20 mit zwei Anypointern bestücken die du dir selbst schreibst.

Anschliessend verwende den FC10 aus der bibliothek "EQ_String"

SFC20 brauchst du um dir den ganzen String zb. in einem DB zu schreiben um in für FC10 zum vergleich zu laden.

für die Start - Adresse in deinem DB nimm ein MW und erhöhe es um 1 wenn der String-Vergleich nicht zu einem "gefunden" führt.

Den Zähler mit 46 Multiplizieren.
 
...
Mit SCL ist es nicht weit her bei mir....

Wäre für weite hilfe dankbar..

Code:
TYPE myUDT
    STRUCT
      ID     : STRING[20];
      P_NAME : STRING[20];
      VALUE  : INT;
    END_STRUCT
END_TYPE
Code:
DATA_BLOCK myDB
    STRUCT
      myArray : ARRAY[0..99] OF myUDT;
      Target : STRING[20];
      Result : myUDT;
    END_STRUCT
BEGIN

END_DATA_BLOCK
Code:
FUNCTION myFC : myUDT

VAR_INPUT
    myTarget : STRING[20];
END_VAR

VAR_TEMP
    i : INT;
    tmpUDT : myUDT;
    tmpTarget : STRING[20];
END_VAR

VAR_OUTPUT
    ElementNumber : INT;
END_VAR

    ElementNumber := -1;        
    tmpUDT.ID := '';
    tmpUDT.P_NAME := '';
    tmpUDT.VALUE := 0;
    
    tmpTarget := myTarget;
    
    FOR i := 0 TO 99 DO
        IF myDB.myArray[i].ID = tmpTarget THEN
            tmpUDT := myDB.myArray[i];
            ElementNumber := i;
            EXIT;
        END_IF;        
    END_FOR;
    myFC := tmpUDT;
END_FUNCTION

Projekt im Anhang.
 

Anhänge

  • StringDB.zip
    34,4 KB · Aufrufe: 25
Zuviel Werbung?
-> Hier kostenlos registrieren
Kommentare zum Fc
Code:
FUNCTION myFC : myUDT

VAR_INPUT
    myTarget : STRING[20]; (* Was gesucht wird *)
END_VAR

VAR_TEMP
    i : INT; (* Schleifenzähler *)
    tmpUDT : myUDT; (* Temporäres Ergebnis *)
    tmpTarget : STRING[20]; (* SIEMENS Rotz die können nicht mit dem String aus dem VAR_INPUT arbeiten ;o( *)
END_VAR

VAR_OUTPUT
    ElementNumber : INT; (* Hab ich nachgefügt fals die Elementnummer wichtig ist *)
END_VAR
    (* Alles ablöschen *)
    ElementNumber := -1;        
    tmpUDT.ID := '';
    tmpUDT.P_NAME := '';
    tmpUDT.VALUE := 0;
    
    tmpTarget := myTarget; (* Siehe Variablendeklaration *)
    
    FOR i := 0 TO 99 DO  (* Suchschleife *)
        IF myDB.myArray[i].ID = tmpTarget THEN (* Vergleich *)
            tmpUDT := myDB.myArray[i]; (* gefunden *)
            ElementNumber := i;
            EXIT; (* Suche beenden *)
        END_IF;        
    END_FOR;
    myFC := tmpUDT; (* Rückgabewert beschreiben *)
END_FUNCTION
 
Danke für die Hilfe...
Werde es sofort ausprobieren....

Melde mich wieder wenns funktioniert oder ich noch Hilfe benötige....

Gruß
 
OB 1 nicht übertragbar

Hallo Zotos,

bin gerade am probieren.
Leider kann ich den OB1 nicht ins AG laden da ein Fehlerangezeigt wird.
Unzulässiger Befehl im Baustein.Bausteinadresse 42.

Auch mit dem DB bzw.der Vat komm ich nicht ganz klar..

Gruß
 
Evtl. deklarier oder vergess ich was...

Hab dein Projekt geladen und wollte es so übertragen...Dann die Fehlermeldung... Ist ne 315-dp ..Denke an der Hardware sollte es nicht liegen...Oder?

Gruß
 
Hallo Zotos,

ganz so unerfahren bin ich nun auch nicht...
Hab alles übertragen...nur der OB 1 funktioniert nicht....
Aber Mom.. ich kontrollier nochmal...


Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der FC 220 wird auch nicht übertragen...
Deshalb...die Fehlermeldung im OB1

ungültige Bausteinummer

Gruß

:?: ... eigentlich nicht möglich! ... unten in der fehlermeldung ist ein button hilfe, einfach mal drauf klicken!

@zotos: ich hatte mir das projekt nicht gezogen gehabt, sonst hätte ich natürlich gesehen, dass bei bausteinadresse 42 der FC220 aufgerufen wird! :rolleyes:
 
Hi,,


Laden (33:280)
Beschreibung:
ONLINE:
· Meldung von der Baugruppe: D210 = Bausteinnummer unzulässig.
· Die Bausteinnummer ist für diese Version der CPU ungültig.
· Die geladene Konfiguration ist für die ausgewählte Zielbaugruppe nicht zulässig

Wie gesagt.. ne 315-Dp V1.2.0.... zum Testen...
Gruß
 
Hallo Vierlagig..

Wenn ich dies explizit machen muß dann nein...
Dachte die SFC und SFB gehen automatisch...

Was muss ich machen?

Gruß
 
Hi,,


Laden (33:280)
Beschreibung:
ONLINE:
· Meldung von der Baugruppe: D210 = Bausteinnummer unzulässig.
· Die Bausteinnummer ist für diese Version der CPU ungültig.
· Die geladene Konfiguration ist für die ausgewählte Zielbaugruppe nicht zulässig

Wie gesagt.. ne 315-Dp V1.2.0.... zum Testen...
Gruß


Leg deine Bausteine in einen Bereich unter 128 und es wird gehen...... ganz sicher!!!!!
 
Zurück
Oben