Autor Thema: E4 als Positioniermodul  (Gelesen 628 mal)

Offline radar17892

  • Sr. Member
  • ****
  • Beiträge: 617
  • Think easy!
    • mollgruppe
E4 als Positioniermodul
« am: September 15, 2022, 17:18:12 Nachmittag »
Hallo,
ich möchte ein schon länger geplantes Projekt umsetzen.
Eine E4 soll als Achspositioniermodul mit Schleich-/Eilgang dienen. (ausbaufähig mit 8TE Modul auf 2 Achsen möglich)
Die Bedienung erfolgt entweder über ein XV100-E4 oder übergeordnete Steuerung per ModbusTCP.
Das Programm habe ich schon fast fertig und muss noch getestet werden. Eventuell hat noch jemand Vorschläge, oder hilft beim testen.

Folgendes ist integriert:
- Positionsermittlung mit Incrmentalgeber
- Ausgabe der Fahrbefehle wählbar: Standart: Q1++,Q2+,Q3-,Q4-- oder für FU: Q1=Frg, Q2=Richtung, Q3=n1, Q4=n2
- automatische Referenzierung
- positionieren über Zielwertvorgabe und Startbefehl (erst mal keine Schleifenfahrt)
- Achse mit HW-Endschaltern, SW-Endschaltern, Um-/Abschaltpunkten, Zielfenster, Referenznocke
- Tippbetrieb mit zwei Geschwindigkeiten
- evl Schleppfehlerüberwachung

Zitat
Gesteuerte Positionierung
Jeder Positioniervorgang ist gekennzeichnet durch
● eine Startposition,
● ein Ziel, auf das positioniert wird,
● Parameter, die den Ablauf des Positionierens bestimmen.
Das Ziel wird zunächst mit einer höheren Geschwindigkeit, dem Eilgang, angefahren. In
einem vorgegebenen Abstand zum Ziel wird auf eine niedrigere Geschwindigkeit, den
Schleichgang, umgeschaltet. Kurz bevor die Achse das Ziel erreicht, ebenfalls in einem
vorgegebenen Abstand zum Ziel, wird der Antrieb abgeschaltet. Dabei überwacht die
Baugruppe den Zieleinlauf.
Der Antrieb wird über Digitalausgänge mit Eilgang oder Schleichgang und der
entsprechenden Richtung angesteuert.

Ziel:
Das Ziel ist die absolute Position auf der Achse, die bei einer Positionierung
angefahren wird.
Definition der Schaltpunkte und Schaltbereiche:
-Arbeitsbereich definiert den Bereich, den Sie für Ihre Aufgabe durch die
Softwareendschalter bzw. das Ende der Rundachse bestimmen.
-Umschaltdifferenz definiert den Abstand zum Ziel, an dem der Antrieb vom Eilgang
auf den Schleichgang umgeschaltet wird.
-Umschaltpunkt definiert die Position, an der der Antrieb vom Eilgang auf den
Schleichgang umgeschaltet wird.
-Abschaltdifferenz definiert den Abstand zum Ziel, an dem der Antrieb abgeschaltet
wird.
-Abschaltpunkt definiert die Position, an der der Antrieb abgeschaltet wird. Die
Positionierbaugruppe wird ab diesem Punkt
Überwachungsfunktionen übernehmen.
-Zielbereich definiert die Positioniergenauigkeit Ihrer Anwendung und liegt
symmetrisch um das Ziel.
-Stillstandsbereich definiert einen symmetrischen Bereich um das Ziel, der von
Positionierbaugruppe überwacht wird.

 Quelle Siemens Beschreibung FM351

Gruß Thomas
« Letzte Änderung: September 19, 2022, 17:44:37 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!

Offline radar17892

  • Sr. Member
  • ****
  • Beiträge: 617
  • Think easy!
    • mollgruppe
Antw:E4 als Positioniermodul
« Antwort #1 am: September 17, 2022, 12:34:35 Nachmittag »
Die ersten Tests sind gemacht und Fehler beseitigt. Der Prototyp läuft so weit schon mal.
Aktueller Stand vom 19.09.2022
//Incrementalzähler
CI01 (
EN := TRUE,
SE := M468, //Referenzpunkt setzen
RE := ,
SH := MD20,
SL := MD21,
SV := MD19,
OF => M09,
FB => M10,
CY => ,
ZE => ,
QV => MD18);
//Zielabstand bestimmen
MD101:= MD100 - MD18;
M471:= M466 and (MD101 <= MW49) and (MD101 >= -MW49); // "In Position"
//Endschalter in Statuswort schreiben 0=ausgelöst
M475:= not M09;
M476:= not M10;
M477:= I03;
M478:= I04;
M479:= I05;
//Fehlermeldungen in Fehlerwort schreiben
M483:= not I03;
M484:= not I04;
M485:= M10;
M486:= M09;
M487:= not M466;

M472:= MW31 > 0; //Fehler liegt an

(*Umrechnung INC <-> 0,1mm wenn benötigt*)
(* muss an die Achse angepasst werden
LS01 (
EN := true,
I1 := CI01QV,
X1 := ‑2147483648,
Y1 := ,
X2 := 2147483647,
Y2 := ,
QV => );

*)

//bei Frg Tippbetrieb Ref und Posi auf Startposition 1 bringen
IF I07 = TRUE THEN
MB127:= 1;
MB129:= 1;
M469:= true;
ELSE M469:= false;
END_IF;
//Stopbedingungen sammeln
M16:= not I06 or M452;
(*Referenzierung*)
CASE MB129 OF
0: //Init
M465:= false;
M466:= false; //Referenz ungültig
    M467:= false;
    M01:= false;
    M02:= false;
    MB129:= 1;
1:  IF M468 THEN //Referenzierung fertig
M465:= false;
    M466:= true;
    M468:= false;
    M467:= false;
    END_IF;
// warte auf start
M01:= false;
    M02:= false;
IF M449 AND NOT M466 and I06 and not I07 and not M467 THEN
    M465:= true;
    M467:= true;
    MB129:= 2;
    END_IF;
2:  // Auswahl ob Reffahrt nach + oder - starten soll
IF M497 THEN //Ref.fahrt plus
    MB129:= 3;
    ELSE MB129:= 6;    
    END_IF;
3: //langsam plus bis Ref Nocke erreicht
M01:= true;
M02:= false;
IF M16 or not I04 THEN //stop ausgelöst
MB129:= 1;
ELSIF Not I05 THEN //Ref Nocke erreicht
M01:= false;
MB129:= 4;
ELSE ;
END_IF;
4: MB131:= MB131 + 1; //50 Zyklen warten für Umsteuerung Antrieb
IF MB131 > 50 THEN
MB129:= 5;
MB131:= 0;
END_IF;
5: //Ref Nocke in - verlassen und Referenzwert setzen
M02:= true;
IF M16 THEN //stop ausgelöst
MB129:= 1;
ELSIF I05 THEN
M02:= false;
M468:= true;
MB129:= 1;
ELSE ;
END_IF;
6: //langsam minus bis Ref Nocke erreicht
M01:= true;
IF M16 or not I03 THEN //stop ausgelöst
MB129:= 1;
ELSIF Not I05 THEN //Ref Nocke erreicht
M02:= false;
MB129:= 7;
END_IF;
7: MB131:= MB131 + 1; //50 Zyklen warten für Umsteuerung Antrieb
IF MB131 > 50 THEN
MB129:= 8;
MB131:= 0;
END_IF;
8: //Ref Nocke in + verlassen und Referenzwert setzen
M01:= true;
IF M16 THEN //stop ausgelöst
MB129:= 1;
ELSIF I05 THEN
M01:= false;
M468:= true;
MB129:= 1;
END_IF;
ELSE
MB129:= 0;
END_CASE;

(*Positionierung*)
//Flanke Start Auftrag
UF01 (
NAME := "R_TRIG",
VERSION := "V1.00",
I1 := M450,
Q1 => );

CASE MB127 OF
0: //Init
M03:= false;
M04:= false;
M05:= false;
M06:= false;
MB127:= 1;
1:  //Warte auf Fahrbefehl
M03:= false;
M04:= false;
M05:= false;
M06:= false;
IF UF01Q1 AND M466 and not M467 and not M465 THEN //Startbedingung
    MB127:= 2;
    M482:= false;
    END_IF;
2:  //Ziel prüfen und setzen, Geschwindigkeit und Richtung bestimmen
M467:= true;
M471:= false;
IF (MD22 > MD20) or (MD22 < MD21) THEN //Ziel außerhalb SW Endschalter
M481:= true;
MB127:= 1;
END_IF;
IF M481 = false THEN //Ziel übernehmen wenn OK
MD100:= MD22;
// Geschwindigkeit und Richtung bestimmen
IF MD101 > MW47 THEN
MB127:= 3;
ELSIF (MD101 < -MW47) THEN
MB127:= 5;
ELSIF (MD101 >= MW48) THEN
MB127:= 4;
ELSIF (MD101 <= -MW48) THEN
MB127:= 6;
ELSE MB127:= 8;
END_IF;
END_IF;

3: //Schnell plus fahren bis Umschaltpunkt
M03:= true;
M04:= false;
M05:= false;
M06:= false;
IF M16 or M09 THEN //stop ausgelöst
MB127:= 1;
ELSIF MD101 < MW47 THEN
MB127:= 4;
END_IF;
4:  //Langsam plus bis Abschaltpunkt
M03:= false;
M04:= true;
M05:= false;
M06:= false;
IF M16 or M09 THEN //stop ausgelöst
MB127:= 1;
ELSIF MD101 < MW48 THEN
MB127:= 8;
END_IF;
5:  //Schnell minus fahren bis Umschaltpunkt
M03:= false;
M04:= false;
M05:= true;
M06:= false;
IF M16 or M10 THEN //stop ausgelöst
MB127:= 1;
ELSIF MD101 > -MW47 THEN
MB127:= 6;
END_IF;
6: //Langsam minus bis Abschaltpunkt
M03:= false;
M04:= false;
M05:= false;
M06:= true;
IF M16 or M10 THEN //stop ausgelöst
MB127:= 1;
ELSIF MD101 > -MW48 THEN
MB127:= 8;
END_IF;
7: MB127:= 1; // reserve
8:  //Zieleinlauf
M03:= false;
M04:= false;
M05:= false;
M06:= false;
//kurz warten das Antrieb ins Ziel läuft und steht
IF T01Q1 and not M471 THEN //Ziel verfehlt
M482:= true;
MB127:= 9;
ELSIF T01Q1 and M471 THEN //Ziel getroffen
MB127:= 9;
END_IF;
9: //fertig, gehe zu 1
M467:= false;
MB127:= 1;
ELSE
MB127:= 1;
END_CASE;
//Timer Zieleinlauf
T01 (
EN := MB127 = 8,
RE := MB127 = 1,
ST := ,
I1 := MW50, //Zeit der Antriebsträgheit anpassen!
I2 := ,
Q1 => ,
QV => );

//Tippbetrieb mit zwei Geschwindigkeiten, nach 3s auf schnell schalten
T02 (
EN := M454 or M455,
RE := not I07,
ST := ,
I1 := T#3000ms,
I2 := ,
Q1 => ,
QV => );
M12:= I04 and I07 and M454 and not T02Q1;
M13:= I04 and I07 and M454 and T02Q1;
M14:= I03 and I07 and M455 and not T02Q1;
M15:= I03 and I07 and M455 and T02Q1;

(*Fahrbefehle ausgeben*)
//Umschaltsperre bei Richtungsänderung schnell
T03 (
EN := Q01,
RE := ,
ST := ,
I1 := T#1000ms,
I2 := ,
Q1 => ,
QV => );
T04 (
EN := Q04,
RE := ,
ST := ,
I1 := T#1000ms,
I2 := ,
Q1 => ,
QV => );
//Ausgänge nach Modus ansteuern
IF M498 = false THEN
//Ausgabe Standart: Q1++,Q2+,Q3-,Q4--
Q01:= (M13 or M03) and I04 and not(Q2 or Q3 or Q4 or M09 or T04Q1);
Q02:= (M12 or M04 or M01) and I04 and not(Q1 or Q3 or Q4 or M09 or T04Q1);
Q03:= (M14 or M06 or M02) and I03 and not(Q1 or Q2 or Q4 or M10 or T03Q1);
Q04:= (M15 or M05) and I03 and not(Q1 or Q2 or Q3 or M10 or T03Q1);
ELSE
//Ausgabe FU: Q1=Frg, Q2=Richtung 1=minus, Q3=n1, Q4=n2
Q01:= (Q03 or Q04) and ((Q02 and I03) or (not Q02 and I04));
Q02:= M01 or M03 or M04 and M12 and M13;
Q03:= (M12 or M14 or M04 or M06 or M02 or M01) and not Q04;
Q04:= (M13 or M03 or M15 or M05) and not Q03;
END_IF;

//nur erst mal Testanzeige
D01 (
EN := true,
AI := ,
Q1 => ,
AO => );
Im Anhang das aktuelle Programm.
Da das Galileoprojekt zu groß ist um hier hochgeladen zu werden, hab ich es auf Dropbox gelegt.
https://www.dropbox.com/s/db08xjcm9qmhsep/Positionierung20220919.zip?dl=0

Ich würde mich über Rückmeldungen freuen.
Gruß Thomas
« Letzte Änderung: September 19, 2022, 18:11:59 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!