20. März 2019, 18:33:29
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

[offen] Merker setzen einfach gemacht?


normal_post Autor Thema: [offen] Merker setzen einfach gemacht?  (Gelesen 407 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

24. September 2018, 11:53:06
Gelesen 407 mal
Offline

Santa


Hallo zusammen

Wir würde gerne einen Zähler/Merker in unser Programm integrieren, wissen jedoch nicht genau wie die beste Lösung aussehen soll.
Folgendes:
Unser Robi(ABB IRC5) hat ein Teil im Greifer, und soll dieses entweder aufs Band legen, oder in den Ofen.
Er ist bereits abhängig von einem Kippschalter.
Wenn Kippschalter = 0 Dann Variante 1  Förderband. (" IF zzDI11_50 = 0 THEN")
Wenn Kippschalter = 1 Dann Variante 2 Ofen. ("ELSE")

Variante Ofen wird also nur bedient wenn der Kippschalter aktiv ist.
JETZT möchten wir zusätzlich noch, dass er trotz Kippschalter = 1 , trotzdem nur jeden 2. , 3. oder 5. ten in den Ofen wirft.
Aber so, dass die Variable X sehr leicht zu verändern ist, ohne das Programm gross umzumodeln (also ohne Case 1,2,3, etc....)
Ansonsten, wenn x nicht gegeben ist, wirft er das Teil wie gewohnt auf das Band.
Im Grunde 1tes Teil Band, 2tes Teil Band, 3tes Teil Ofen, reset.

Hoffe es war einigermassen plausibel erklärt...
Die Routine sieht wie folgt aus...

 PROC rOfen()
  VAR num Answer;
    ! Folgende Zeile nach dem Teachen rauswerfen
    !TPReadFK Answer,"Alle Punkte teachen!!","","","","","";
    VelSet 100, 6000;
    IF zzDI11_50 = 0 THEN
     MoveJ ZuBand, v6000, z50, tGripper;
     MoveJ ZuBand20, v6000, z50, tGripper;
     MoveL ZuBand30, v6000, z50, tGripper;
     MoveJ ZuBand10, v2000, fine, tGripper;
     Set zzDO11_1;
     WaitTime 0.6;
     !rGripper1Open;
     MoveL [[1271.13,1103.35,1398.42],[0.342645,-0.283704,-0.489494,-0.750002],[0,1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z100, tGripper;
     MoveJ [[847.32,-637.86,1963.19],[0.660204,0.227635,0.680878,-0.220723],[-1,-1,0,1],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z100, tGripper;
     !MoveL [[-137.53,1832.18,1026.76],[0.00971983,0.714644,-0.699419,0.00152457],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z50, tGripper;
    ELSE
     MoveJ InAblage10, v6000, z50, tGripper;
     MoveJ InAblage20, v6000, z50, tGripper;
     MoveL InAblage40, v6000, z50, tGripper;
     MoveL GrInAblage, v400, fine, tGripper;
     Set zzDO11_1;
     !rGripper1Open;
     WaitTime 1;
     MoveL UmgreifAblage, v400, z50, tGripper;
     MoveL UmgreifAblage10, v4000, z50, tGripper;
     MoveL UmgreifAblage20, v4000, z50, tGripper;
     MoveL UmgreifAblage30, v4000, z50, tGripper;
     MoveL GrAblage, v200, fine, tGripper;
          Reset zzDO11_1;
          WaitTime 0.8;
     MoveL OutAblage, v600, z50, tGripper;
     MoveL VorOfen, v6000, z50, tGripper;
     MoveL VorOfen10, v6000, z50, tGripper;
     MoveL UeberOfen, v2000, z50, tGripper;
     Reset doOfen_ZU;
     MoveJ [[-2352.64,816.90,2109.47],[0.999778,-0.00945182,-0.00100874,0.0188198],[1,-2,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z150, tGripper;
     !MoveL [[-2544.96,756.21,2185.04],[0.908025,0.0808867,-0.32757,0.248285],[1,1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z50, tGripper;
     Set doOfen_AUF;
     !MoveL [[-2669.11,661.67,1885.53],[0.762197,0.248767,-0.369237,0.469931],[1,1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, fine, tGripper;
     WaitUntil diOfen_OFFEN = 1\MaxTime:=3\TimeFlag:=bTimeOut;
     IF NOT bTimeOut THEN
     Reset doOfen_AUF;
     !MoveL [[-2544.96,756.20,1565.66],[0.908024,0.0808824,-0.327575,0.248286],[1,1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]],v1000,fine,tGripper;
     MoveL [[-2352.66,816.91,1657.04],[0.999778,-0.00945634,-0.00101891,0.0188128],[1,-2,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v200, fine, tGripper;
     Set zzDO11_1;
     WaitTime 0.3;
     MoveL [[-2352.67,816.91,1891.46],[0.999778,-0.00945491,-0.0010289,0.0188146],[1,-2,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v1000, fine, tGripper;
     PulseDO\PLength:=8, doOfen_ZU;
     MoveL [[-952.00,982.43,2240.01],[0.981396,0.169609,-0.0897853,-0.00582186],[0,-3,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z150, tGripper;
     MoveJ [[930.14,939.87,2271.23],[0.69007,0.0725295,-0.188088,-0.695101],[-1,-3,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z150, tGripper;
     WaitDI diOfen_ZU,1;
     ELSE
     Reset doOfen_AUF;
     PulseDO\PLength:=8, doOfen_ZU;
     MoveL [[-1451.21,1068.27,2398.78],[0.949795,-0.00859162,-0.00409368,-0.312729],[1,-2,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z150, tGripper;
     MoveL [[-673.13,1210.05,2526.92],[0.525281,-0.0188135,0.0488357,-0.849318],[1,-2,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z150, tGripper;
     MoveL [[951.16,900.57,2569.77],[0.0974639,-0.0236326,-0.0703374,0.992469],[0,-2,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z150, tGripper;
     MoveL [[1717.59,2786.21,1328.71],[0.616205,-0.0190521,0.0186564,-0.787135],[0,-2,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, fine, tGripper;
     Set zzDO11_1;
     WaitTime 0.3;
     MoveL [[1170.78,648.50,2469.49],[0.193641,0.0773568,-0.129444,0.969414],[0,-2,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z100, tGripper;
     MoveJ [[847.32,-637.86,1963.19],[0.660203,0.227637,0.680878,-0.220723],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]], v6000, z100, tGripper;
     ENDIF
    ENDIF
  ENDPROC



Habt ihr da eine Idee? 
Wir wären super froh um eine smarte Lösung. Wie ihr seht, sind wir da noch Anfänger...

Gruss Santa
  • gefällt mir    Danke

Heute um 18:33:29
Antwort #1

Werbung

Gast

24. September 2018, 17:36:34
Antwort #1
Offline

Programmiersklave


Brauchst 2 Persistenten bzw. Variablen, eine zählt laufend mit, die andere dient als Vergleich und wird von Euch jeweils angepasst (über die Datenansicht).
Also z. B.: 

PERS num zyklenzaehler:=0;
PERS num jedesXte:=3;

Den Zyklenzähler am besten einmalig zu jedem Programmstart auf 1 setzen und dann nach jedem Zyklus um 1 erhöhen..
Für den Vergleich eignet  sich gut der MOD-Operator, der den Rest aus einer Ganzzahldivision zurückgibt. Immer, wenn dieser Rest 0 ist, geht es glatt auf. Also kannst Du die Bedingung für "Band" verknüpfen mit "geht nicht glatt auf":
IF (zzDI50_11 = 0) OR ((zyklenzaehler MOD jedesXte)>0)  THEN ...
Selbst wenn der Schalter jetzt auf 1 steht, ist die Bedingung trotzdem wahr, wenn aus der Rechnung zykluszaehler dividiert durch jedesXte ein Rest überbleibt.....
Grüße,
Michael
  • gefällt mir    Danke


Teile per facebook Teile per linkedin Teile per pinterest Teile per reddit Teile per twitter
 

über das Roboterforum

Nutzungsbedingungen Impressum Datenschutzerklärung

Sponsoren des Roboterforums

ROBTEC GmbH