Ich denke, du brauchst dann eher "Fahren auf Festanschlag".
Das haben wir hier mal diskutiert:
S110 MDI-Betrieb Momenten-Begrenzung
Ich habe ebenfalls SinaPos genutzt, um auf Positionen zu fahren, dann aber eine Umschaltung eingebaut, um auf Festanschlag fahren zu können.
Dazu mußte ich aber einen Verfahrsatz nutzen und die Werte dazu habe ich vor Start berechnet und an den Servo übertragen.
Normalerweise tragt man beim Sinapos ja die Position an, wenn man aber einen Verfahrsatz fahren will, dann trägt man dort dir Verfahrsatznummer ein.
Code:
IF #TravelToFixedStopStart THEN
#Position := 0; //Bei FixStop Verfahrsatz 0 anwählen! Posiiton (SetPos) wird als Parameter in den Verfahrsatz geschrieben
ELSE
#Position := #SetPos;
END_IF;
Außerdem ist Modepos = 6 (beim Positionieren wäre er 1 oder 2)
Das Übertragen mache ich vor dem Start, also Start_Travel_to_Fixstop von außen, dann Parameter in einer Schrittkette übertragen, Mode anwählen, Position = 0 für Verfahrsatz 0 und Bewegung starten. Wichtig ist, dass man das Ziel der Bewegung bei "Travel_to_Fixstop" in das Werkstück hinein verlegt, also 10-20 mm weiter. Der Servo darf noch nicht in der Bremsphase auf sein Ziel sein, wenn der Festanschlag kommt, sonst bekommt man eine Störung.
Hier mal die Schrittkette für das Übertragen der Parameter. Das kann dir als Anhaltspunkt dienen. Das Bit "Travel_to_Fixstop", dass im MDI-Parametersatz existiert hat keine Wirkung gehabt, weiß nicht genau, wozu Siemens das mal vorgesehen hatte. Die Parameterübertragung ist rel. ausführlich, inkl. Rücklesen zur Kontrolle. Es geht sicher auch kürzer.
Code:
REGION Parameter_Verfahr-Satz0_Set
(* --- Schrittkette Verfahr-Satz 0 setzen und remanent im Servo abspeichern --- *)
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 := #TorqueTravelToFixedStop;
#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
AND NOT #FB_SINA_PARA_S_Instance.Error
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
AND NOT #FB_SINA_PARA_S_Instance.Error
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 = #TorqueTravelToFixedStop) THEN
#nSchrittketteParaSatz0 := 11;
#nSetSatz0_ok := 1;
ELSE
#nSchrittketteParaSatz0 := 4;
END_IF;
11: // Startwerte Position setzen
IF #O_bTargetForward THEN
#TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
ELSE
#TorquePos := #SetPos - #I_nPositionAdd_TravelToFixedStop;
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
AND NOT #FB_SINA_PARA_S_Instance.Error
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
AND NOT #FB_SINA_PARA_S_Instance.Error
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
AND NOT #FB_SINA_PARA_S_Instance.Error
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
AND NOT #FB_SINA_PARA_S_Instance.Error
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();
(* --- Timeout Parameter übertragen --- *)
#TON_ParameterTimeout(IN:=#CMD_SetAbsoulut
OR (#TravelToFixedStopLoad_Start AND
NOT #TravelToFixedStopLoad_ok),
PT:=t#10s);
END_REGION
Hoffe, das hilft dir ein wenig weiter.
PS: Wenn die Schraubtiefen und Momente konstant sind, könnte man auch einfach feste Verfahrsätze anlegen und damit auf Festanschlag fahren. Bei mir mußte das leider alles variabel sein und auch noch ein Messergebnis (Festanschlag erreicht) ermittelt werden.