Vergleichen bis der Arzt kommt....

Lipperlandstern

Level-3
Beiträge
6.010
Reaktionspunkte
1.728
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle...

Ich programmiere eine Förderanlage für Paletten mit ca. 30 Stellplätzen. Für jeden dieser Stellplätze gibt es einen Datenbaustein in dem ua. die 8 10stellige Palettennummer hinterlegt ist die über einen Scanner eingelesen wird.

Jetzt möchte der Kunde gern wissen ob evtl. 2x die gleiche Palettennummer eingelesen wurde.

Jetzt kann ich natürlich jeden Platz miteinander vergleichen was ein riesiger Aufwand wäre.
Aber irgendwie muss es doch eine einfachere Lösung geben...

Ich arbeite mit einer Simatic S7-414.


Grüsse aus dem Lipperland

Axel
 
jeden dieser Stellplätze gibt es einen Datenbaustein in dem ua. die 8 10stellige Palettennummer hinterlegt ist die über einen Scanner eingelesen wird.
Axel

Ist die Palettennummer ein String oder ne Integer-Zahl ?

Wenns ein String ist, dann ist der Vergleich schon recht aufwendig.

In einem ähnlichen Fall habe ich die Strings zunächt sortiert (Quicksort),
dadurch hat sich der vergleich deutlich einfacher gestaltet.
 
Die Palettennummer ist ein String. Alles andere wäre ja langweilig ;-) .... Ich überlege gerade ob ich den String nicht in einen FiFo-Buffer kopiere und dort die Vergleichsroutine durchlaufen lasse.... hat aber auch nachteile.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle...

Ich programmiere eine Förderanlage für Paletten mit ca. 30 Stellplätzen. Für jeden dieser Stellplätze gibt es einen Datenbaustein in dem ua. die 8 10stellige Palettennummer hinterlegt ist die über einen Scanner eingelesen wird.

Jetzt möchte der Kunde gern wissen ob evtl. 2x die gleiche Palettennummer eingelesen wurde.

Jetzt kann ich natürlich jeden Platz miteinander vergleichen was ein riesiger Aufwand wäre.
Aber irgendwie muss es doch eine einfachere Lösung geben...

Ich arbeite mit einer Simatic S7-414.


Grüsse aus dem Lipperland

Axel

Hallo Axel,

Sind die 30 Stellplätze Lagerplätze, oder fahren die Paletten nacheinander über diese 30 Plätze?

Soll der Vergleich nur beim Scannvorgang durchgeführt werden?

Dann würde ich auch die 30 DB (das ist ja nicht viel) in einer Schleife durcharbeiten.
Die Strings (was meinst du eigendlich mit 8 10stellig ? ) kannst du einfach mit einem Vergleicher (==I oder ==D) Vergleichen, Characteranzahl + 2 Bytes für den Vorkopf.

Es gibt auch eine IEC Funktion (EQ_STRNG oder so ähnlich), die kostet aber recht viel Zykluszeit und muss mit STRING parametriert werden, in einer Schleife ist das eher unpraktisch.

CU

Jürgen.
 
Also mir fällt sonst nur eine Mathematische Lösung ein:
Da es sich um sehr grosse Zahlen handelt kann ich durch eine Division herausbekommen ob diese Zahl schon mahl dagewesen ist, und zwar so:
Alle 8-10 Stellige Nummern miteinander Multiplizieren,
Modulo Division mit neu eingelesener Nummer, Wenn Ergebniss <> 0=noch nicht eingelesen, wenn Ergebniss==0 =Zahl bereits dagewesen
 
Also mir fällt sonst nur eine Mathematische Lösung ein:
Da es sich um sehr grosse Zahlen handelt kann ich durch eine Division herausbekommen ob diese Zahl schon mahl dagewesen ist, und zwar so:
Alle 8-10 Stellige Nummern miteinander Multiplizieren,
Modulo Division mit neu eingelesener Nummer, Wenn Ergebniss <> 0=noch nicht eingelesen, wenn Ergebniss==0 =Zahl bereits dagewesen

Hallo Antonio,

Wenn die Palettennummern ein String sind, könnten ja auch alphanumerische Zeichen vorhanden sein!
Könnte bei deiner Idee nicht auch der Fall auftreten, das der Rest 0 ist, obwohl die Nummer nicht schon eingelesen wurde (kgN) ?

Beispiel: Nummern 3 und 4: ergibt 12.
12 ist ohne Rest auch teilbar durch 6.

CU

Jürgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mit den Alfanumerischen habe ich nicht bedacht, sorry...
dennoch scheint es mir sonst nahezu unmöglich das eine division durch eine 8stellige Zahl den restwert 0 ergibt.
 
Das mit den Alfanumerischen habe ich nicht bedacht, sorry...
dennoch scheint es mir sonst nahezu unmöglich das eine division durch eine 8stellige Zahl den restwert 0 ergibt.
???:confused: ???
Ich glaub, ich kann dir nicht ganz folgen ?
Je größer die Zahl, desto wahrscheinlicher ist doch, das ne Division Rest 0 ergibt!

Außerdem hat ne S7 garkein Zahlenformat, dass so große Beträge mit Auflösung 1 darstellen kann!
 
Der String besteht nur aus Zahlen. Diese könnte man natürlich wandeln und die Zahlen dann voneinander subtrahieren. Wenn das Ergebniss 0 ist ist die Zahl ( dann der Barcode) doppelt vorhanden. Trotzdem ein grosser Aufwand, oder ???? *grübel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also wenn du das in eine zahl wandeln kannst, solltest du das auf jeden fall machen. das erleichtert die sache ungemein.
also ich würde das dann gar nicht als string ablegen, sondern direkt wandeln und dann in den db schieben. es sei denn du brauchst den string unbedingt. dann würde ich mit 2 db's arbeiten. einer der den string enthält den abnderen der den eintrag als zahl enthält.

hier mal wie du die gesuchte zahl findest.
Code:
      AUF   #Datenbaustein              //in_var
      L     #Datenanfang                //in_var
      T     #index                      //temp_var
anfa: NOP   0                           //Schleifenanfang
      L     #index
      SLD   3
      LAR1  
      L     #suche                      //in_var
      L     DBD [AR1,P#0.0]
      ==D   
      =     #vorhanden                  //out_var
      UN    #vorhanden
      SPB   weit
      L     #index
      T     #position                   //out_var; position im db
      SPA   end
weit: L     #index
      L     4
      +I    
      T     #index
      L     #anzahl                     //in_var
      >I    
      SPB   end                         //anzahl der dw's erreicht
      SPA   anfa
end:  NOP   0
 
Hallo!

Nur so eine Idee - was währe denn wenn man einen separaten Datenbaustein mit 30 Einträgen nimmt, in denen die Palettennummer an dem jeweiligen Stellplatz eingetragen wird (Platz 8 = 8ter Eintrag). Wenn keine Palette an dem Ort steht, dann eben 0.
Jetzt musst du beim einlesen einer neuen Palette doch nur schauen, ob der neue Wert bereits eingetragen ist oder nicht

U #start z.B. durch scanner
fp m10.0
spb res
spa nres

res: L 0 // mit dem Reset wird der Suchvorgang gestartet
T #zähler

nres: L #zähler
L 31
>=D // nach 30 durchläufen zum Ende
spb end

such: L #zähler // verzweigen je nach Zählerstand
L 1
==D
spb s001

TAK
L 2
==D
spb s002
.
.
.

TAK
L 30
==D
spb s030
spa end

s001: L #neue Nummer // vergleich neue Nummer mit Palettennummer 1
L DB10.DBD0
==D
spb dopp
spa add

s002: L #neue Nummer // vergleich neue Nummer mit Palettennummer 2
L DB10.DBD4
==D
spb dopp
spa add
.
.
.

add: L#zähler // nach Durchlauf Zähler erhöhen
L 1
+D
T #zähler
spa end

dopp: L 30 // wenn vorhanden dann zähler auf 30 setzen - suchlauf beendet
t #zähler
s m#dopp

end: U m#dopp // wenn doppelt, dann reagieren
was auch immer du dann möchtest...

is nur so idee, ich hab das nun nicht probiert... Der Suchlauf dauert dann natürlich 30x die Zykluszeit - aber ich denke das sollte hierbei noch nicht allzu schlimm sein...

Viele Grüße, Tobias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vorausgesetzt, dass die führenden Nullen nicht berücksichtigt werden müssen!
Obacht!

da hast du recht.
evtl kann man aber auch die fc19 aus den iec zum vergleichen der strings nutzen. bin aber nicht sicher ob man die indirekt adressieren kann.

keine zeit das zu testen.
:sm22:jetzt gehts ab auf die silvesterfeier :sm24: :sm19:

in diesem sinne wünsche ich allen einen guten rutsch ins neue jahr.
 
Also mir fällt sonst nur eine Mathematische Lösung ein:
Da es sich um sehr grosse Zahlen handelt kann ich durch eine Division herausbekommen ob diese Zahl schon mahl dagewesen ist, und zwar so:
Alle 8-10 Stellige Nummern miteinander Multiplizieren,
Modulo Division mit neu eingelesener Nummer, Wenn Ergebniss <> 0=noch nicht eingelesen, wenn Ergebniss==0 =Zahl bereits dagewesen

Lach,

rechne mal die Potenzen bei 30 zahlen. min 30*10^10
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder auf ohne Hirnschmalz lösen :)
Für den 2. Januar ist das die beste Lösung um nicht denken zu müssen

Code:
// NW1 Stellplatz 1
// 
// Ausführen wenn Auftrag M 0.0 = 1
      U     M      0.0
      SPA   A000
// Wenn nicht wie immer nix tun
      BEB   
A000: NOP   0
// Nun gehts es los ....
D001: NOP   0
      SPA   D002                        //Platz
      L     DB1.DBD    0
      L     DB1.DBD    0
      ==D   
      SPBN  D002
      T     MW   104
      L     1
      T     MW   100
      L     1
      T     MW   102
 
D002: NOP   0
      L     DB1.DBD    0
      L     DB2.DBD    0
      ==D   
      SPBN  D003
      T     MW   104
      L     1
      T     MW   100
      L     2
      T     MW   102
D003: NOP   0
      L     DB1.DBD    0
      L     DB3.DBD    0
      ==D   
      SPBN  D004
      T     MW   104
      L     1
      T     MW   100
      L     3
      T     MW   102
D004: NOP   0
      L     DB1.DBD    0
      L     DB4.DBD    0
      ==D   
      SPBN  D005
      T     MW   104
      L     1
      T     MW   100
      L     4
      T     MW   102
D005: NOP   0
// usw. = 30

Code:
// NW2 Stellplatz 2
D101: NOP   0
      L     DB1.DBD    0
      L     DB1.DBD    0
      ==D   
      SPBN  D102
      T     MW   104
      L     1
      T     MW   100
      L     1
      T     MW   102
 
D102: NOP   0
      SPA   D103                        // Platz
      L     DB1.DBD    0
      L     DB2.DBD    0
      ==D   
      SPBN  D103
      T     MW   104
      L     1
      T     MW   100
      L     2
      T     MW   102
D103: NOP   0
      L     DB1.DBD    0
      L     DB3.DBD    0
      ==D   
      SPBN  D104
      T     MW   104
      L     1
      T     MW   100
      L     3
      T     MW   102
D104: NOP   0
      L     DB1.DBD    0
      L     DB4.DBD    0
      ==D   
      SPBN  D105
      T     MW   104
      L     1
      T     MW   100
      L     4
      T     MW   102
D105: NOP   0
// usw. =30

Code:
noch ganz viele male bis Stellplatz 30

Code:
// NW31 Auftrag ausgeführt und Meldung
// .....nach 30 mal den Spielchen
      SET   
      R     M      0.0                  // Auftrag Doppel suchen
      S     M      0.1                  // Melde gehorsamst! Auftrag ausgeführt
 
@maxi
was für'n aufwand wegen ein paar vergleichen. den code kann ich auch nicht so ganz nachvollziehen
hast du dir mal meinen obigen code angesehen? der erschlägt das doch im handumdrehen.

@ug
klar meinte ich die fc10. aber hast recht der lässt sich nicht parametrieren.


wenn die führenden nullen mitverglichen werden müssen, muss man halt
bei 30byte 8 mal dbd und 1 mal dbw in der schleife vergleichen.
halte ich aber nicht für nötig. entweder hat die stelle einen wert oder ist halt 0.
 
Zurück
Oben