Werte in DB vergleichen und wegspeichern

anne

Level-1
Beiträge
347
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr,

ich brauche bitte etwas Unterstützung.

In einem DB12 ist ein ARRAY [1..50] mit Namen Messwerte angelegt. Innerhalb des Arrays befindet sich ein STRUCT mit Wert1 bis Wert12.

Nun soll über ein Hilfsprogramm aus jedem Array der Wert1 auf den Eintrag 33 überprüft werden.


Bis hierher hätte ich folgenden Vorschlag:


FOR Count := 1 TO 50 BY 1 DO

IF DB12.Messwerte[Count].Wert1 = 33 THEN

.
.
.

END_IF;

END_FOR;


Das Problem ist nun, wie könnte ich es bewerkstelligen, dass von den durchsuchten Werten (also jeweils Wert1) mit dem Eintrag 33 die Adresse in einem separaten DB aufgelistet wird?


Lieben Dank für einen Vorschlag!
 
Hi,

bin evtl. noch ein kleines Stückchen weitergekommen... mein Code sieht nun wie folgt aus:

adr := -1; // Eintrag, wenn nichts gefunden wurde

FOR Count := 1 TO 50 BY 1 DO

IF DB12.Messwerte[Count].Wert1 = 33 THEN

adr := Count;
EXIT;

END_IF;

END_FOR;


Nun besteht noch das Problem, dass nur der erste gefundene Wert 33 weggespeichert wird. Kann ich das umbauen, dass alle gefundenen Werte weggespeichert werden?

Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi,

adr als array mit der gleichen größe definieren (u.U. kann ja in allen der suchwert stehen), zähler auf eins initialisieren und um eins hochzählen wenn du den suchwert (hier 33) gefunden hast.

mfg
 
Vielleicht so :
Code:
id adr = -1 then adr := count ; end_if ;

Danke für die Antworten!

@LL:
Das verstehe ich leider nicht...
In meinem Code steht ja unter "adr" dann die Zählernummer, bei der der Wert 33 gefunden wurde. Der Wert 33 kann mehrmals im DB vorkommen!

"adr" ist ja nur dann -1, wenn Nichts gefunden wurde.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Anne:
Genau ... und nur wenn bislang nichts gefunden wurde soll ja auch der Wert in die Liste - so hatte ich es jedenfalls verstanden, da du ja das erste Auftauchen der 33 wissen wolltest.
Aber vielleicht wäre es ja auch besser gewesen, es als vollständigen Code zu posten - also so :
Code:
adr := -1;      // Eintrag, wenn nichts gefunden wurde

FOR Count := 1 TO 50 BY 1 DO
      IF DB12.Messwerte[Count].Wert1 = 33 THEN
          if adr = -1 then adr := count ; end_if ;
     END_IF;

END_FOR;
... oder wolltest du etwas anderes ?

Gruß
Larry
 
Hm, also evtl. habe ich mich etwas unklar ausgedrückt.

Es kann vorkommen, dass in besagtem DB z.B. 4x der Wert 33 vorkommt.

Dann sollen mit einem Scan (Schleife) die Adressen (also der Wert ganz vorne im DB) weggespeichert werden, an denen der Wert 33 steht.


Lieben Dank...
 
... da ich jetzt immer noch nicht schlauer bin ...
Du möchtest also nicht wissen, das die erste 33 im Index 12 steht sondern möchtest wissen, dass im Index 12, 15, 33 und 39 jeweils der Wert 33 eingetragen wurde ?


Wenn ja, dann war der Hinweis von Testuser im Grunde der richtige Ansatz.
...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du möchtest also nicht wissen, das die erste 33 im Index 12 steht sondern möchtest wissen, dass im Index 12, 15, 33 und 39 jeweils der Wert 33 eingetragen wurde ?
...

Ja genau, ich möchte alle Adressen wissen, an denen die Zahl 33 eingetragen ist.

Habe mich schon mit den Ansatz von Testuser beschäftigt - komme aber noch nicht so recht weiter...
 
Habe das Ganze jetzt nochmals versucht - habe jetzt zwei DB's.

Aber ich bekomme einen Bereichslängenfehler und die Sps geht auf Stop!

Mein Code:

FOR Count := 1 TO 30 BY 1 DO

IF DB12.Messwerte[Count].Wert1 = 33 THEN

DB1.adr[Count] := 33;

END_IF;

END_FOR;


Die beiden DB's:

DB1.jpgDB2.jpg
 
... so wie du es dargestellt hast sollte es funktionieren.
Ich kann allerdings nicht erkennen, ob der DB12 auch 30 Elemente hat.
Der Bereichslängenfehler deutet jedenfalls darauf hin, dass du einen Index adressieren willst, der nicht existiert ...

Ganz generell ist es für solche Experimente immer schönen, wenn man die Variablen mit in der Instanz des auswertenden Bausteins hat - der DB1 (und eigentlich auch die Quelldaten des DB12) könnten Bestandteil der Instanz deines FB sein ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe das Ganze jetzt nochmals versucht - habe jetzt zwei DB's.

Aber ich bekomme einen Bereichslängenfehler und die Sps geht auf Stop!

Mein Code:

FOR Count := 1 TO 30 BY 1 DO

IF DB12.Messwerte[Count].Wert1 = 33 THEN

DB1.adr[Count] := 33;

END_IF;

END_FOR;


Die beiden DB's:

Anhang anzeigen 17718Anhang anzeigen 17719

DB1.adr[Count] := 33; ist meines erachtens falsch, da hast du dann ein array mit den einträgen '0' und '33'.

hier mal mein quelltext (ungetestet) dazu, es entsteht eine liste (speicherort) die alle positionen des suchwertes enthält.

Code:
// Suche nach Wert
FOR #count := 1 TO 50 BY 1 DO
  // Initialisierung
  IF #count = 1 THEN
    #i := 1;
  END_IF;
  IF "DB_Messwerte".MW[#count] = 33  THEN
    "DB_Suchergebnisse".Speicherort[#i] := #count;
    #i := #i + 1;
  END_IF; 
END_FOR;
 
Danke testuser für deinen Vorschlag - aber irgendwie klappt es nicht!

Bekomme schon beim Übersetzen Fehler und weiß nicht warum?

Habe mal alles gepostet was ich so verbrochen habe; evtl. könntest du da nochmals draufschaun, lieben Dank!


Uebersetzung.jpgFC.jpgDB1.jpgDB12.jpg
 
Die Variable Speicherort: INT müßte doch nicht im Temp angelegt werden.

Die Adressierung "DB_Suchergebnisse.Speicherort"[...] ist doch fix als integer im DB

Gleiches für MW

Die darf man doch nicht deklarieren, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Verpolt:
Das sind dann aber doch 2 verschiedenen Variablen.
Die Fehlermeldung, an der Anne hängt, besagt aber, dass SCL das Element für die Zuweisung ("DB_Suchergebnisse".Speicherort[...]) nicht adressieren kann - heißt es findet das nicht ...

@Anne:
In dem Script sehe ich so weiter keinen Fehler ...
Ich würde allerdings das "i" fest vor der FOR-Schleife auf 1 setzen und mit den Kram in der Schleife mit "IF Count =1" ganz sparen. Das macht das Ganze auf jeden Fall sicherer ...

Schön wäre es aber wenn du doch mal keine Bilder sondern den "echten" Text hier einstellen würdest ...

Gruß
Larry
 
So, bin ein kleines Stückchen weiter...

Habe jetzt anstatt MW im DB einfach mal Werte geschrieben und siehe da, das frißt der Editor - wurde das evtl. als Merkerwort gedeutet?
Also "IF DB_Messwerte.Werte[count] = 33 THEN" wird akzeptiert!


Aber schon folgt das nächste Problem:

In dem Datenbaustein "DB_Suchergebnisse" tut sich rein gar nichts.

Bin hier grad arg überfordert!

1) Wenn ich über die Variablentabelle z.B. in DB12.DBB0 die 33 einschreibe, so steht unter Statuswert auch die 33. Im DB12 steht als Aktualwert aber 8481 - woher kommt das?

2) Verstehe auch die Funktion von i nicht so ganz...

Wenn in dem Array von DB_Messwerte an einer Stelle die Zahl 33 steht, dann sollte doch im Array von DB_Suchergebnisse an entsprechender Stelle der Wert von count stehen, oder?
Und warum wird am Ende i stets um eins erhöht?


Danke für eine Aufklärung meiner Mißstände... ;)
 
Zuletzt bearbeitet:
Hallo Anne,
ich beziehe mich mal auf das folgende Script (von mir aus Text und nich als Bild gepostet) :
Code:
// Initialisieren
#i := 1;
FOR #count := 1 TO 50 BY 1 DO
   "DB_Suchergebnisse".Speicherort[#count] := 0;
END_FOR;

// Suche nach Wert
FOR #count := 1 TO 50 BY 1 DO
    IF "DB_Messwerte".MW[#count] = 33  THEN
        "DB_Suchergebnisse".Speicherort[#i] := #count;
        #i := #i + 1;
   END_IF; 
END_FOR;
i wird auf 1 gesetzt. Das ist im Ziel-DB (also DB_Suchergebnisse der Index wohin geschrieben werden soll). Der Ziel-Speicher wird gelöscht - also alle alten Ergebnisse entfernt.
Die Schleife durchläudt die Liste mit den erfassten Werten. Nun wird irgendwo eine 33 gefunden. Nun wird dann im Ziel-DB an Position des Index (i) die Position, wo im Quell-DB die 33 steht (count) abgelegt und der Index um 1 erhöht. Das bewirkt dann, dass die nächste gefundene 33-Position im nächsten Speicherort abgelegt wird.
Sähe deine Liste also z.B. so aus : 1,2,33,4,5,6,7,8,9,33,... dann würde im Ziel-DB dann 3,10,... als Ergebnis stehen.

Gruß
Larry
 
Zurück
Oben