# Durchsuchen eines DB’s



## Rich (8 Dezember 2008)

Ein DB mit verschiedensten Datentypen soll durchsucht werden.
  Die Suchkriterien sollten dabei sein:
  a)Datentype: BYTE
  b)Wert (z.B. 0010)
  Wie kann das in einer Funktion realisiert werden?


----------



## vierlagig (8 Dezember 2008)

mit einer auswertung des datentyps mit hilfe eines ANY zeigers, danach ist nur noch ein vergleich auf w#16#2 nötig ...

das problem ist wohl die länge des DBs und der einzelnen speicherbereiche ... das sinnvoll zu implementieren bedarf einiges an hirnschmalz ...

gibt es denn einen grundsätzlichen aufbau, der DBs oder sind die einfach nur wild durcheinander gewürfelt...


----------



## Rich (8 Dezember 2008)

Hallo,

  das Problem besteht meiner Meinung darin den Datentype zu erkennen.
  Oder funktioniert einfach in dem der ANY Zeiger die Datentypecodierung 02 (für BYTE) bekommt? 
  Ansonsten ist der DB etwas wild aufgebaut, zuerst ein paar BOOL’s, dann ein Paar REAL’s um anschließend verschiedene UDT Strukturen an zu hängen.


----------



## vierlagig (8 Dezember 2008)

den datentyp bekommst du mit dem ANY ... das wird ne ziemlich verschachtelte sache, weil du jedes element, dass du prüfen willst, irgendwie zur überprüfung übergeben mußt ... eieiei ...

... das wird doch so alles nichts, also ich will dir jetzt nicht den wind aus den segeln nehmen, was denkbar ist, ist meist auch machbar ...

ich hatte die ANY-auswertung bisher immer nur für eine feststehende variable gemacht ... deins muß dynamisch sein, also die einzelnen bereiche deines DBs durchlaufen ... schleife? aber wie adressieren? hmmm ... kannst du SCL einsetzen? ANY und SCL ist zwar etwas komplizierter als in AWL aber du könntest einen indizierten zugriff bauen ...

oh man ... ihr immer mit euren sonderwünschen 

sind die DBs wirklich so unterschiedlich aufgebaut?


----------



## Larry Laffer (8 Dezember 2008)

Hallo,
ich kann mir nicht vorstellen, dass da etwas sinnvolles dabei herauskommt.
Der Any kann zwar den Datentyp usw. übergeben, aber auch nur. wenn man es ihm vorher mitgeteilt hat.
Beui der "freien Adressierung" einer Speicherstelle in einem DB wird man dieses ja immer über BYTE, WORD oder DWORD tun und auf diesem Weg nichts sinnvolles zurückbekommen. Ich denke hier auch (und im speziellen) an die entsprechenden (nicht-)Fähigkeiten von SCL (an gleicher Stelle).

Gruß
LL


----------



## vierlagig (8 Dezember 2008)

Larry Laffer schrieb:


> Bei der "freien Adressierung" einer Speicherstelle in einem DB wird man dieses ja immer über BYTE, WORD oder DWORD tun und auf diesem Weg nichts sinnvolles zurückbekommen



das selbe problem hat man auch in allen anderen speicherbereichen ... also volle kraft zurück und in larrys kanon eingestimmt: das wird wohl nichts, auch wenn mir da ein paar hochsprachenkonstrukte vorschweben, aber dafür sollteste dir vielleicht die S7-mEC RTX besorgen


----------



## Rich (8 Dezember 2008)

Hallo…

  So wie ich das sehe habe ich zwei Möglichkeiten.

  Die Einfache: Schreibe alle relevanten Daten in einen separaten DB der ein ARRY vom Type BYTE hat um anschließend einen Wert zu suchen.
  Nachteil: Ich habe einen weiteren DB und löse mich von einer „Philosophie der Typicals“.
  Vorteil: Der Code wurde bereits von Dir in einem anderen Beitrag beschrieben. :-D

  Die Aufwendige: Der DB wird Adresse für Adresse nach dem projektierten Datentype gefragt um bei einer Übereinstimmung mit dem Suchkriterium (BYTE) den Wert zu vergleichen (z.B.0100). Dabei würde ich die Adresse in der Schleife laufen lassen.
  Nachteil: Ich habe nicht den Hauch einer Ahnung wie eine Adresse eines DB’s angesprochen wird um einen Datentypvergleich durch zu führen!


----------



## Gebs (8 Dezember 2008)

Hallo Rich,



Rich schrieb:


> Der DB wird Adresse für Adresse nach dem projektierten Datentype gefragt



ich denke, Du wirst keine Change haben den Datentyp abzufragen, denn die Formate etc. 
werden im Ladespeicher der CPU abgelegt. Soweit ich weiß kann man auf den Ladespeicher
vom Programm aus nicht zugreifen. 

Grüße
Gebs


----------



## Befree (16 Dezember 2008)

wie wäre es wenn du dir einfach ne nen FB schreibst an dem du angeben kannst welcher DB durchsucht werden soll, wieviele bytes er absuchen soll und nach welchem Wert er suchen soll. 

Im FB öffnest du den angegebenen DB und inizialisierst eine Schleife die so oft läuft wie du bytes absuchen möchtest. Zusätzlich lädst du den pointer P#0.0 in eine Zeigervariable.

In der Schleife vergleichst du lediglich den Wert mit dem DBB [#Zeiger] und addierst den pointer P#1.0 in jeder schleife zu #Zeiger.

Bin aber noch neu xD

Meinungen erwünscht


----------



## Larry Laffer (16 Dezember 2008)

Na - ja ...
auf diese Weise kannst du einen DB scannen - es geht aber darum, herauszufinden welchen Typs der Eintrag im DB ist - als INT , REAL , DINT usw.
Das erfährst du auf diese Weise nicht ...

Gruß
LL


----------



## Befree (16 Dezember 2008)

Stimmt, aber ich wüsste nicht mal ob das überhaupt geht. Isch guck ma SIMATIC doku ;-) vielleicht find ich was.. wenn ja melde ich mich


----------



## vierlagig (16 Dezember 2008)

Befree schrieb:


> Stimmt, aber ich wüsste nicht mal ob das überhaupt geht. Isch guck ma SIMATIC doku ;-) vielleicht find ich was.. wenn ja melde ich mich



wenn der larry sagt, dass das nicht geht, dann ist das so gut wie gesetz ... ich würd mich gern vom gegenteil belehren lassen und wünsche dir viel spaß bei der suche


----------



## awl442 (27 Dezember 2008)

So ein Datenbaustein ist eigentlich nichts anderes als ein Haufen von Bytes. Nehmen wir mal an wir haben am Anfang ein DW, das sind 4 Bytes die nur in dieser Kombination einen Sinn ergeben, mit dem Wert  D#16#12345678.
Wenn ich jetzt nach dem Wert B#16#56 suche dann finde ich den im 3. Byte dieses Doppelworts, aber was soll ich damit? Es gibt keine Möglichkeit rauszufinden zu welchem Datentyp eine bestimmte Speicherzelle gehört.


----------

