Step 7 DB nach Array durchsuchen

TimeOUT

Level-1
Beiträge
125
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

ich suche eine Möglichkeit einen Datenbaustein in dem ich Arrays aus DWORD habe mit dem Inhalt eines DB, in dem das zu suchende Array (in DWORD) steht, zu vergleichen.
Anschließend soll mir ein Bit gesetzt werden, welches mir signalisiert das eine Übereinstimmung gefunden wurde und an welcher Adresse genau im DB.

Gibt es da eine Möglichkeit das in AWL zu realisieren oder gar schon eine vorhandene Funktion?

Viele Grüße
 
Ich verstehe deine Frage nicht genau.

Du hast beispielsweise DB1 in dem liegen 10 Variablen vom Typ Array[1..6] of DWORD. Und du hast einen DB2 in dem liegt eine Variable vom Typ Array[1..6] of DWORD.

Und jezt möchtest du wissen ob und wenn ja welche Variable im DB1 mit der in DB2 übereinstimmt.

Hab ich das richtig aufgenommen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau.

Ich brauche dann die Adresse des Arrays im DB1, welches zu dem überprüften von DB2 passt, damit ich es löschen kan (bzw. mit "0" auffülle)

Also es wird so sein, dass das Array aus DB2 exakt die gleichen Elemente besitzt, wie ein Array aus DB1
 
Das riecht nach índirekter Adressierung, zwei geschachtelten Schleifen und einem Vergleicher....

Kannst du mit den Begriffen was anfangen?
 
Bedeutet das, dass du jedes Element im DB1 mit jedem Element im DB2 vergleichen willst und wenn es eine Übereinstimmung gab löschen?

Aber dann brauchst du doch keine Adressen

L DB1.Array[0]
L DB2.Array[0]
==D
SPBN XXXX
L L#0
T DB1.Array[0]
XXXX: Nop 0

Und das jetzt für alle Elemente, was man in SCL eleganter lösen kann.

Oder verstehe ich jetzt, die Aufgabe falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und das jetzt für alle Elemente, was man in SCL eleganter lösen kann.

Oder verstehe ich jetzt, die Aufgabe falsch?

Jein, der TE will es aber in AWL.


Das riecht nach índirekter Adressierung, zwei geschachtelten Schleifen und einem Vergleicher....

Kannst du mit den Begriffen was anfangen?

Das vergleichen geht auch in nur einer Schleife, du kannst beide DB´s offen haben.

Ansonsten hast du recht mit deinem Lösungsansatz.
 
Hallo,

also mit einem Array geht auch die Funktion, die ich von der Siemens Website habe.
Das mit dem Vergleichen der Array-Elemente geht nicht so einfach, weil sich die Daten am Anfang oft gleichen nur die letzten Byte sich erst unterscheiden. Dann würde er mir Datensätze "abnullen" die er gar nicht soll.

Aber besteht auch die Möglichkeit in einem DB, der aus mehrmals der selben Struktur aus einem UDT aufgebaut ist den Eintrag herauszufinden, der dem Eintrag aus einem Vergleichs-DB entspricht?
Ich versuche das mal zu verdeutlichen:

DB1:
Telegram1.Data1 WORD
Telegram1.Data2 WORD
Telegram1.Data3 DWORD
Telegram1.Data4 DWORD

*im vergleichs DB2*

DB2:
Vergleich1 WORD
Vergleich2 WORD
Vergleich3 DWORD
Vergleich4 DWORD

Die Werte im DB2 werden in einem Fall ganz sicher mit einem Datensatz aus DB1 entsprechen. Allerdings gibt es im DB1 auch noch Telegram2/3/4 usw.
Deshalb sollte mir der Vergleich mitteilen, dass eine Übereinstimmung gefunden wurde und ab welcher Adresse im DB1 die Übereinstimmung erfolgt.


Viele Grüße
 
Das vergleichen geht auch in nur einer Schleife, du kannst beide DB´s offen haben.

Ansonsten hast du recht mit deinem Lösungsansatz.

Das schon, aber in der einen Schleife arbeite ich die unterschiedlichen Arrays durch und in der zweiten vergleiche ich dann jeweils die Doppelwörter eines Arrays mit der Vorgabe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber besteht auch die Möglichkeit in einem DB, der aus mehrmals der selben Struktur aus einem UDT aufgebaut ist den Eintrag herauszufinden, der dem Eintrag aus einem Vergleichs-DB entspricht?

Das riecht nach índirekter Adressierung, zwei geschachtelten Schleifen und einem Vergleicher....

Kannst du mit den Begriffen was anfangen?

Wie bereits gefragt.
 
Das mach die Sache für dich jetzt nicht unbedingt leichter.

Mal schauen ob wir dem entgehen können. Wieviele Telegramme musst du denn vergleichen?
Ich denke grad an eine FC die du pro Telegramm einmal aufrufst und jeweils 2 UDT´s übergibst. Als Ergebnis erhältst du dann ob die beide UDT´s identisch sind.

Das macht aber nur Sinn wenn du nicht 100 Telegramme hast.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also im moment sind es 10 Telegramme dich in in dem DB erstellt habe. Aber die Zahl sollte eigentlich beliebig erweiterbar sein. Zumindest mal bis 50
Zum besseren verständnis mal ein Bild.
Links ist der DB in dem die Struktur ist, nach der ich den rechten DB durchsuchen möchte.
Es ist deutlich zu sehen, dass die Struktur im rechten DB enthalten ist ( Adresse 192.0 fängt die Struktur an)
Als Ergebnis brauche ich nun ein Ausgang der gesetzt wird bei Übereinstimmung und einen der mir hier 192.0 anzeigen würde.

Wie schon erwähnt benutzte ich diese Funktion von Siemens, die meines erachtens genau das macht, was ich benötige?!

http://support.automation.siemens.c...&load=content&start=31&csSort=DOCDATUMBEITRAG

/edit: irgendwie lässt er mich keine Bilder vom PC hochladen...

 
Zuletzt bearbeitet:
Mit der Fuktion vergleichts du Elemente aus mehreren DB´s mit einer Referenz und nicht mehrere Elemente aus einem DB.

Ich würde in einer Funktion die Referenz temporär ablegen.

Dann würde ich mit dem LOOP Befehl eine Schleife programmieren, die die Anfangsadresse des jeweiligen Arrays berechnet.
In einer zweiten Schleife, die innerhalb der ersten läuft, würde ich die Werte indirekt adressiert mit dem temporären UDT vergleichen.

Das ganze wäre in SCL jedoch wesentlich einfacher zu realisieren.
 
Code:
auf db [#temp_db_suche]
Auf di [#temp_db_durchsuchen]

L 0
Lar1
Lar2


L dilg
L dblg
T #temp_laenge
/i
L 4
/i
next: t #temp_loop

// einen dword nach den anderen vergleichen
L dbd [ar1, p#0.0]
L did [ar2, p#0.0]
<>d
Spb ungl

L dbd [ar1, p#4.0]
L did [ar2, p#4.0]
<>d
Spb ungl

...



// stimmt überein, mach wa auch immer
...
...


// stimmt nicht überein, nächster Datensatz, oder Ende
ungl: L #temp_laenge
sld 3
Tar2
+d
Lar1

L #temp_loop
Loop next

 
// fertig
...

Läßt sich noch um eine zweite Schleife erweitern, um die ganzen dwords zu vergleichen, egal wie viele...
Akku alle, sry

Alles ungetestet und ohne Gewähr
 
Zuletzt bearbeitet:
Ich persönich sehe es nicht gern, wenn in einer FC ein Instanz-DB aufgeschlagen wird weil das nicht symbolisch geht.
 
.
Der DI muss im obigen Beispiel ja nicht notwendigerweise
ein Instanz-DB eines FB´s sein, sondern er wird einfach
als zweiter DB aufgeschlagen.
--> siehe Beitrag #6

Gruss
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Aventinus meint wohl nicht unbedingt "Instanz-DB" sondern das nicht in den Referenzdaten findbare Öffnen von DB per INT-DB-Nummer.
Man sollte die DB-Nummer als "Block_DB" übergeben und dann so öffnen:
Code:
      AUF   #IN_DB_2
      TDB   
      AUF   #IN_DB_1
//ab hier ist #IN_DB_1 als DB und #IN_DB_2 als DI geöffnet

Harald
 
Zurück
Oben