DB nach einem bestimmten Wert durchsuchen

Herrminator

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

ich habe in einem DB eine Rezeptur stehen. In dieser Rezeptur gibt es mehrere Wörter welche die Reihenfolge der einzelnen Rezeptursegmente beinhaltet. Da ich eine sortierte Reihenfolge benötige, möchte ich mit einem Pointer den DB nach der aktuell gesuchten Reihenfolge absuchen. Die Vorgabe der aktuell gesuchten Reihenfolge kommt von einem Zähler. Mein Code sieht bis jetzt so aus:

Code:
AUF "Rezeptur"                 // DB öffnen
L #Datenanfang               // Erster Wert aus DB
T #SuchWert

L 0
T #Durchl

anf: NOP 0                     // Schleifen Anfang Schritt finden

L #Durchl
L 1
+I 
T #Durchl
L #SuchWert

SLD 3                             // Pointer erzeugen
LAR1 
L DBW [AR1,P#0.0]
T #Wert                        // gefundener Wert

L #SuchWert                  // Nächster Wert 
L 16                             // SuchWert + 16 = neuer Wert
+I 
T #SuchWert
L Z 20                          // Richtiges gefunden? 
T #Z_i
L #Z_i                          // Vergleich gesuchter Schritt = gefundener Schritt
L #Wert
==I 
SPB end                       // Wenn Z_i=Wert --> Ende
SPA anf                        //sonst --> Anfang

end: NOP 0

Ich muß dazusagen, es ist mein erstes Programm in AWL (denke man sieht es). Was nicht funktioniert, ist dass ab Startwert 2 jeder 16 Wert geprüft wird,muss also was mit meiner Schleife zu tun haben. Desweiteren muss jedesmal alles zwischen 2 und 160 durchsucht werden und überwacht, dass es nicht mehr als einen Durchlauf gibt.

Wie würde da ein sinnvoller Ansatz aussehen?

Grüße Tobias


(CPU 315-2DP / Step 7 5.4 SP3)
 
bin nur kurz drübergeflogen,aber mit
Code:
L #SuchWert                  // Nächster Wert 
L [COLOR=red]P#16.0[/COLOR]                               // SuchWert + 16 = neuer Wert
+I 
T #SuchWert
sollte es schon mal besser gehen.
und wegene dem durchlauf mußt einen loopcounter nehmen.
nach x durchläufen,oder wert gefunden -->raus aus der schleife.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Gerhard:
Bevor der Suchwert in das AR1 wandert steht noch ein SLD3. Er ist somit im richtigen Range ...

@Herminator:
Ist dein Datenbereich nur 16 Byte groß ?
Du fragst nirgendwo ab, ob Suchwert größer als dein Bereich wird und brichst damit die Schleife ab.
Was passiert jetzt aktuell bei deiner Suche ?

Gruß
LL
 
Danke für eure schnellen Antworten.

Also bis jetzt funktioniert das ganze nur mit dem Anfangswert 2. Er sucht garnciht nach dem passenden Wert.

Ja das Abbrechen muss ich auch noch realiseren. Mein DB aus dem ich lese, hab ich mal als Bild angehängt.
 

Anhänge

  • DB4.jpg
    DB4.jpg
    229,5 KB · Aufrufe: 50
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ...
dann ist deine AWL erstmal gar nicht so schlecht ...
Was schreibst du in Datenanfang bzw. wie berechnest du den ?
Derin DB fängt mit Adresse 0 an und der Daten-Index 1 müßte dann auf diese Adresse zeigen - Index 1 dann auf 16, Index 2 auf 32 usw.
Hast du das berücksichtigt ?

Gruß
LL
 
Hi LL,

ich bemühe mich mein C++/C Wissen irgendwie schlau anzuwenden.

Also mein Daten Anfang wäre fest die Zahl 2. Dann Zeigt mein Pointer ja auf Bad A1 Reihenfolge(2). Ist da nicht der gesuchte wert drin, addiere ich der 2 16 dazu. Lese dann Bad A2 Reihenfolge (18 ) aus usw... bis ich den gesuchten Wert finde...

Was meinst du mit Daten_Index?

Gruß Tobias
 
Daten-Index ist die Nummer des Datensatzes (deiner Rezeptur) ,...

Mit einer Sache aus deiner AWL komme ich noch nicht so recht klar ... was heißt das :
Code:
L Z 20                          // Richtiges gefunden? 
T #Z_i
L #Z_i                          // Vergleich gesuchter Schritt = gefundener Schritt
L #Wert
==I
was hat das Ganze mit dem Zähler 20 zu tun ?
Steht in Bad_A?_Reihenfolge irgendwo ein Wert drin, der mit dem im Z20 identisch ist ?
Erklär das mal ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
JA genau, der Zähler soll bei 0 Anfangen. Dann wird der Wert in meinem DB gesucht wo Reihenfolge 0 drin steht. Ist der erste Schritt beendet, wird der Zähler um eins erhöht und dann wird der nächste Schritt gesucht. Der Zähler macht sozusagen die Vorgabe, welches der nächste Schritt sein soll.
 
Bis jetzt funktioniert nicht, das der richtige Wert gefunden wird. Es sieht so aus, als würde die Schleife nicht laufen. Ich sehe immer nur den Datenanfang (2) und den zugehörigen Wert aus dem DB. Aber nach dem Vergleich von Zahl im DB und dem Wert des Zählers, scheint es nicht mehr weiter zu gehen. Eigentlich sollte ja jetzt der neue Wert vom Pointer ausgelesen werden.

Ich hoffe ich hab mich halbewgs verständlich ausgedrückt ;)

Gruß
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
:confused: der Codeschnipsel von dir sucht nur nach der Übereinstimmung und bricht dann ab ... Etwas weiteres hast du da nicht programmiert. Ich sehe auch nichts davon, dass du mit etwas arbeitest oder den Zähler erhöhst, damit eine neue Suche losgehen kann ...

Gruß
LL
 
Ja, das kommt alles noch. Da Pointer ein neues Gebiet für mich sind, war ich erst mal froh das ich den Wert sehe den ich sehen möchte.

Also das errechnen des neuen Wertes Angangswert + 16 = 18, dass macht er richtig.
Code:
 L     #SuchWert                   // Nächster Wert 
      L     16                          // SuchWert + 16 = neuer Wert
      +I    
      T     #SuchWert

Nur wird der Wert im zweiten Durchgang garnicht verwendet....
Und somit auch keine gleiche Zahl gesucht.

Grüße Tobias
 
Ähh ...
was baust du denn da für einen baustein und was ist "Such_Wert" - sag bitte nicht eine Variable im TEMP-Bereich deines Bausteins ...
Falls doch ... TEMP-Variablen merkt sich ein FC (oder FB) nicht von einem Zyklus zum Nächsten ... Du müßtest hier eine STAT-Variable (gibt es nur im FB) nehmen oder von irgendwo her eine Global-Variable (z.B. in einem DB definiert) hernehmen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
;) ja ist ein Temp-Wert. Daher kommts. DANKE

Der Baustein ist erst mal ein Versuch. Ich weiß auch noch nicht so genau wie ich das mit der Rezeptur handhaben soll.

Ich automatisiere gerade eine Reinigunsanlage mit 6 Behälter mit Reinigungsflüssigkeit, Heizung und Ultrachall. Eine Hubachse mit Greifer verfährt die Siebkörbe mit einer Linearachse nach Rezeptur von Bad zu Bad.

Der Benutzer kann die maximal 12 Schritte (jedes Bad 2 mal pro Rezeptur verwendbar) der Rezeptur in beliebiger Reihenfolge automatisch abarbeiten lassen. Daher muss ich jetzt ja in Betriebsart Automatik suchen welches ist mein erster Schritt, wohin muss ich meine Linearachse verfahren, welche Temperatur muss das Bad haben und wie lange verbleibt der Siebkorb im Bad.

So war zumindest mal mein Ansatz.

Gruß
 
:p ... das hört sich doch gut an ...

Du suchst in deinem DB nach der gewünschten Rezeptur. Den Aufbazu deiner Rezeptur kennst du ja. Nun lädst du die entsprechenden (benötigten) Einzelvariablen entsprechend der "gefunden"-Adresse aus dem Speicher. Das geht auch nicht anders, wie deine Vergleichs-Routine ... Sogar noch einfacher, weil du den Offset ja schon hast (steht in Such_Wert). Den lädst du ins AR1 und arbeitest damit weiter. Also :
Code:
L Such_Wert
SLD 3
LAR1
 
L W [AR1,P#0.0]
...
L D [AR1,P#2.0]
...
Die Adressen hatte ich jetzt nicht mehr korrekt parat ... bitte bedarfsweise korrigieren ...

Gruß
LL
 
Ja so habe ich mir das ungefähr gedach. Nur noch Umsetzen. ;)

Ich bewundere euch alle mit eurem Knowhow und Können. Wenn ich dran denke wie lange ich für das erste Verfahren der Achse gebraucht habe (Regelfreigabe, Antriebsfreigabe, Zwischenkreis, Sicherheitsrelais....). Bis ich mich durch die HMI Software gekämpft hatte...

Aber nur so lernt man denke ich. Ich danke dir nochmal für deine Hilfe und die Mühe die du dir gegeben hast. DANKE

Gruß Tobias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich dran denke wie lange ich für das erste Verfahren der Achse gebraucht habe (Regelfreigabe, Antriebsfreigabe, Zwischenkreis, Sicherheitsrelais....). Bis ich mich durch die HMI Software gekämpft hatte...

Gern geschehen -
Was meinst du denn, wie lange ich dafür gebraucht habe ... Ich denke, ich habe maximal einen zeitlichen Vorsprung - man braucht für so etwas so seine Zeit - und man muß nicht denken, dass es irgendwann einmal zu Ende ist ... (außer, wenn man vor dem Großen Programmierer steht ;)).

Gruß
LL
 
Klar ja da hast recht. Aber erst mal die passende Idee zum Problem haben. Und dann vorallem noch die Tricks und Kniffe die man mit so ner SPS realisieren kann. Vieles muss man erst mal wissen....

Ich werd mich bemühen da irgendwie tiefer in das Thema einzutuachen. Ich bin hier der einzige der SPS Programmiert, somit hab ich leider keinen Crack neben mir der mal nen Tipp hat, so bleibst nur du ;) bzw. das Forum. Wie hast du ein SPS-Wissen vertieft ?

Gruß Tobias
 
Zuletzt bearbeitet:
Wie hast du ein SPS-Wissen vertieft ?
Erworben: in jahrelanger (jahrzehntelanger) mühevoller Kleinarbeit ...
Vertieft: ich war immer in der glücklichen Lage, dass ich machen konnte was ich wollte und wie ich wollte (solange das gewünschte Ziel erreicht wird - ist natürlich Voraussetzung). Je mehr du machst umso mehr bekommst du hin - du darfst nur nicht aufgeben und man (zumindestens ich) muß sehr viel (auch private) Zeit darein stecken ...

...
 
Zurück
Oben