Frage zu mcHOMING_RESTORE_POSITION mit remanenter Variable (AS 4.12, mapp Motion)

Hallo zusammen,

ich arbeite aktuell mit Automation Studio 4.12, einer X20CP0483 CPU und mapp Motion.

Das Homing mit mcHOMING_ABSOLUTE funktioniert bereits.
Nun möchte ich aber mcHOMING_RESTORE_POSITION nutzen, damit die Motorposition nach einem Neustart/Power Cycle erhalten bleibt.

Laut Doku soll dazu eine remanente Variable vom Typ McAcpAxRestorePosType angelegt werden, in der die Positionsdaten gespeichert werden. Diese Variable muss zwischen den Zyklen gespeichert und wieder eingelesen werden.

Meine Fragen:

  1. Wie deklariere und initialisiere ich korrekt eine remanente Variable in ST, sodass die Achsposition dauerhaft erhalten bleibt?

  2. Gibt es ein Minimalbeispiel in Structured Text, wie die remanente Variable angelegt wird und wie ich den Funktionsblock MC_BR_InitHome_AcpAx in Verbindung mit mcHOMING_RESTORE_POSITION verwende?


Rahmenbedingungen meiner Applikation:

  • Motor mit Single-Turn Encoder

  • Mechanik kann ca. 720° verfahren

  • Keine Endschalter vorhanden


Ich habe die Dokumentation bereits durchgesehen, hänge aber genau an dem Punkt, wie die remanente Variable erstellt und richtig verwendet wird.
Ein kleines Codebeispiel oder eine kurze Schritt-für-Schritt-Erklärung wäre super hilfreich.

Vielen Dank im Voraus für die Unterstützung!

Viele Grüße

Dominik

Hallo Dominik,

um eine Variable remanent zu deklarieren musst du den Haken “Retain” aktivieren.

du kannst dann z.B. mit dem FUB “MC_BR_InitHome_AcpAx” den Referenzmode einstellen.

Gruß

Stephan

Hallo Stephan,

Vielen Dank für deine Antwort!

Ich verwende bisher die Blöcke MpAxisBasic und MpAxisBasicParType.

Mein bisheriges Skript:

VAR
	MpAxisBasic_0 : MpAxisBasic;
	AxisParameters : MpAxisBasicParType;
	do_03 : BOOL := FALSE; (*
	McAxisReadParameters : MC_ReadParameter;
	*) (* Create variable to permanently store the motor position
	restorePosVar: McAcpAxRestorePosType; 
	restorePosVarAddress: UDINT;
	
	McAxisInitHome : MC_BR_InitHome_AcpAx; *)
	zero_drive_position : BOOL;
	Timer1 : TON;
	
	(* MC_BR_InitHome_AcpAx01 : MC_BR_InitHome_AcpAx; *)
	
END_VAR

(*
VAR RETAIN
	RestorePosition : ARRAY[0..2] OF McAcpAxRestorePosType;
END_VAR
*)
PROGRAM _INIT

	do_03 := TRUE; //Activate the enable pin on the drive
	MpAxisBasic_0.Enable := TRUE;
	AxisParameters.Position := 100.0;
	AxisParameters.Velocity := 40.0;
	AxisParameters.Acceleration := 50.0;
	AxisParameters.Deceleration := 50.0;
	AxisParameters.Homing.Mode := mcHOMING_ABSOLUTE;
	
	(* AxisParameters.Homing.Mode := mcHOMING_RESTORE_POSITION;
	AxisParameters.Homing.Options.RestorePositionVariableAddress := ADR(RestorePosition[0]); *)
	
END_PROGRAM

PROGRAM _CYCLIC
    
	AxisParameters.Position := d_mix_set / 100 * 720; // calculate set value for motor position according to set mixing chamber diameter
	d_mix_act := MpAxisBasic_0.Position / 720 * 100; // calculate act mixing chamber diameter in percent
	MpAxisBasic_0.MpLink     := ADR(gAxis_1);
	MpAxisBasic_0.Parameters := ADR(AxisParameters);
	MpAxisBasic_0();
	
	// MC_BR_InitHome_AcpAx01.Axis := ADR(gAxis_1);
	
	IF zero_drive_position = TRUE THEN
		Timer1(IN := TRUE, PT := T#100ms);
		AxisParameters.Homing.Mode := mcHOMING_DEFAULT;
		AxisParameters.Homing.Position := 0;
		MpAxisBasic_0.Home := TRUE;
		
		IF Timer1.Q AND MpAxisBasic_0.IsHomed = TRUE THEN
			Timer1(IN := FALSE, PT := T#100ms);
			MpAxisBasic_0.Home := FALSE;
			AxisParameters.Homing.Mode := mcHOMING_ABSOLUTE;
			zero_drive_position := FALSE;
		END_IF
		
	END_IF
	
END_PROGRAM

Könntest du mir vielleicht noch genauer erklären wie ich den Block MC_BR_InitHome_AcpAx verwenden muss?

Vielen Dank :slight_smile:

Dominik

Hallo Dominik,

wie oben beschrieben kannst den FUB “MC_BR_InitHome_AcpAx” mit den beschriebenen Einstellungen aufrufen und das Execute setzen. Damit wird dann der Referenzmodus eingestellt.

Danach setzt du dann beim MpAxisBasic den Home Eingang auf TRUE mit dem Mode “mcHOMING_INIT”. Es wird die letzte Position wieder hergestellt.

Da du nur ein Singleturn Geber hast funktioniert das wiederherstellen nur wenn der Geber keinen Überlauf hat. Du darfst also nur maximal eine Umdrehung verfahren ansonsten brauchst du einen Multiturn Geber.

Bei der Inbetriebnahme fährst du die Achse auf den gewünschten Nullpunkt und führst ein Homing “mcHOMING_DIRECT” durch.

Hallo Dominik,

ich habe ein paar kleine Ergänzungen zu den Antworten von Stephan.

Man kann die Variable für die Endlosposition auch in der Hardwarekonfiguration fix zuweisen und muss dann nicht MC_BR_InitHome_AcpAx aufrufen:

Im nicht referenzierten Zustand, d.h. spannungslos oder bevor MC_Home aufgerufen wurde, darf sich die Achse nicht weiter als 1/2 Geberzählbereich bewegen,
damit die Position richtig wiederhergestellt werden kann.

Wenn die Achse referenziert ist darf sie sich beliebig weit bewegen, auch mit einem Singleturn-Geber.

Vielen Dank @Martin.Schrott und @stephan.herbig für eure Antworten.

Leider ist es mir immer noch nicht klar wie ich den Baustein MC_BR_InitHome_AcpAx in Verbindung mit den andereren

Bausteinen einsetze.

Könnte ich mir vielleicht nochmal schritt für schritt erklären welche Werte ich für welche Parameter in welcher Reihenfolge

übergeben muss um das Homing so auszuführen, dass ich nach einem Powercylce des Systems, die Absolutposition des

Rotors wieder herstellen kann?

Ich bitte um Verständnis, ich bin noch relativ am Anfang meiner B&R Zeit ^^

Vielen Dank und Liebe Grüße,

Dominik