NC-Transformationsachse anlegen und initialisieren
Zum Anlegen einer neuen NC-Transformationsachse sind mehrere Schritte notwendig. Im folgenden Beispiel wird ein exemplarisches Vorgehen dargestellt.
- 1. Legen Sie die drei Instanzen folgender Objekte an:
fbClampAxis (FB_AxisNcTrafoBase): TF8560 Achse (hier Transformation-NC)
fbClamp (FB_Clamp): Spezifisch implementierter Achstyp (hier Schließeinheit)
fbClampHmi (FB_ClampHmi): Parallele HMI-Schnittstelle des Achstyps (hier Schließeinheit).
{attribute 'qualified_only'}
VAR_GLOBAL
{attribute 'TcHmiSymbol.Hide'}
{attribute 'TcContextName':='MotionTask'}
fbClampAxis: FB_AxisNcTrafoBase('', Tc3_PlasticBaseAppStaticParams.cnMaxPtpPoints, Tc3_PlasticBaseAppStaticParams.cnNoOfTrafoPoints, 0, 0, 0);
{attribute 'TcHmiSymbol.Hide'}
fbClamp: FB_Clamp;
fbClampHmi: FB_ClampHmi;
END_VAR
- 2. Erstellen/Verknüpfen Sie zwei NC-Achsen im Projekt für die Antriebs- und Lastseite der angelegten Instanz der
fbClamp
Achse.
Wenn die TF8560 Achsen aus der PLC nicht in dem Auswahldialog erscheinen, wurde das Projekt nicht erstellt. Erst wenn das PLC-Projekt nach Anlegen der Instanz einmal erfolgreich erstellt wurde, werden die Instanzen im Mapping sichtbar. - 3. Stellen Sie auf der NC-Achse der Lastseite folgende Parametrierung ein:
- Axes > ClampLoad > Settings > Axis Type: = Standard
- Axes > ClampLoad > Enc > NC-Encoder > Type: = Encoder SSI
- Axes > ClampLoad > Enc > Parameter > Scaling Factor Numerator = 0.0001
- Axes > ClampLoad > Enc > Parameter > Scaling Factor Denominator = 1.0
- Axes > ClampLoad > Enc > Parameter > Position Bias = -1000.0
- Axes > ClampLoad > Enc > Parameter > Encoder Mode = POSVELOACC
Und mappen Sie folgende Variablen zusätzlich zwischen NC und PLC:
- Axes > ClampLoad > Enc.Inputs.In.nDataIn1 <--> GVL_Xyz.fbNcTrafoAxis.fbLocalNc.fbActuals.nDataIn1
- Axes > ClampLoad > Enc.Inputs.In.nState4 <--> GVL_Xyz.fbNcTrafoAxis.fbLocalNc.fbActuals.nState4
- 4. Es ist zu empfehlen, dass Sie für den Antriebssteuerungs-Anteil eine PLC-Task mit der gleichen Zykluszeit der NC (default 2 ms) anlegen (falls nicht schon eine Achse existiert).
- 5. Instanziieren Sie zusätzlich in ihrer Applikation einen Table Generator zum Erzeugen einer Transformationstabelle.
VAR
fbTableGen: FB_TableGeneratorClampStandard_1;
END_VAR
- 6. Weisen Sie in der PLC der spezifischen Achse eine TF8560 Achse zu.
Axes.fbClamp.SetAxisRef(Axes.fbClampAxis);
- 7. Weisen Sie in der PLC der spezifischen Achse den Table Generator zu.
Axes.fbClamp.Specific.Trafo.TableGenerator := fbTableGen;
- 8. Definieren Sie zur Nutzung der Transformationsfunktion die Geometrie der Mechanik. Im Falle der Schließeinheit wird in diesem Beispiel ein Standard-Klemmmechanismus parametriert.
Method DefineTable : HRESULT
// Assign geometries
fbTableGen.BaseDistance := 672.0; // [mm]
fbTableGen.DriveArm := 228.0; // [mm]
fbTableGen.LoadArm := 325.2; // [mm]
fbTableGen.ToolArm_1 := 602.52; // [mm]
fbTableGen.ToolArm_2 := 455.4; // [mm]
fbTableGen.ToolArm_3 := 114.0; // [mm]
fbTableGen.ToolArm_Angle := 216.0; // [mm]
fbTableGen.ToolOffset := 288.0; // [mm]
fbTableGen.DriveLowEnd := 0.0; // [°]
fbTableGen.DriveHighEnd := 180.0; // [°]
// calculate resulting point table
IF NOT fbTableGen.DefineTable() THEN
DefineTable:= F_HresultFailure(E_AdsErr.DEVICE_INVALIDPARM);
RETURN;
END_IF
// copy parameter to machine data file
fbTableGen.WriteToParamList();
// activates table in TF8560 axis
F_SucceededHr(Axes.fbClamp.Specific.Trafo.AssignTableToAxis(FALSE), DefineTable);
// copies table drive ends to nc-Softends
F_SucceededHr(Axes.fbClamp.Specific.Trafo.CopyTableDriveEnds(FALSE, FALSE), DefineTable);
- 9. Fügen Sie der Runtime die Achse hinzu.
Tasks.fbRuntime.Append(Axes.fbClamp, Axes.fbClampHmi);
Falls Sie nicht mit der FB_BaseRuntime arbeiten möchten, sind die folgenden weiteren Schritte notwendig:
- 10. Weisen Sie der spezifischen Achse die HMI Schnittstelle zu.
Axes.fbClamp.SetHMI(Axes.fbClampHmi);
- 11. Initialisieren Sie die Achse mit einem einmaligen Aufruf der
Init()
-Methode und überprüfen Sie die Rückgabewert.
IF NOT bInit THEN
bInit := TRUE;
Axes.fbClamp.SetAxisRef(Axes.fbClampAxis);
Axes.fbClamp.SetHMI(Axes.fbClampHmi);
hr := Axes.fbClamp.Init();
bInitFailed := FAILED(hr);
END_IF
- 12. Rufen Sie nach erfolgreicher Initialisierung die
CoreCyclic()
Methode der Achse mit einer schnellen Task auf.
IF NOT PRG_AxisApplication.bInitFailed THEN
Axes.fbClamp.CoreCyclic();
END_IF
- 13. Rufen Sie parallel zur
CoreCyclic()
Methode dieCyclic()
Methode in einer langsameren Task auf und initialisieren Sie die Standardparametrierung mittels derParamInit()
Methode.
VAR
bInit: BOOL;
bInitFailed: BOOL;
bParamInit: BOOL;
hr: HRESULT;
fbTableGen: FB_TableGeneratorClampStandard_1;
END_VAR
IF NOT bInit THEN
bInit := TRUE;
Axes.fbClamp.SetAxisRef(Axes.fbClampAxis);
Axes.fbClamp.Specific.Trafo.TableGenerator := fbTableGen;
Axes.fbClamp.SetHMI(Axes.fbClampHmi);
hr := Axes.fbClamp.Init();
bInitFailed := FAILED(hr);
ELSIF NOT bInitFailed THEN
IF NOT bParamInit THEN
hr := DefineTable();
bParamInit := SUCCEEDED(hr);
hr := Axes.fbClamp.ParamInit();
bParamInit := bParamInit AND SUCCEEDED(hr);
END_IF
Axes.fbClamp.Cyclic();
END_IF