Benutzerspezifische Transformationen

Neben den bereitgestellten Transformationen können auch eigene kinematische Transformationen als TwinCAT C++-Modul implementiert und eingebunden werden.

Einschränkungen

Vorbereitung

Vorab ist einmalig der Entwicklungsrechner für die Entwicklung von TwinCAT C++-Modulen einzurichten. Details hierzu sind in der TwinCAT C++-Dokumentation zu finden.

Entwicklung eines TwinCAT C++-Moduls für eine 2D-XC-Kinematik

Im Folgenden wird am Beispiel einer 2D-XC-Kinematik gezeigt, wie eine benutzerspezifische Kinematik erstellt wird. Die Kinematik setzt sich aus einer Linearachse (M1), auf die sich eine Rotationsachse (M2) mit einem Arm befindet, zusammen. Dabei soll die Armlänge einstellbar sein.

Benutzerspezifische Transformationen 1:

Hinweis

Online-Change

Ein Online-Change ist nur mit TwinCAT C++-Modulen vom Projekttyp „TwinCAT 3 Versioned C++ Project“ erlaubt. Andernfalls kann es auf C++-Seite zu Unstetigkeiten kommen.

Transformationsmodul in der XAE konfigurieren

Voraussetzung: Ein leeres TwinCAT-Projekt muss sich auf einem Entwicklungssystem befinden, welches für die TwinCAT C++-Entwicklung eingerichtet ist.
1. Fügen Sie ein TwinCAT C++-Projekt in das leere TwinCAT-Projekt ein.
Machen Sie dazu einen Rechtsklick auf den Teilbaum C++ > Add New Item…
Benutzerspezifische Transformationen 2:
2. Wählen Sie als Projekttyp TwinCAT Versioned C++ Project aus und vergeben Sie einen Namen. Bestätigen Sie die Auswahl mit dem Button Add.

Benutzerspezifische Transformationen 3:
3. Wählen Sie TwinCAT Module Class als Modultyp aus. Bestätigen Sie die Auswahl mit dem Button Add.
Benutzerspezifische Transformationen 4:
4. Benennen Sie im nächsten Schritt das Modul. Bestätigen Sie die Angaben mit dem Button OK.
Benutzerspezifische Transformationen 5:
Ein TwinCAT C++-Projekt mit Modul wurde angelegt.

Interfaces und Parameter hinzufügen

5. Öffnen Sie mit einem Doppelklick im Solution-Baum auf die tmc-Datei den TMC-Editor, um Interfaces und Parameter hinzufügen zu können.
Benutzerspezifische Transformationen 6:
6. Für eine benutzerspezifische Transformation wird das Interface ITcNcTrafo benötigt.
Öffnen Sie im TMC-Editor über Modules > <Module Name> > Implemented Interfaces > Add new interface (insert) den Choose data type…-Dialog.
7. Wählen Sie "ItcNcTrafo" aus und bestätigen Sie mit OK.

Benutzerspezifische Transformationen 7:

Auch benutzerspezifische Transformationen können Parameter besitzen, mit denen die Transformation konfiguriert werden kann. Bei der beispielhaften 2D-XC-Kinematik soll die Armlänge einstellbar sein.

Armlänge einstellen

8. Fügen Sie im TMC-Editor über Modules > <Module Name> > Parameters > Add new Parameter (Insert) einen neuen Parameter hinzu.
Benutzerspezifische Transformationen 8:
Mit einem Doppelklick auf den neuen Parameter kann dieser konfiguriert werden.
9. Konfigurieren Sie den Parameter für die einstellbare Armlänge wie folgt:
Benutzerspezifische Transformationen 9:
Nachdem die Änderungen an der tmc-Datei abgeschlossen sind, kann der TwinCAT-TMC-Code-Generator ausgeführt werden.

TwinCAT-TMC-Code-Generator ausführen

10. Gehen Sie über das Menü des TMC-Editors oder machen Sie einen Rechtsklick auf das C++-Projekt > TwinCAT TMC Code Generator im Solution-Baum.
Benutzerspezifische Transformationen 10:
11. Fügen Sie im Header <ProjectName>Interfaces.h den Header TcNcKinematicsInterfaces.h hinzu.
Benutzerspezifische Transformationen 11:
12. Die Funktionen Forward (Vorwärts), Backward (Rückwärts), TrafoSupported (UnterstützteTransformationen), GetDimensions (hole Dimensionen) wurden automatisch unter Source Files\<TrafoName>.cpp angelegt, beinhalten aber noch keine gültige Implementierung.
In der Funktion GetDimensions ist eine Überpüfung der Anzahl der ACS- und MCS-Achsen zu implementieren.
HRESULT CMyTrafo::GetDimensions(ULONG* pFwdInput, ULONG* pFwdOutput)
{
    HRESULT hr = S_OK;

    if (pFwdInput && pFwdOutput)
    {
        *pFwdInput = 2;
        *pFwdOutput = 2;
    }
    else
    {
        hr = E_POINTER; //pointer error
    }
    return hr;
}
13. TwinCAT ruft die Funktion GetDimensions bei der Aktivierung auf. Bei Bedarf können Sie weitere Überprüfungen, die beim Aktivieren erfolgen sollen, in die Funktion implementieren. Zum Beispiel die Überprüfung von benutzerspezifischen Lizenzdateien.
14. Beim Bauen der Kinematischen Gruppe (FB_KinConfigGroup) wird die Funktion TrafoSupported aufgerufen.
Zusätzlich ist es empfehlenswert, die Funktion auch in den Funktionen Forward und Backward aufzurufen.
In der Funktion sollten die Achsdimensionen und Parameterwerter auf Gültigkeit geprüft werden.
HRESULT CMyTrafo::TrafoSupported(TcNcTrafoParameter* p, bool fwd)
{
    HRESULT hr = S_OK;

    if (p)
    {
        if (fwd)
        {
            if (p->dim_i != 2 || p->dim_o != 2)
            {
                // kinematics transformation error: invalid dimension
                hr = MAKE_ADS_HRESULT(NCERR_KINTRAFO_INVALIDDIM);
            }
        }
        else
        {
            if (p->dim_i != 2 || p->dim_o != 2)
            {
                // kinematics transformation error: invalid dimension
                hr = MAKE_ADS_HRESULT(NCERR_KINTRAFO_INVALIDDIM);
            }
            if (p->i[1] > m_ArmLength)
            {
                // kinematics transformation error: invalid position
                hr = MAKE_ADS_HRESULT(NCERR_KINTRAFO_INVALIDAXISPOS);
            }
        }
    }
    else
    {
        hr = E_POINTER;
    }
    return hr;
}
15. Implementieren Sie in den Funktionen Forward und Backward die (Positions-)Transformationen.
Hierzu stehen die Parameter „o“ und „i“ zur Verfügung. Wobei „i“ immer die Eingangswerte sind und „o“ die Ausgangswerte, entsprechend gilt für die Forward Funktion:
o[0]    = Position of first MCS_axis
d_o[0]  = Velocity of first MCS_axis
dd_o[0] = Acceleration of first MCS_axis
i[0]    = Position of first ACS_axis
d_i[0]  = Velocity of first ACS_axis
dd_i[0] = Acceleration of first ACS_axis

Es ist nicht notwendig, die Transformationen für Geschwindigkeit und Beschleunigung zu implementieren.
Zu Beginn beider Funktionen sollte die Funktion TrafoSupported aufgerufen werden, um zu überprüfen, ob die Positionen gültig sind.

HRESULT CMyTrafo::Forward(TcNcTrafoParameter* p)
{
    HRESULT hr = TrafoSupported(p, true);
    if (SUCCEEDED(hr))
    {
        if (p->i && p->o)
    {
            p->o[0] = p->i[0] + m_ArmLength*cos_((p->i[1])*PI/180);
            p->o[1] = m_ArmLength * sin_((p->i[1])*PI / 180);
        }

        if (p->d_i && p->d_o)
        {
            p->d_o[0] = p->d_i[0];
            p->d_o[1] = p->d_i[1];
        }

        if (p->dd_i && p->dd_o)
        {
            p->dd_o[0] = p->dd_i[0];
            p->dd_o[1] = p->dd_i[1];
        }
    }

    return hr;
}
HRESULT CMyTrafo::Backward(TcNcTrafoParameter* p)
{
    HRESULT hr = TrafoSupported(p,false);

    if (p->i && p->o)
    {
        p->o[1] = asin_(p->i[1] / m_ArmLength) * 180 / PI;
        p->o[0] = (p->i[0] - (cos_(p->o[1] * PI / 180)*m_ArmLength));
    }

    if (p->d_i && p->d_o)
    {
        p->d_o[0] = p->d_i[0];
        p->d_o[1] = p->d_i[1];
    }

    if (p->dd_i && p->dd_o)
    {
        p->dd_o[0] = p->dd_i[0];
        p->dd_o[1] = p->dd_i[1];
    }

    return hr;
}

Erstellen- und Veröffentlichen der Module

16. Machen Sie einen Rechtsklick auf C++- > UserSpecificTrafo Project im Solution-Baum und wählen Sie TwinCAT Publish Modules aus.
Benutzerspezifische Transformationen 12:
17. Überprüfen Sie den Build-Output. Hier sollte keine Fehlermeldung enthalten sein.
Benutzerspezifische Transformationen 13:

NC/PTP konfigurieren

18. Erstellen Sie ein NC-Projekt im Teilbaum MOTION.
Benutzerspezifische Transformationen 14:
Benutzerspezifische Transformationen 15:
19. Legen Sie die benötigten PTP-Achsen an.
Benutzerspezifische Transformationen 16:
Benutzerspezifische Transformationen 17:

Transformation erstellen

20. Legen Sie zusätzlich einen NC-Channel (for Kinematik Transformation) im NC-Projekt an.
Benutzerspezifische Transformationen 18:
Benutzerspezifische Transformationen 19:
21. Fügen Sie die erstellte Transformation anschließend zur Group des Kinematik-Kanals hinzu.
Machen Sie dazu einen Rechtsklick auf die Group > Add Object(s)…
Benutzerspezifische Transformationen 20:
Es öffnet sich der Insert TcCom Object-Dialog.
22. Wählen Sie Ihr Transformationsmodul aus und bestätigen Sie Ihre Auswahl mit OK. Wenn Sie Ihr Modul nicht finden können, aktualisieren Sie die Ansicht über Reload.
Benutzerspezifische Transformationen 21:
23. Parametrieren Sie die Objektparameter entsprechend der verwendeten Kinematik.
Die XAE-Konfiguration ist abgeschlossen.
Benutzerspezifische Transformationen 22:
Die Transformation kann jetzt von der SPS aus aktiviert werden (siehe SPS-Bibliothek). Definieren Sie zum Ansprechen der Transformation ein zyklisches Kanalinterface in der SPS und verknüpfen Sie dieses mit den IO des Kinematikkanals.
in_stKinToPlc      AT %I*     : NCTOPLC_NCICHANNEL_REF;
out_stPlcToKin     AT %Q*     : PLCTONC_NCICHANNEL_REF;