Beiträge von DiDi

    Die vorgeschlagene Lösung wird wohl so nicht funktionieren. Wenn es allgemein möglich wäre, der Steuerung im Betrieb schnell mal programmgesteuert die Maschinendaten zu ändern, geb es wohl einige Überraschungen.


    Wenn das Antriebe Aus über eine normale SPS über Feldbus kommt, passt das nicht zur Personensicherheit. Da wird zumindest im europäischen Raum zweikanalige Hardware gefordert.(Kategorie 3, 1 Fehler sicher)


    Ausserdem wird das Hauptschütz nur begrenzt leben. Das ist nicht dafür ausgelegt bei jedem Bauteil unter Last geöffnet zu werden.


    Eine sicherheitstechnisch akzeptable Lösung könnte z. B. mit zwei Initiatoren erfolgen. Die Ini's werden so aufgebaut, das sie in der Position am Rolltor betätigt sind. Das Rolltor kann nur geöffnet werden, wenn beide Inis belegt. Wenn Rolltor offen und ein Ini nicht belegt wird mit Pnoz zweikanalig z.B. der Bedienerschutz geöffnet.


    Eine bessere Lösung wäre mit SafeRobot möglich. Da gibt es eine Stillstandsüberwachung. Dafür ist es aber wohl etwas spät.


    Gruss DiDi

    Global Signal gehört leider nicht zum KRL Angebot.


    Alternativ kann mann verwenden:


    Global INT N_MessBTabgb = 2804
    SIGNAL I_MessBTabgb $IN[N_MessBTabgb]


    Die SIGNAL Anweisung muss dann zwar in alle Module, die das Signal verwenden, ansonsten aber Funktion wie gewünscht.


    Gruss DiDi

    Der Ansatz mit dem Funktiongenerator ist sicher der richtige. Damit kann man die Bahn beeinflussen. Prinzipiell kann man entweder online während der Roboter fährt rechnen oder offline, d.h. vor dem losfahren eine Ausweichkontur berechnen.
    Falls man online rechnen möchte, evtl. in KRL, dann muss man das Problem wohl deutlich reduzieren, da die Rechenkapazitäten begrenzt sind.


    Eine reduzierte Problemstellung könnte z.B. sein:
    - lineare Bewegung ohne Orientierungsänderung
    - Hindernis ist unendlich hohe Säule senkrecht auf der XY-Ebene
    - Mit etwas Mathematik müsste man ausrechnen können, ob die Gerade die Säule schneidet
    - Falls man fesstellt, das man schneidet, könnte man während der Fahrt in einer Vorzugrichtung mit dem Funktionsgenerator in einem festen Takt einen Offset draufpacken.
    - Wenn man nicht mehr schneidet, rechnet man den Offset wieder runter.


    Evtl. reicht der reduzierte Ansatz für die Problemlösung aus. Ansonsten steigt der mathematische Aufwand.


    Gruss DiDi

    Das Problem kann eigentlich nur an Status und Turn liegen.
    Wenn im Bewegungsbefehl Status und Turn fehlen z.B :PTP {x 0,y 0,z 0,a 0,b 0,c 0} versucht der Roboter den Punkt mit den aktuellen Werten von S und T anzufahren. Falls beim Losfahren z.B. aktuell Achse1 positiv ist, die Base aber nur mit negativer Achse 1 erreicht werden kann, so versucht es der Roboter trotzdem mit positiver Achse1 und stellt fest, das er so im Endschalter landen würde.


    Als Lösung könntest du den Ursprung mit PTP anfahren und dir $Pos_Act.S und $Pos_Act.T anschauen. Falls die z.B. 2 und 5 sind führt der folgende Befehl zum Ursprung:
    PTP {x 0,y 0,z 0,a 0,b 0,c 0, S 2, T 5}
    Ein LIN Befehl würde auch funktionieren, da er dabei immer die nächstgelegenen S und T Werte nimmt und sich nicht darum kümmert was im Befehl steht.


    Gruss DiDi

    Hallo Zusammen,


    man kann auch Arrays mit lokalen Typen übergeben. Wie schon geschrieben muss die Übergabe bei Arrays aber :OUT sein und im Ziel müssen die leeren Klammern verwendet werden.


    Bsp.:
    Hauptprogramm:


    DEF T1()


    STRUC MyStruc INT I1, REAL R1
    DECL MyStruc MyVariable[5]


    EXT T3(MyStruc[]:OUT)


    MyVariable[1].i1=5
    MyVariable[1].r1=1.2


    T3(MyVariable[])


    END


    Unterprogramm:


    DEF T3(MySubVariable[]:OUT)


    STRUC MyStruc INT I1, REAL R1
    DECL MyStruc MySubVariable[]


    IF MySubVariable[1].I1>MySubVariable[1].R1 THEN
    MySubVariable[1].I1=MySubVariable[1].R1
    ENDIF


    halt


    END


    Gruss DiDi