-> Hier kostenlos registrieren
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
... ich tippe da auch auf ein Timing Problem. Ich habe jetzt Deine Schrittkette nicht komplett überblickt, aber wenn das EXCECUTE nur einen Zyklus ansteht und z.B. dein OB schneller als z.B. 4ms rennt, dann wäre das eine Erklärung.
Ich würde da immer ein Handshake programmieren. D.h. wenn das EXECUTE gesendet wird, dieses mit dem Signal Achse fährt vorwärts (oder rückwärts) oder (Sollwert steht "nicht mehr") erst wieder zurücksetzen.
Für einen schnellen Test kannst Du den Code ggf. in einen Zeit- OB (z.B. 10ms) hängen oder eine Mindestzykluszeit programmiern.
Außerdem wäre ein Trace auf dem Antrieb hier auch zielführender. Ggf. kommt ja Dein EXCEUTE unten im Antrieb wirklich nicht an ...
REGION Parameter_Verfahr-Satz0_Set
(* --- Schrittkette Verfahr-Satz 0 setzen und in Servo laden --- *)
CASE #nSchrittketteParaSatz0 OF
1: // Startwerte Moment setzen
#FB_SINA_PARA_S_Instance.Start := False;
#FB_SINA_PARA_S_Instance.ReadWrite := 1; //schreiben
#FB_SINA_PARA_S_Instance.AxisNo := #I_AxisNo_Starter;
#FB_SINA_PARA_S_Instance.hardwareId := #I_HWID_Sollwert_Slot;
#FB_SINA_PARA_S_Instance.Parameter := 2622;
#FB_SINA_PARA_S_Instance.Index := 0;
#FB_SINA_PARA_S_Instance.ValueWrite2 := #I_nMaxTorqueTravelToFixedStop;
#nSetSatz0_ok := 0;
#nSchrittketteParaSatz0 := 2;
2: // Auftrag starten
#FB_SINA_PARA_S_Instance.Start := True;
IF #FB_SINA_PARA_S_Instance.Busy
AND NOT #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 3;
END_IF;
3: // Auftrag fertig
#FB_SINA_PARA_S_Instance.Start := True;
IF NOT #FB_SINA_PARA_S_Instance.Busy
AND #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 4;
#FB_SINA_PARA_S_Instance.Start := False;
END_IF;
4: // Rückmeldung auslesen
#FB_SINA_PARA_S_Instance.ReadWrite := 0; //lesen
#nSchrittketteParaSatz0 := 5;
5: // Rückmeldung auslesen starten
#FB_SINA_PARA_S_Instance.Start := True;
IF #FB_SINA_PARA_S_Instance.Busy
AND NOT #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 6;
END_IF;
6: // Auftrag fertig
#FB_SINA_PARA_S_Instance.Start := True;
IF NOT #FB_SINA_PARA_S_Instance.Busy
AND #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 11;
#FB_SINA_PARA_S_Instance.Start := False;
END_IF;
7: //Korrekter Wert zurückgelesen?
IF (#FB_SINA_PARA_S_Instance.ValueRead2 = #I_nMaxTorqueTravelToFixedStop) THEN
#nSchrittketteParaSatz0 := 11;
#nSetSatz0_ok := 1;
ELSE
#nSchrittketteParaSatz0 := 4;
END_IF;
11: // Startwerte Position setzen
IF #O_bTarget_forward THEN
#TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
ELSE IF #O_bTarget_forward THEN
#TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
ELSE
#TorquePos := #SetPos; //Das ergibt ziemlich sicher einen Fehler, also nochmal testen und besser machen
END_IF;
END_IF;
#FB_SINA_PARA_S_Instance.ReadWrite := 1; //schreiben
#FB_SINA_PARA_S_Instance.AxisNo := #I_AxisNo_Starter;
#FB_SINA_PARA_S_Instance.hardwareId := #I_HWID_Sollwert_Slot;
#FB_SINA_PARA_S_Instance.Parameter := 2617;
#FB_SINA_PARA_S_Instance.Index := 0;
#FB_SINA_PARA_S_Instance.ValueWrite2 := #TorquePos;
#nSchrittketteParaSatz0 := 12;
12: // Auftrag starten
#FB_SINA_PARA_S_Instance.Start := True;
IF #FB_SINA_PARA_S_Instance.Busy
AND NOT #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 13;
END_IF;
13: // Auftrag fertig
#FB_SINA_PARA_S_Instance.Start := True;
IF NOT #FB_SINA_PARA_S_Instance.Busy
AND #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 14;
#FB_SINA_PARA_S_Instance.Start := False;
END_IF;
14: // Rückmeldung auslesen
#FB_SINA_PARA_S_Instance.ReadWrite := 0; //lesen
#nSchrittketteParaSatz0 := 15;
15: // Rückmeldung auslesen starten
#FB_SINA_PARA_S_Instance.Start := True;
IF #FB_SINA_PARA_S_Instance.Busy
AND NOT #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 16;
END_IF;
16: // Auftrag fertig
#FB_SINA_PARA_S_Instance.Start := True;
IF NOT #FB_SINA_PARA_S_Instance.Busy
AND #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 21;
#FB_SINA_PARA_S_Instance.Start := False;
END_IF;
17: //Korrekter Wert zurückgelesen?
IF (#FB_SINA_PARA_S_Instance.ValueRead2 = #TorquePos) THEN
#nSchrittketteParaSatz0 := 21;
#nSetSatz0_ok := 2;
ELSE
#nSchrittketteParaSatz0 := 14;
END_IF;
21: // Startwerte Geschwindigkeit setzen
#FB_SINA_PARA_S_Instance.ReadWrite := 1; //schreiben
#FB_SINA_PARA_S_Instance.AxisNo := #I_AxisNo_Starter;
#FB_SINA_PARA_S_Instance.hardwareId := #I_HWID_Sollwert_Slot;
#FB_SINA_PARA_S_Instance.Parameter := 2618;
#FB_SINA_PARA_S_Instance.Index := 0;
#FB_SINA_PARA_S_Instance.ValueWrite2 := #SetVel * #I_Velocity_numerator / #I_Velocity_denominator;
#nSchrittketteParaSatz0 := 22;
22: // Auftrag starten
#FB_SINA_PARA_S_Instance.Start := True;
IF #FB_SINA_PARA_S_Instance.Busy
AND NOT #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 23;
END_IF;
23: // Auftrag fertig
#FB_SINA_PARA_S_Instance.Start := True;
IF NOT #FB_SINA_PARA_S_Instance.Busy
AND #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 24;
#FB_SINA_PARA_S_Instance.Start := False;
END_IF;
24: // Rückmeldung auslesen
#FB_SINA_PARA_S_Instance.ReadWrite := 0; //lesen
#nSchrittketteParaSatz0 := 25;
25: // Rückmeldung auslesen starten
#FB_SINA_PARA_S_Instance.Start := True;
IF #FB_SINA_PARA_S_Instance.Busy
AND NOT #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 26;
END_IF;
26: // Auftrag fertig
#FB_SINA_PARA_S_Instance.Start := True;
IF NOT #FB_SINA_PARA_S_Instance.Busy
AND #FB_SINA_PARA_S_Instance.Done
THEN
#nSchrittketteParaSatz0 := 27;
#FB_SINA_PARA_S_Instance.Start := False;
END_IF;
27: //Korrekter Wert zurückgelese?
IF (#FB_SINA_PARA_S_Instance.ValueRead2 = (#SetVel * #I_Velocity_numerator / #I_Velocity_denominator)) THEN
#nSchrittketteParaSatz0 := 31;
#nSetSatz0_ok := 3;
ELSE
#nSchrittketteParaSatz0 := 24;
END_IF;
31: // Ende
#nSchrittketteParaSatz0 := 0;
#TravelToFixedStopLoad_ok := True;
#TravelToFixedStopStart := True;
ELSE // Statement section ELSE
;
END_CASE;
(* --- Aufruf Parametrierung Siemens -- *)
#FB_SINA_PARA_S_Instance();
Ja und hier Drehzahl und Lageregelung gemischt - Sinamics S120 mit CU320 diskutieren wir noch weiter, ich glaube ich hab dann hier noch Fragen zum Moment diskutiert, was eher im falschen Thread war.
@Roland
Du gehst da ganz schön ans Eingemachte. ;-)
Ich mache es gerade so und arbeite an einem Baustein:
Nutzung von SinaPos Servo S120 mit CU310 und Telegramm 111, EPOS und MDI
Du kannst mit dem SinaPos folgende Betriebsarten nutzen:
// 1 = Positionieren Relativ
// 2 = Positionieren Absolut
// 3 = Positionieren als Einrichten
// 4 = Referenzpunktfahrt
// 5 = Referenzpunkt setzen
// 6 = Verfahrsatz 0 – 15/63 (G120/S120)
// 7 = Tippen
// 8 = inkrementell Tippen
Mit 2 fahre ich ganz normale Positionierung.
Mit 3 fahre ich Geschwindigkeitsbetrieb ohne Position, umschaltbar auf Positionierung (Rundachse mit Modulo)
Mit 6 fahre ich dann Verfahrsatz 0 "Fahren auf Festanschlag"
Dazu im Servo Verfahrsatz 0 anlegen, dort "Fahren auf Festanschlag" ans Betriebsart eintragen.
Die nötigen Daten, Position, Geschwindigkeit, Moment übertrage ich per Parameter-Transfer (Sina_Para_S).
Zusätzlich habe ich, wie im o.g. Thread besprochen noch eine Momentenbegrenzung, über einen prozentualen Wert.
Hier mal, wie ich die Parametertransfer mache (Jedesmal, vor einem Start):
Code:REGION Parameter_Verfahr-Satz0_Set (* --- Schrittkette Verfahr-Satz 0 setzen und in Servo laden --- *) CASE #nSchrittketteParaSatz0 OF 1: // Startwerte Moment setzen #FB_SINA_PARA_S_Instance.Start := False; #FB_SINA_PARA_S_Instance.ReadWrite := 1; //schreiben #FB_SINA_PARA_S_Instance.AxisNo := #I_AxisNo_Starter; #FB_SINA_PARA_S_Instance.hardwareId := #I_HWID_Sollwert_Slot; #FB_SINA_PARA_S_Instance.Parameter := 2622; #FB_SINA_PARA_S_Instance.Index := 0; #FB_SINA_PARA_S_Instance.ValueWrite2 := #I_nMaxTorqueTravelToFixedStop; #nSetSatz0_ok := 0; #nSchrittketteParaSatz0 := 2; 2: // Auftrag starten #FB_SINA_PARA_S_Instance.Start := True; IF #FB_SINA_PARA_S_Instance.Busy AND NOT #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 3; END_IF; 3: // Auftrag fertig #FB_SINA_PARA_S_Instance.Start := True; IF NOT #FB_SINA_PARA_S_Instance.Busy AND #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 4; #FB_SINA_PARA_S_Instance.Start := False; END_IF; 4: // Rückmeldung auslesen #FB_SINA_PARA_S_Instance.ReadWrite := 0; //lesen #nSchrittketteParaSatz0 := 5; 5: // Rückmeldung auslesen starten #FB_SINA_PARA_S_Instance.Start := True; IF #FB_SINA_PARA_S_Instance.Busy AND NOT #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 6; END_IF; 6: // Auftrag fertig #FB_SINA_PARA_S_Instance.Start := True; IF NOT #FB_SINA_PARA_S_Instance.Busy AND #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 11; #FB_SINA_PARA_S_Instance.Start := False; END_IF; 7: //Korrekter Wert zurückgelesen? IF (#FB_SINA_PARA_S_Instance.ValueRead2 = #I_nMaxTorqueTravelToFixedStop) THEN #nSchrittketteParaSatz0 := 11; #nSetSatz0_ok := 1; ELSE #nSchrittketteParaSatz0 := 4; END_IF; 11: // Startwerte Position setzen IF #O_bTarget_forward THEN #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop; ELSE IF #O_bTarget_forward THEN #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop; ELSE #TorquePos := #SetPos; //Das ergibt ziemlich sicher einen Fehler, also nochmal testen und besser machen END_IF; END_IF; #FB_SINA_PARA_S_Instance.ReadWrite := 1; //schreiben #FB_SINA_PARA_S_Instance.AxisNo := #I_AxisNo_Starter; #FB_SINA_PARA_S_Instance.hardwareId := #I_HWID_Sollwert_Slot; #FB_SINA_PARA_S_Instance.Parameter := 2617; #FB_SINA_PARA_S_Instance.Index := 0; #FB_SINA_PARA_S_Instance.ValueWrite2 := #TorquePos; #nSchrittketteParaSatz0 := 12; 12: // Auftrag starten #FB_SINA_PARA_S_Instance.Start := True; IF #FB_SINA_PARA_S_Instance.Busy AND NOT #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 13; END_IF; 13: // Auftrag fertig #FB_SINA_PARA_S_Instance.Start := True; IF NOT #FB_SINA_PARA_S_Instance.Busy AND #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 14; #FB_SINA_PARA_S_Instance.Start := False; END_IF; 14: // Rückmeldung auslesen #FB_SINA_PARA_S_Instance.ReadWrite := 0; //lesen #nSchrittketteParaSatz0 := 15; 15: // Rückmeldung auslesen starten #FB_SINA_PARA_S_Instance.Start := True; IF #FB_SINA_PARA_S_Instance.Busy AND NOT #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 16; END_IF; 16: // Auftrag fertig #FB_SINA_PARA_S_Instance.Start := True; IF NOT #FB_SINA_PARA_S_Instance.Busy AND #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 21; #FB_SINA_PARA_S_Instance.Start := False; END_IF; 17: //Korrekter Wert zurückgelesen? IF (#FB_SINA_PARA_S_Instance.ValueRead2 = #TorquePos) THEN #nSchrittketteParaSatz0 := 21; #nSetSatz0_ok := 2; ELSE #nSchrittketteParaSatz0 := 14; END_IF; 21: // Startwerte Geschwindigkeit setzen #FB_SINA_PARA_S_Instance.ReadWrite := 1; //schreiben #FB_SINA_PARA_S_Instance.AxisNo := #I_AxisNo_Starter; #FB_SINA_PARA_S_Instance.hardwareId := #I_HWID_Sollwert_Slot; #FB_SINA_PARA_S_Instance.Parameter := 2618; #FB_SINA_PARA_S_Instance.Index := 0; #FB_SINA_PARA_S_Instance.ValueWrite2 := #SetVel * #I_Velocity_numerator / #I_Velocity_denominator; #nSchrittketteParaSatz0 := 22; 22: // Auftrag starten #FB_SINA_PARA_S_Instance.Start := True; IF #FB_SINA_PARA_S_Instance.Busy AND NOT #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 23; END_IF; 23: // Auftrag fertig #FB_SINA_PARA_S_Instance.Start := True; IF NOT #FB_SINA_PARA_S_Instance.Busy AND #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 24; #FB_SINA_PARA_S_Instance.Start := False; END_IF; 24: // Rückmeldung auslesen #FB_SINA_PARA_S_Instance.ReadWrite := 0; //lesen #nSchrittketteParaSatz0 := 25; 25: // Rückmeldung auslesen starten #FB_SINA_PARA_S_Instance.Start := True; IF #FB_SINA_PARA_S_Instance.Busy AND NOT #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 26; END_IF; 26: // Auftrag fertig #FB_SINA_PARA_S_Instance.Start := True; IF NOT #FB_SINA_PARA_S_Instance.Busy AND #FB_SINA_PARA_S_Instance.Done THEN #nSchrittketteParaSatz0 := 27; #FB_SINA_PARA_S_Instance.Start := False; END_IF; 27: //Korrekter Wert zurückgelese? IF (#FB_SINA_PARA_S_Instance.ValueRead2 = (#SetVel * #I_Velocity_numerator / #I_Velocity_denominator)) THEN #nSchrittketteParaSatz0 := 31; #nSetSatz0_ok := 3; ELSE #nSchrittketteParaSatz0 := 24; END_IF; 31: // Ende #nSchrittketteParaSatz0 := 0; #TravelToFixedStopLoad_ok := True; #TravelToFixedStopStart := True; ELSE // Statement section ELSE ; END_CASE; (* --- Aufruf Parametrierung Siemens -- *) #FB_SINA_PARA_S_Instance();
Im Beispiel werden 3 Parameter geschrieben und auch zurückgelesen und kontrolliert. Die Kontrolle kann man evtl. auch weglassen.
1. Moment (Das muß ich auch noch testen, ich weiß nicht genau, was der Servo damit macht, evtl. Klemmmoment???
2. Position die angefahren soll. Diese muß hinter dem Klemmpunkt liegen und zwar sogar noch vor dem Beginn der Bremsrampe, sonst Störung!
3. Geschwindigkeit
Das nur mal als Beispiel, falls du das variabel gestalten willst/mußt.
Zum Beginn kannst du auch erst einmal 2 Verfahrsätze anlegen, einen zum Öffnen, einen zum Schließen.
Im Mode 6 übergibst statt der Position die Nummer des Parametersatzes an den Baustein SinaPos.
Dann fährst du immer diese beiden Verfahrsätze.
Wenn du die Positionen ändern willst könntest du diesen einen Parameter jeweils vorher in der Servo senden (s. Beispiel oben)
Durch die Begrenzung des Momentes des Servos, kannst du einfach schließen und der klemmt dann mit dem als Begrenzung eingestellten Moment.
Ich bin noch am Testen, ob das im Verfahrsatz übergebene Moment das Klemmmoment ist, und dann genau vom Servo eingestellt wird, ich denke mal ja.
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen