# Werte in einem DB suchen und vergleichen



## Kodan (20 Februar 2009)

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ß


----------



## zotos (20 Februar 2009)

Kodan schrieb:


> ...
> 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
> ...



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.


----------



## Kodan (20 Februar 2009)

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ß


----------



## Gerri (20 Februar 2009)

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.


----------



## zotos (20 Februar 2009)

Kodan schrieb:


> ...
> Mit SCL ist es nicht weit her bei mir....
> 
> Wäre für weite hilfe dankbar..




```
TYPE myUDT
    STRUCT
      ID     : STRING[20];
      P_NAME : STRING[20];
      VALUE  : INT;
    END_STRUCT
END_TYPE
```


```
DATA_BLOCK myDB
    STRUCT
      myArray : ARRAY[0..99] OF myUDT;
      Target : STRING[20];
      Result : myUDT;
    END_STRUCT
BEGIN

END_DATA_BLOCK
```


```
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.


----------



## zotos (20 Februar 2009)

Kommentare zum Fc

```
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
```


----------



## Kodan (20 Februar 2009)

Danke für die Hilfe...
Werde es sofort ausprobieren....

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

Gruß


----------



## Kodan (23 Februar 2009)

*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ß


----------



## vierlagig (23 Februar 2009)

was steht denn bei bausteinadresse 42 für ein befehl?


----------



## Kodan (23 Februar 2009)

Hi Vierlagig,

Ist von Zotos ein FC..siehe oben..!

Gruß Kodan..


----------



## Kodan (23 Februar 2009)

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ß


----------



## zotos (23 Februar 2009)

vierlagig schrieb:


> was steht denn bei bausteinadresse 42 für ein befehl?


Spann ihn nicht so auf die Folter!

Der OB1 alleine genügt ja auch nicht. Du musst natürlich auch den FC und den DB in AG laden.


----------



## Kodan (23 Februar 2009)

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ß


----------



## Kodan (23 Februar 2009)

Der FC 220 wird auch nicht übertragen...
Deshalb...die Fehlermeldung im OB1

ungültige Bausteinummer

Gruß


----------



## vierlagig (23 Februar 2009)

Kodan schrieb:


> Der FC 220 wird auch nicht übertragen...
> Deshalb...die Fehlermeldung im OB1
> 
> ungültige Bausteinummer
> ...


 
:?: ... 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!


----------



## zotos (23 Februar 2009)

eine 315er? Da können einige nur bis FC128


----------



## Kodan (23 Februar 2009)

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ß


----------



## vierlagig (23 Februar 2009)

hast du systemdaten angelegt?


----------



## Kodan (23 Februar 2009)

Hallo Vierlagig..

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

Was muss ich machen?

Gruß


----------



## Lipperlandstern (23 Februar 2009)

Kodan schrieb:


> Hi,,
> 
> 
> Laden  (33:280)
> ...




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


----------



## vierlagig (23 Februar 2009)

eine hardwarekonfiguration durchführen und übertragen!


----------



## Kodan (23 Februar 2009)

Kann ich den den FC einfach umbenennen?

Zotos hat mir ja freundlicherweise das kompl. Projekt zugeschickt..Hab keine SCL compiler...

Denke nur umbenennen geht nicht oder?


----------



## vierlagig (23 Februar 2009)

Kodan schrieb:


> Denke nur umbenennen geht nicht oder?


 
doch geht
mußt auch den aufruf im ob1 aktualisieren


----------



## Kodan (23 Februar 2009)

HW-Konfig durchgeführt und übertragen...

gleiches Fehlerbild..

ist meine Standard Test-SPS....immer gleich HW-Konfig..
Habe nur die Bausteine von Zotos reinkopiert...vorher auch Urgelöscht...

Gruß


----------



## vierlagig (23 Februar 2009)

Kodan schrieb:


> HW-Konfig durchgeführt und übertragen...
> 
> gleiches Fehlerbild..
> 
> ...


 
alter krüppel - wird zeit für ne neue!


----------



## Kodan (23 Februar 2009)

Habe den Aufruf erneuert...

aber bei mytraget
und RET_VAL 
gibts jetzt ne Fehlermeldung...

CALL  "myFC"
       myTarget     :=P#DB220.DBX4600.0 BYTE 22
       RET_VAL      :=P#DB220.DBX4622.0 BYTE 46
       ElementNumber:=MW220
      NOP   0

Zur SPS
Habe schon ne neue 314C  muß dies aber alles vorher Testen.
Maschine muss laufen..

Gruß


----------



## Kodan (23 Februar 2009)

Hallo,

so klappt nun alles übertragen ohne fehler..
jetzt kann ich mal ausprobieren...

Danke bisher...


----------



## zotos (23 Februar 2009)

Im Anhang ist die geänderte Version.

Du hast auch geschrieben das Du mit dem DB und der VAT auch nicht klar kommst. Woran scheitert es den dort?

Ich habe in der geänderten Version mal die Anzahl der Arrayelemente auf 20 reduziert [0..19].


----------



## Kodan (23 Februar 2009)

Hallo,


also ich weiss auch nicht..

Komme irgendwie nicht klar..
War jetzt in der VAR...habe auch die vorgegebenen Werte "gesteuert" komme aber einfach nicht auf denTrichter wie es funktionieren soll...

Wo muß ich den Suchbegriff eingeben..??...Steh auf dem Schlauch..


???
Gruß


----------



## Kodan (23 Februar 2009)

Sorry...

falls es jemand auf den Senkel geht...
Komm halt leider nicht weiter....

Muss ich den DB noch vorbelegen...denn der ist ja leer...
Welche Variable muss ich "füttern" damit ich nen RETVAL bekomme...


----------



## zotos (23 Februar 2009)

Welche Version nutzt Du denn? Damit wir vom gleichen schreiben.

Die VAT ist so aufgebaut das ganz ober der Suchbegriff eingegeben wird (das soll das "//gesuchte Produkt ID" anzeigen).

Dann Kommt das Ergebnis ("Result") Elementnummer (alte Version MW220 und im neuen MW20) und der Inhalt des gefundenen Elements.

Und am Schluss der VAT ist ein Ausschnitt aus dem Array ab dem Eintrag "//Ausschnitt aus dem Array".

Array beschreiben, Suchbegriff eingeben und Ergebnis anschauen.


----------



## Kodan (23 Februar 2009)

Habe eben deine "letzte" Version aufgespielt...
Gruß


----------



## Kodan (23 Februar 2009)

Also,

ich verstehe es so...
In der Var steht von DB20.DBB922-941 die 20 Zeichen des Stings die gesucht werden!

Soweit o.k.

Aber warum steht am Anfang auf Speicherstelle DBB920/921 ein Dez-Wert und Steuerwerte A-Z?

Seh den Zusammenhang noch nicht...

Ich hoffe ich bin nicht zu dumm hierfür....


Gruß


----------



## zotos (23 Februar 2009)

Kodan schrieb:


> Also,
> 
> ich verstehe es so...
> In der Var steht von DB20.DBB922-941 die 20 Zeichen des Stings die gesucht werden!
> ...



Ein String in der S7 ist wie folgt aufgebaut.

1. Byte: Maximale Länge des Strings (hier 20)
2. Byte: Aktuelle Länge des Strings (z.B. 4)
3. bis 22. Byte: Daten 

Wenn in Byte 2 eine 4 steht werden nur die bytes 3 bis einschließlich 6 verwendet.


----------



## Kodan (23 Februar 2009)

o.k.

Nun aber wie bekomme ich Daten in den DB...Kenne es mit Deklarationsansicht... Geht hier aber nicht wegen dem UDT..

Und wenn ich es testen möchte..Wie geh ich dann vor...

Und noch zum Schluß...Ich kann dies aber nachher auch den Db für bis zu 400 Produkt-IDs erweitern sofern es die CPU kann oder dann wieder ein größerer Aufwand...

Gruß Kodan... Bin halt in solchen Sachen Anfänger....


----------



## zotos (23 Februar 2009)

Wenn Du SCL hättest wäre die erweiterung auf 400 Einträge ein klax solange die CPU mit dem Monster DB klar käme (was ich aber bezweifele).

Zum DB das geht bei mir eigentlich Super einfach Quelle des DBs generieren und Aktualwerte eintragen:


```
DATA_BLOCK "myDB"
TITLE =
VERSION : 0.0


  STRUCT     
   myArray : ARRAY  [0 .. 19 ] OF "myUDT";    
   Target : STRING  [20 ];    
   Result : "myUDT";    
  END_STRUCT ;    
BEGIN
   myArray[0].ID := 'P001'; 
   myArray[0].P_NAME := 'Fritz'; 
   myArray[0].VALUE := 1; 
   myArray[1].ID := 'P002'; 
   myArray[1].P_NAME := 'Hans'; 
   myArray[1].VALUE := 2; 
   myArray[2].ID := 'P003'; 
   myArray[2].P_NAME := 'Klaus'; 
   myArray[2].VALUE := 3; 
   myArray[3].ID := ''; 
   myArray[3].P_NAME := ''; 
   myArray[3].VALUE := 0; 
   myArray[4].ID := ''; 
   myArray[4].P_NAME := ''; 
   myArray[4].VALUE := 0; 
   myArray[5].ID := ''; 
   myArray[5].P_NAME := ''; 
   myArray[5].VALUE := 0; 
   myArray[6].ID := ''; 
   myArray[6].P_NAME := ''; 
   myArray[6].VALUE := 0; 
   myArray[7].ID := ''; 
   myArray[7].P_NAME := ''; 
   myArray[7].VALUE := 0; 
   myArray[8].ID := ''; 
   myArray[8].P_NAME := ''; 
   myArray[8].VALUE := 0; 
   myArray[9].ID := ''; 
   myArray[9].P_NAME := ''; 
   myArray[9].VALUE := 0; 
   myArray[10].ID := ''; 
   myArray[10].P_NAME := ''; 
   myArray[10].VALUE := 0; 
   myArray[11].ID := ''; 
   myArray[11].P_NAME := ''; 
   myArray[11].VALUE := 0; 
   myArray[12].ID := ''; 
   myArray[12].P_NAME := ''; 
   myArray[12].VALUE := 0; 
   myArray[13].ID := ''; 
   myArray[13].P_NAME := ''; 
   myArray[13].VALUE := 0; 
   myArray[14].ID := ''; 
   myArray[14].P_NAME := ''; 
   myArray[14].VALUE := 0; 
   myArray[15].ID := ''; 
   myArray[15].P_NAME := ''; 
   myArray[15].VALUE := 0; 
   myArray[16].ID := ''; 
   myArray[16].P_NAME := ''; 
   myArray[16].VALUE := 0; 
   myArray[17].ID := ''; 
   myArray[17].P_NAME := ''; 
   myArray[17].VALUE := 0; 
   myArray[18].ID := ''; 
   myArray[18].P_NAME := ''; 
   myArray[18].VALUE := 0; 
   myArray[19].ID := ''; 
   myArray[19].P_NAME := ''; 
   myArray[19].VALUE := 0; 
   Target := ''; 
   Result.ID := ''; 
   Result.P_NAME := ''; 
   Result.VALUE := 0; 
END_DATA_BLOCK
```


----------



## Kodan (23 Februar 2009)

Hallo Zotos,

also langsam glaub ich das das Problem aus dem Ruder läuft....

Aber ob das mit der Datenflut überhaupt funktioniert so...Bezweifelst du ja selbst... Und es in mehere DB´s aufteilen verringert den Aufwand sicher nicht...

Was rätst du mir?...

Gruß Kodan..



Dachte es ginge Leichter in einem DB einen Datensatz zu lesen....


----------



## Mangokind (23 Februar 2009)

nimm doch einen integer als index statt nem string...

verlagert das problem in die visu 

ich weiß ja nicht, was das OP7 kann, aber vielleicht kommste mit nem integer und textlisten im OP weiter


----------



## zotos (23 Februar 2009)

Du hast ja im ersten Post die Vorgaben gemacht.

Also 20 Zeichen für die ID und 20 Zeichen für den Produktnamen so wie ein INT für einen Wert.

Wenn die ID nicht 20 Zeichen lang sein müsste würde das schon was sparen genau so beim Produktnamen. Da bei 400 Datensätzen jedes gesparte Byte in der Struktur gleich 400Bytes im gesamten DB sind.

Wenn sich daran nichts ändern läst könnte man auch drei DBs nehmen und auf die UDT verzichten also einen DB für die ID einen DB für den Produktnamen und einen DB für den wert. Jeweils ein Array mit 400 Elementen. 

Wie hast Du Dir das ganze denn so vorgestellt?


----------



## vierlagig (23 Februar 2009)

Mangokind schrieb:


> ich weiß ja nicht, was das OP7 kann, aber vielleicht kommste mit nem integer und textlisten im OP weiter


 
*ROFL* ... und das zum montag


----------



## Kodan (23 Februar 2009)

Hallo,

fehlt nur noch das tää tää tää...Ist halt Rosenmontag..

neh mal spass beiseite.

Prob im Moment...

Habe eine Steckersetzmaschine die ca. 80 Programme beinhaltet.
Schaue auf den Auftrag was für ein Produkt ich fertigen soll und suche mir das passende Prog. auf dem Zettel.Doof weil ich jedesmal "raten" darf welches Prog passt.

Würde gerne die Prod.Nummer nehmen und dem die Prog-Nummer zuweisen...dazu noch der Produktname...Dann einmal einrichten und fertig ...Ohne Blatt und hin und her...

Also z.b.   38-5567-564AX dazugehört Prog  1   Name Hunde 
               38-3245-334AN dazugehört Prog  2   Name Katze
               38-3289-324AN dazugehört Prog  2   Name Pferd

Im Moment muss ich alle 60 Prog am OP durchscrollen...Ist aber bei fast 400 nicht mehr lustig...

-> Zur Liste im OP...Sehr umständlich da ich jedesmal das PG brauch....
Hätte evtl. gedacht später es direkt am OP eingeben zu können...

Also...

Am OP eingeben : 38-5567-564AX -> Enter dann Anzeige 

38-5567-564AX
Hund                               ansonsten Datensatz nicht gefunden
Programm 1



Das mit den 20 Zeichen im String---> Op hat max 20 Zeichen  pro Zeile...

Die Nummer ist eigentlich max. 13 Zeichen lang wobei die ersten 3 immer Konstant sind...  38-...
Evtl. Maskieren... 


Danke und Gruß


----------



## jabba (23 Februar 2009)

Ich hab auch das Problem gehabt, zwar nicht mit der Eingabe am OP , aber die Daten gingen über mehrere DB's.
Hab das auch nach einem Lösungsvorschlag von Zotos umgesetzt.

.
Da die DB's zu gross wurden, habe ich vier für die Namen und jeweils einen für die Parameter.
Bei Dir könnte man z.B. Drei DB's nehmen (geht natürlich auch mit zwei)
DB1  : Produktnummer
DB2  : Produktname
DB3  : Programm

Nun muss nur der DB1 durchsucht werden, wenn gefunden wird jeweils über die Indexnummer der Produktname und das Programm aus den anderen DB's gelesen.

Ich hatte auch die Aufgabe 3000 typen auf einem OP77 darzustellen, hab das aber abgelehnt und ein TP177B genommen.


----------



## Kodan (23 Februar 2009)

Hallo,

ich denke das ist ein Ansatz..mit mehreren DB´s zu arbeiten.
Suche nochmals hier im Forum weiter...

Danke an alle beteiligten...Ich geb nicht auf...Hoff Ihr auch nicht...

An Zotos...Wenn wir mit mehreren DB arbeiten...-> kleinere Datenmengem können wird dann mit deiner Lösung weiter machen?


Gruß


----------



## jabba (23 Februar 2009)

Bin da dran,
Zotos kennt sich aber da besser aus, hab das Beispiel mal geändert.
Eingang zum Lesen Search
Eingang zum schreiben Save + Nummer wohin (1-400)
Was dann im UDT Result steht , soll gespeichert werden.
Läuft aber noch nicht, Lesen geht . schreiben noch nicht

```
TYPE myUDT
    STRUCT
      ID     : STRING[20];
      P_NAME : STRING[20];
      VALUE  : INT;
    END_STRUCT
END_TYPE

DATA_BLOCK myDB
    STRUCT
      Target : STRING[20];
      Result : myUDT;
    END_STRUCT
begin
END_DATA_BLOCK
DATA_BLOCK myTypDB1
    STRUCT
      myArray : ARRAY[1..200] OF myUDT;
    END_STRUCT
begin
END_DATA_BLOCK
DATA_BLOCK myTypDB2
    STRUCT
      myArray : ARRAY[201..400] OF myUDT;
    END_STRUCT
begin
END_DATA_BLOCK

FUNCTION myFC : INT
VAR_INPUT
    Target : STRING[20];
    Search : BOOL;
    Save   : BOOL;
    Nr     : INT;
END_VAR
VAR_TEMP
    i : INT;
    tmpUDT    : myUDT;   
    tmpTarget : STRING[20];
    tmpNumber : INT;
    SaveUDT   : myUDT;
END_VAR
VAR_OUTPUT
    Result : myUDT;
END_VAR
    tmpNumber := -1;        
    tmpUDT.ID := '';
    tmpUDT.P_NAME := '';
    tmpUDT.VALUE := 0;    
    tmpTarget := Target;
    IF search AND NOT save THEN
        FOR i := 1 TO 200 DO
            IF myTypDB1.myArray[i].ID = tmpTarget THEN
                tmpUDT := myTypDB1.myArray[i];
                tmpNumber := i;
                EXIT;
            END_IF;        
        END_FOR;
        IF (tmpNumber=-1) THEN
                
            FOR i := 201 TO 400 DO
                IF myTypDB2.myArray[i].ID = tmpTarget THEN
                    tmpUDT := myTypDB2.myArray[i];
                    tmpNumber := i;
                    EXIT;
                END_IF;        
            END_FOR;
        END_IF;
        Result := tmpUDT;
        
        myFC := tmpNumber;
    END_IF;
    IF NOT search AND save THEN   // ????????????
        Saveudt:=myDB.result;
        IF nr>0 AND nR<=200 THEN
          myTypDB1.myArray[nr]:=Saveudt;   
        END_IF;
    END_IF;    
END_FUNCTION
```


----------



## zotos (23 Februar 2009)

Das auf drei DBs aufzuteilen und auch die von Jaba zurecht ins Spiel gebrachte Schreibfunktion sind kein Problem.

Nur weis ich echt nicht was Du mit dem Programm anfangen willst Wenn Du es 1. nicht verstehst und 2. nicht mal SCL zur Verfügung hast.

Programm im Anhang und hier der Code der FCs (ich habe schreiben und lesen getrennt):

Lesen:

```
FUNCTION SuchProdukt : BOOL (* Retval = TRUE gefunden wenn er FALSE ist dann nicht. *)
VAR_INPUT
    InLese    : BOOL;     
    InGesucht : STRING[20]; (* Was gesucht wird *)
END_VAR

VAR_TEMP
    TmpGesucht : STRING[20]; (* lokale Kopie *)
    i : INT; (* Schleifenzähler *)
    Vorhanden : BOOL; (* Zeigt an ob gefunden oder nicht *)
END_VAR

VAR_OUTPUT
    OutSatznummer    : INT;
    OutProduktnummer : STRING[20];
    OutProduktname   : STRING[20];
    OutProduktwert   : INT;
END_VAR

    (* lokale Kopie *)
    TmpGesucht := InGesucht;

    (* Vorbelegung der Rückgabewerte *)
    OutSatznummer    := -1;
    Vorhanden        := False;
    OutProduktnummer := '';
    OutProduktname   := '';
    OutProduktwert   := 0;
    
    IF InLese THEN
        (* Suchenschleife *)
        FOR i := 0 TO 399 DO
            IF Produktnummer.Satz[i] = tmpGesucht THEN 
                (* Gefunden! *)
                OutSatznummer    := i; 
                OutProduktnummer := Produktnummer.Satz[i];
                OutProduktname   := Produktname.Satz[i];
                OutProduktwert   := Produktwert.Satz[i];
                Vorhanden := TRUE;
                EXIT;
            END_IF;
            
        END_FOR;
    END_IF;    
    SuchProdukt := Vorhanden;

END_FUNCTION
```
Schreiben:

```
FUNCTION SchreibProdukt : Void 
VAR_INPUT    
    InSatznummer    : INT;
    InProduktnummer : STRING[20];
    InProduktname   : STRING[20];
    InProduktwert   : INT;
END_VAR

VAR_TEMP
END_VAR

IF InSatznummer >= 0 AND InSatznummer <=399 then
    Produktnummer.Satz[InSatznummer] := InProduktnummer;
    Produktname.Satz[InSatznummer]   := InProduktname;
    Produktwert.Satz[InSatznummer]   := InProduktwert;
    OK := TRUE;
ELSE
    OK := FALSE;
END_IF;    

END_FUNCTION
```


----------



## Kodan (23 Februar 2009)

Danke Zotos,

du hast vielleicht mit einigem Recht was du sagst bezüglich verstehen usw.

Aber...

Man lernt nie aus....Hatte schon mal mit SCL zu tun BLK_MOV mit Vierlagig und da ging es auch...

Führe mir dein Prog. mal zu Gemüte...Denke mit der Zeit werde ich das meiste verstehen...Dauert halt..  Grab mich dann durchs Archiv....

Ich hoffe falls ich fragen hab wird es "trotzdem" nochmals erlaubt sein euch fragen zu dürfen...

Gruß Kodan


----------



## vierlagig (23 Februar 2009)

zotos schrieb:


> Nur weis ich echt nicht was Du mit dem Programm anfangen willst Wenn Du es 1. nicht verstehst und 2. nicht mal SCL zur Verfügung hast.


 
es ist doch trotzdem in AWL verfügbar - sieht zwar komisch aus, aber wenn man deine quelle daneben legt, könnte man es kommentieren 

@kodan: was ham wir mit BLK_MOV gemacht  ... ich bau doch viel lieber kopierschleifen als den SFC21 einzusetzen *ROFL*


----------



## zotos (23 Februar 2009)

Kodan schrieb:


> Danke Zotos,
> 
> du hast vielleicht mit einigem Recht was du sagst bezüglich verstehen usw.
> 
> ...



Ich meinte das auch nicht böse. Nur wenn Dir kein SCL zur Verfügung steht nützt Dir das ja nicht viel. Wenn Du mal was ändern willst/musst.

Fragen darfst Du ruhig stellen.


----------



## Kai (25 Februar 2009)

Kodan schrieb:


> Habe eine Steckersetzmaschine die ca. 80 Programme beinhaltet.
> Schaue auf den Auftrag was für ein Produkt ich fertigen soll und suche mir das passende Prog. auf dem Zettel.Doof weil ich jedesmal "raten" darf welches Prog passt.
> 
> Würde gerne die Prod.Nummer nehmen und dem die Prog-Nummer zuweisen...dazu noch der Produktname...Dann einmal einrichten und fertig ...Ohne Blatt und hin und her...
> ...


 
Wie viele Produktnummern und Programmnummern hast Du? 

Hast Du 400 Produktnummern und 80 Programmnummern?

Gruß Kai


----------

