Lagerplatz-Abfrage SCL TIA Portal

DeSc

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen :)

ich habe ein paar Probleme. Und zwar programmiere ich gerade ein Programm im TIA Portal in SCL für eine kleine Modellanlage, die wie folgt abläuft:
Ein Zylinder schiebt aus einem Magazin eine Dose auf ein Förderband. Am Ende des Förderbandes nimmt ein Greifer sie mit Saugnapf auf und übergibt sie an einen Sortierer, dieser lagert sie in ein Hochregal ein und fährt dann wieder zurück zur Übergabeposition. Und dann alles von vorne.
Das ganze soll als Automatikbetrieb ablaufen und dazu muss das Programm irgendwie bei jedem Durchgang die Lagerplätze abfragen.

Der Sortierer steht vorne in der Übergabeposition und hat die Dose vom Greifer erhalten. Nun soll das Programm die Lagerplätze von unten nach oben und von vorne nach hinten abfragen und wenn der Lagerplatz als leer (FALSE) angegeben ist, soll der Sortierer die Dose dorthin einlagern.
Also wie folgt:
Als erstes LP0.1 abfragen, wenn FALSE, dann einlagern und zurück zur Übergabeposition fahren, wenn TRUE, dann LP.02 abfragen.
Wenn LP0.2 FALSE, dann einlagern und zur Übergabeposition zurück fahren, wenn TRUE, dann LP0.3 abfragen.
Wie man sieht, orientiert sich der Sortierer über die Gabellichtschranken BG10 und BG15 und die Bohrungen im Metall (Siehe Bilder).
Um zum Beispiel den LP1.3 (Siehe Bilder) anzufahren und dort einzulagern, soll der Sortierer drei positive Flanken in horizontaler Richtung (BG10) zählen und dann stehen bleiben und zwei positive Flanken in vertikaler Richtung zählen und dann stehen bleiben. Dieser Platz soll dann als belegt (TRUE) gespeichert werden. Das Einlagern selber kriege ich ebenfalls programmiert. Das gezielte Anfahren der Lagerposition kriege ich nicht hin.
Der bisherige Programmcode ist ebenfalls angehängt. Ab Zeile 150 bin ich mir mit der ganzen Sache nicht mehr sicher. Die While-Schleife scheint endlos zu laufen, der BG10_Zähler beginnt nicht zu zählen und der Sortierer fährt somit gar nicht erst vorwärts. Die SPS geht sofort in Stopp. Da scheint einiges nicht zu funktionieren.
Ich habs bisher nur für die untere Reihe versucht, nicht wundern.
Hat vielleicht jemand ein paar Tipps oder Hinweise für mich, was ich falsch mache?

Dankeschön!

Hier sind nochmal einige Bilder und der gesamte Code mit meiner Fehlerbeschreibung:
https://docdro.id/N65j0ml

Code:
#Positive_Flanke_BG10 := NOT #bg10 AND #Stat_BG10;
#Stat_BG10 := #bg10; // Positive Flanke BG10 definiert

IF
    #Positive_Flanke_BG10 = TRUE
THEN
    #BG10_Zähler := #BG10_Zähler + 1;
    #Positive_Flanke_BG10 := FALSE;
ELSE
    #Positive_Flanke_BG10 := FALSE;
END_IF; // BG10_Zähler zählt bei jeder positiven Flanke hoch

#Positive_Flanke_BG10 := NOT #bg10 AND #Stat_BG10;
#Stat_BG10 := #bg10; // Positive Flanke BG15 definiert

IF
    #Positive_Flanke_BG10 = TRUE
THEN
    #BG10_Zähler := #BG10_Zähler + 1;
    #Positive_Flanke_BG10 := FALSE;
ELSE
    #Positive_Flanke_BG10 := FALSE;
END_IF; // BG15_Zähler zählt bei jeder positiven Flanke hoch

IF
    #Schritt = 12 AND
    #"LP0.1" = FALSE
THEN
    #Einlagerung := 1;
    #"LP0.1" := TRUE;
   
ELSIF
    #Schritt = 12 AND
    #"LP0.2" = FALSE
THEN
    #Einlagerung := 2;
    #"LP0.2" := TRUE;
   
ELSIF
    #Schritt = 12 AND
    #"LP0.3" = FALSE
THEN
    #Einlagerung := 3;
    #"LP0.3" := TRUE;
   
ELSIF
    #Schritt = 12 AND
    #"LP0.4" = FALSE
THEN
    #Einlagerung := 4;
    #"LP0.4" := TRUE;
   
ELSIF
    #Schritt = 12 AND
    #"LP0.5" = FALSE
THEN
    #Einlagerung := 5;
    #"LP0.5" := TRUE;
   
ELSIF
    #Schritt = 12 AND
    #"LP0.6" = FALSE
THEN
    #Einlagerung := 6;
    #"LP0.6" := TRUE;
END_IF; // Lagerplatz-Abfrage

CASE #Einlagerung OF
    1:
        WHILE #BG10_Zähler < 1 DO
            #kr1 := TRUE;
        END_WHILE;
        #kr1 := FALSE;
    2:
        WHILE #BG10_Zähler < 2 DO
            #kr1 := TRUE;
        END_WHILE;
        #kr1 := FALSE;
    3:
        WHILE #BG10_Zähler < 3 DO
            #kr1 := TRUE;
        END_WHILE;
        #kr1 := FALSE;
    4:
        WHILE #BG10_Zähler < 4 DO
            #kr1 := TRUE;
        END_WHILE;
        #kr1 := FALSE;
    5:
        WHILE #BG10_Zähler < 5 DO
            #kr1 := TRUE;
        END_WHILE;
        #kr1 := FALSE;
    6:
        WHILE #BG10_Zähler < 6 DO
            #kr1 := TRUE;
        END_WHILE;
        #kr1 := FALSE;
END_CASE; // Einlagervorgang
 
Die While-Schleife scheint endlos zu laufen, der BG10_Zähler beginnt nicht zu zählen (...) Die SPS geht sofort in Stopp.
In einem SPS-Programm kann man nicht in einer Schleife "auf der Stelle treten" und länger als die max. Zykluszeit auf irgendwas warten. Eine SPS hat noch viel mehr zu tun, als nur ein Signal zu beobachten... Ein SPS-Programm wird schon in einer Schleife ausgeführt, so daß man einfach nur in jedem Programmdurchlauf schauen braucht, ob der erwartete Zustand sich eingestellt hat.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du bildest erst eine positive Flanke um sie dann kurz drauf wieder auf False zu setzen und neu zu bilden. Die zweite Flanke kommt aber nie weil du den selben Flankenmerker verwendest.
 
AppleScript:
VAR_INPUT
    ibLsHor         : INT  ; // LichtSchranke horizontal
    ibLsVer         : INT  ; // LichtSchranke vertikal
END_VAR

VAR_IN_OUT
    ioiRestPosHor   : INT  ; // "Abstand" zur ZielSpalte
    ioiRestPosVer   : INT  ; // "Abstand" zur ZielZeile
END_VAR

VAR_OUTPUT
    obFahrBefehlHor : BOOL ; // FahrBefehl für horizontal-Achse
    obFahrBefehlVer : BOOL ; // FahrBefehl für vertikal-Achse
END_VAR

VAR_STAT
    sbLsHorPre      : BOOL ; // FlankenMerker für LichtSchranke horizontal
    sbLsVerPre      : BOOL ; // FlankenMerker für LichtSchranke vertikal
    sbVerEnab       : BOOL ; // Freigabe für vertikal, sobald horizontal Spalte 1 erreicht ist
END_VAR
    
ioiRestPosHor := LIMIT(0, ioiRestPosHor, ciMaxHor) ; // ciMaxHor = max. SpaltenNr. (7?)
IF ibLsHor AND NOT sbLsHorPre AND ioiRestPosHor > 0 THEN
    ioiRestPosHor := ioiRestPosHor -1 ;  // bei pos. Flanke Rest um 1 vermindern
    sbVerEnab     := ioiRestPosVer > 0 ;
                     // sbVerEnab gibt vert. Positionierung erst ab Spalte 1 frei
END_IF ;
sbLsHorPre := ibLsHor ; // FlankenMerker für "horizontal zählen"
obFahrBefehlHor   := ioiRestPosHor > 0 ;

ioiRestPosVer := LIMIT(0, ioiRestPosVer, ciMaxVer) ; // ciMaxVer = max. ZeilenNr. (4?)
IF ibLsVer AND NOT sbLsVerPre AND ioiRestPosVer > 0 THEN
    ioiRestPosVer := ioiRestPosVer -1 ; // bei pos. Flanke Rest um 1 vermindern
    sbVerEnab     := sbVerEnab AND (ioiRestPosVer > 0) ;
                     // sbVerEnab wird rückgesetzt, sobald vert. Position erreicht ist
END_IF ;
sbLsVerPre := ibLsVer ; // FlankenMerker für "vertikal zählen"
obFahrBefehlVer   := sbVerEnab AND (ioiRestPosVer > 0) ;
Einen Zyklus lang die gewünschte ZeilenNr nach 'ioiRestPosVer' und die gewünschte SpaltenNr nach 'ioiRestPosHor' kopieren.
Dadurch wird zunächst die horizontale Achse gestartet und - sobald horizontal die 1. Spalte erreicht ist - auch die vertikale Achse.
Beim Passieren der Löcher an den GabelLichtSchranken werden die 'ioiRestPosVer' und 'ioiRestPosHor' jeweils um 1 vermindert.
Wird dabei der Wert 0 erreicht, wird die entsprechende Achse gestoppt.
Dazu müssen die Ausgänge 'obFahrBefehlHor' und 'obFahrBefehlVer' allerdings noch mit den entsprechenden Achsen verknüpft werden.
Andere Bewegungen der Achsen (z.B. das Fahren zurück in die AusgangsPosition) sind nicht Bestandteil des obigen Programms.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls die Belegung der Lagerplätze "nur" gespeichert wird, dann erübrigt sich die folgende Anmerkung: Wenn die Belegung der Lagerplätze mit Sensoren abgefragt werden müsste, dann wäre die Zuordnung "FALSE = Lagerplatz leer" nicht drahtbruchsicher und könnte zu einem Problem führen.
 
Zurück
Oben