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.
NC-Transformationsachse anlegen und initialisieren 1:
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:

Und mappen Sie folgende Variablen zusätzlich zwischen NC und PLC:

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).
NC-Transformationsachse anlegen und initialisieren 2:
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 die Cyclic() Methode in einer langsameren Task auf und initialisieren Sie die Standardparametrierung mittels der ParamInit() 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