Schieberegister

andreHST

Level-1
Beiträge
27
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Also guten morgen,

ich möchte nochmal eine kniffliges Problem bekannt geben...

Zur Sache:
Es geht um einen langsam drehenden Glasteller, auf dem in umbestimmten Abständen Teile liegen können. Eine Kamera vermisst das Teil und entscheidet, ob dieses Teil ein Schlecht Teil oder ein Pseudo Teil ist.. Die Positionen der Auswurfschächte nach der Kamera sind,
Schlecht Teile 20cm, Pseudo Teile 40cm...
Ein Inkrementalgeber ist am Motor angebracht.

Ich stelle mir vor, da ich nicht ständig Rechenoperationen ausführen möchte, ein Schieberegister aufzubauen, dass mit jedem Inkrement weitergeschoben wird... sprich wenn Schlecht oder Pseudoteil vorhanden Bit auf 1 setzen und weiterschieben... Wenn an Position angekommen Teil ausblasen...

Naja mal ehrlich habe jetzt mal vor sonem Links Schieben Ding gesessen. Ich weiss es echt nicht komme mir solangsam mächtig blöd vor. Ich bekomme es einfach nicht hin... Ein Bit in einem Wort links schieben zu können. Die erste stelle wir 1 gesetzt und das wars.. Dieses Bit wandert im Wort nicht eine stelle nach links... Vielleicht kann mir Depp jemand mal die Grundfunktionen erklären.. Daran scheitert es wohl immer wieder. Von der Logik kein Ding aber naja wie???

So bedanke mich erstmal und leg den Hammer wieder zur Seite...

MFG
Andre
 
Code:
un bedingung //teil wurde erfasst
spb ende

u teil_schlecht
s bit_0
un teil_schlecht
r bit_0
slw 1
ende: nop 0
 
hallo andre

ich hatte mal ein ähnliches problem, habe es folgendermaßen gelöst.

ich habe ein freies MW benommen, z.B MW100

bei ausschuß habe ich m100.7 auf 1 gesetzt,
mit der nächsten aufnahme das mw nach rechts geschoben, daduch ist m100.6 = "1" und 100.7 wieder "0"
das ergebnis der kameraauswertung wieder in m100.7 geschrieben,
neue aufnahme und rechtsschieben, usw.

mit m100.0 habe ich eine ausschußklappe angesteuert, einfache abfrage ob m100.0 eine "1" (klappe auf) oder eine "0" (klappe zu) hat.

ich hoffe, ich konnte die eine kleine anregung geben

gruss
frank
 
andreHST schrieb:
das ist doch jetzt ein wenig einfach oder??ß also brauche unbedingt eine teileverfolgung da ja ständig neue teile nachkommen

ist halt so einfach.

du erfasst das teil. prüfst ob es ok ist oder nicht. dann wird der register 1 verschoben. nehmen wir an an position 7 ist der ausschuss. dann fragst du einfach bit_6 ab um zu entscheiden ob aussortiert werden soll oder nicht.
die nebensächlichen kleinigkeiten musst du schon selbst programmieren.

aber manche leute programmieren halt lieber kompliziert auch wenns einfach geht.
das versteht dann ja jeder. :cry:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also es gibt die möglichkeit sowas zu lösen so:

Code:
  U "Takt vom Drehteller"
  FP M 10.0
  SPBN NSFT
  L MW 100
  SLW 1
  T MW100
  U "Schlechtes Teil"
  = M100.0
  NSFT: NOP 0

Du kannst aber auch IEC Funktionen nehmen. Es gibt ein Bit-Schieberegister SHRB und ein Datenschieberegister WSR (Worte, Realzahlen etc.)
Diese Funktionen benutze ich bei großen Registern, wie z.B. Linienketten am Transportsystem etc. Die kleinen eigentlich nur, wenn ich <= 16/32 Bit bleibe, maximal eben ein DWord schiebe... Spare mir dann das Hantieren mit dem OV Flag etc...

Hier mal ein Beispiel für Bitschieberei:

Code:
      U     #Kettentakt      // Takt von meiner Linienkette
      FP    "FLA_Kettentakt"        // z.B:   M10.5
      =     #IMP_Kettentakt        // Temp Variable

      U     #IMP_Kettentakt
      SPBN  NTKT
      CALL  "SHRB"              //  IEC Schieberigister 
      DATA :="Schlechtteil"   // Schlechtteil = 1 von deiner CAM          
      RESET:=FALSE            // Für mich ist es egal, ist zum Register Komplett Rücksetzen...
      S_BIT:="Maschinenparameter".Temp_Data.Schieberegister_Schalen[0]
      N    :=W#16#20         // 32 Positionen
NTKT: L     P#DBX 928.0   //  "Maschinenparameter".Temp_Data.Schieberegister_Schalen  also mein Schieberegister
      L     "Maschinenparameter".Linie_1.Position_Register  // Dies ist eine Variable vom OP (1-30), also an welcher Position, soll ausgeschleust werden 
      +I    
      T     #poStartAdresse

      U  DBX [#poStartAdresse]
      U  #IMP_Kettentakt
      L S5T#500MS
      SA T 50
      
      U T50
      =     "Ausschleusen"      // z.B: A 124.0 Luftventil für Ausschieber/Klappe -> Teil ist schlecht...

Und alle Anderen Teile fahren dann weiter zur nächsten Position. Diese Position kannste dann auch über ein Register machen...

Aber eventuell ist es gut, wenn du ein Byteregister machst, nach o.g. Schema... Dann kannst du mit Status arbeiten:

0 = Kein Teil da.
1 = Schlechtteil.
2 = Gutteil.
etc...

Dann brauchst du nur ein Register und kannst bequem die Positionen z.B. in einem Pannel als Variable handhaben...


Ich hoffe du verstehst mein Beispiel, sorry ist etwas merkwürdig anzuschauen, aber eigentlich easy :D

So und ich sehe gerade das ist mein 100erster Beitrag, deshalb auch noch schnell den Code formatiert :roll:
 
Das mit dem Merkerwort ist eine gute Lösung.
Setze zum Beispiel bei einem erkennten Fehler M 0.0 auf 1.
Dann programmiere eine Flanke auf deine Tischdrehung.
Mit dieser Flanke schiebst du das Merkerwort nach links (SLW 1).
Somit schiebst du wirklich nur einmal.
Nun kannst du mit den folgenden Merkern (M0.1, M0.2 usw...) den nachfolgenden Stationen mitteilen ob es sich um ein Gut- oder Schlechtteil handelt.
Mit einem Merkerwort kannst du somit 15 Stationen versorgen.
 
Zurück
Oben